сплайсинг мессаджбокса

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by realcoder, 11 Feb 2012.

  1. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    вот написал код для спайсинга апи в своем процессе:
    PHP:
    program Projec_t1;

    uses
      windows
    ,
      
    sysutils;

    type
    //msgbox=function (h:HWND; text:pchar; hdr:pchar; btn:UINT):bool;stdcall;
    jmp_far=record
    instr_push
    :byte;  //здесь будет код инструкции push
      
    arg:dword;         //аргумент push
      
    instr_ret:byte;    //здесь будет код инструкции ret
    end;


    var
    old:array[0..5of byte;
    adr:dword;
    jump:jmp_far;
    hlib:thandle;
    readed:dword;


    function 
    Intercept_MessageBoxA(hWnd:HWNDtext:pcharhdr:pcharutype:uint):bool;stdcall;
    var 
    writen:dword;
    str:pchar;
    begin
    WriteProcessMemory
    (GetCurrentProcess(),pointer(adr),
                         
    addr(old), 6writen);
      
    str:='ololo_spliced';

      
    //Вызываем оригинальную функцию
      
    asm
      push utype
      push str
      push text
      push hwnd
      call adr
      end
    ;

      
    //Снова заменяем  6 байт функции на команду перехода на нашу функцию
      
    WriteProcessMemory(GetCurrentProcess(),pointer(adr),@jump,6,writen);
      
    result:=TRUE;

    end;



    begin
    hlib
    :=GetModuleHandle('user32.dll');
    if 
    hlib=invalid_handle_value then hlib:=loadlibrary('user32.dll');
    adr:=dword(GetProcaddress(hlib,'MessageBoxA'));
    if 
    adr<=0 then begin Messagebox(0,'fail',nil,0); exit; end;
     
    jump.instr_push:=$68;
      
    jump.arg:=DWORD(@Intercept_MessageBoxA);
      
    jump.instr_ret:=$C3;
      
    ReadProcessMemoryGetCurrentProcess(),pointer(adr),  addr(old),6,readed);
      
    WriteProcessMemory(GetCurrentProcess(),pointer(adr),@jump,6,readed);


      
    MessageBox(0,'ololo','troll',0);

    end.
    почемуто когда доходит дело до вызова - вылетает
    stack overflow
    вроде все правильно... я и через прототип вызывал и через asm. нихера...
     
  2. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    все решил. проблема была во внутренем выравнивании структур: