проблема с CreateProcessW

Тема в разделе "WASM.WIN32", создана пользователем timofey, 22 янв 2006.

  1. timofey

    timofey New Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    4
    Доброго времени суток.



    У меня такая проблема: пытаюсь перехватить CreateProcessW сплайсингом и инжектировать

    свой код в созданный процесс.



    Делаю так:


    Код (Text):
    1.  
    2. type
    3.   OldCode = packed record
    4.     One : dword;
    5.     two : word;
    6.   end;
    7.  
    8.   far_jmp = packed record
    9.     PuhsOp  : byte;
    10.     PushArg : pointer;
    11.     RetOp   : byte;
    12.   end;
    13.  
    14.  
    15. var
    16.   JmpCpW : far_jmp;
    17.   OldCpW : OldCode;
    18.   PtrCpW : Pointer;
    19.  
    20.  
    21.  
    22. // исполнение оригинальной функции
    23. function TrueCreateProcessW(lpApplicationName: PWideChar;
    24.                             ...
    25.                             ...
    26.                             var lpProcessInformation: TProcessInformation): BOOL;
    27.                             stdcall;
    28. var
    29.   dwBytesWritten : DWORD;
    30. begin
    31.   WriteProcessMemory(INVALID_HANDLE_VALUE, PtrCpW, @OldCpW, SizeOf(OldCode),
    32.                      dwBytesWritten);
    33.  
    34.   Result := CreateProcessW(lpApplicationName, ... lpProcessInformation);
    35.  
    36.   WriteProcessMemory(INVALID_HANDLE_VALUE, PtrCpW, @JmpCpW, SizeOf(OldCode),
    37.                      dwBytesWritten);
    38. end;
    39.  
    40.  
    41.  
    42. // перехваченная функция
    43. function NewCreateProcessW(lpApplicationName: PWideChar;
    44.                            ...
    45.                            ...
    46.                            var lpProcessInformation: TProcessInformation): BOOL;
    47.                            stdcall;
    48. begin
    49.   Result := TrueCreateProcessW(lpApplicationName, ... lpProcessInformation);  
    50.  
    51.   Injection(@SetHook, lpProcessInformation.dwProcessId);
    52.  
    53. end;
    54.  
    55.  
    56.  
    57. // установка перехвата
    58. procedure SetHook;
    59. begin
    60.  
    61.   PtrCpW := GetProcAddress(GetModuleHandle('kernel32.dll'), 'CreateProcessW');
    62.   ReadProcessMemory(INVALID_HANDLE_VALUE, PtrCpW, @OldCpW, SizeOf(OldCode),
    63.                         dwBytesWritten);
    64.   JmpCpW.PuhsOp  := $68;
    65.   JmpCpW.PushArg := @NewCreateProcessW;
    66.   JmpCpW.RetOp   := $C3;
    67.  
    68.   WriteProcessMemory(INVALID_HANDLE_VALUE, PtrCpW, @JmpCpW, SizeOf(far_jmp),
    69.                          dwBytesWritten);
    70. end;
    71.  
    72.  
    73.  
    74. // инжектирование
    75. function Injection(EntryFunction: Pointer; dwPID: DWORD): bool; stdcall;
    76. var
    77.   za_module : Pointer;
    78.   za_mem    : Pointer;
    79.   za_handle : DWORD;
    80.   dwSize    : DWORD;
    81.   dwOldProt : DWORD;
    82.   dwBytes   : DWORD;
    83.   dwIndex   : DWORD;
    84.   dwBuff    : DWORD;
    85.   za_mbi    : MEMORY_BASIC_INFORMATION;
    86. begin
    87.   za_module := pointer(GetModuleHandle(nil));
    88.  
    89.   za_handle := OpenProcess(PROCESS_ALL_ACCESS, false, dwPID);
    90.   if za_handle = 0 then begin
    91.                           Result := false;
    92.                           Exit;
    93.                         end;
    94.  
    95.   VirtualFreeEx(za_handle, za_module, 0, MEM_RELEASE);
    96.  
    97.   dwSize := PImageOptionalHeader(pointer(integer(za_module) +
    98.                                  PImageDosHeader(za_module)._lfanew +
    99.                                  SizeOf(DWORD) +
    100.                                  SizeOf(TImageFileHeader))).SizeOfImage;
    101.  
    102.    za_mem := VirtualAllocEx(za_handle, za_module, dwSize, MEM_COMMIT or
    103.                             MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    104.    if za_mem = nil then begin
    105.                           Result := false;
    106.                           Exit;
    107.                         end;
    108.  
    109.   dwBuff := 0;
    110.   VirtualQueryEx(za_handle, za_mem, za_mbi, SizeOf(MEMORY_BASIC_INFORMATION));
    111.   while (za_mbi.Protect <> PAGE_NOACCESS) and (za_mbi.RegionSize <> 0) do
    112.     begin
    113.       if za_mbi.Protect <> PAGE_GUARD then
    114.         begin
    115.           for dwIndex := 0 to za_mbi.RegionSize do
    116.             begin
    117.               dwBuff := dwBuff + $1000;
    118.               VirtualProtectEx(za_handle, Pointer(Cardinal(za_mem) + dwBuff),
    119.                                $1000, PAGE_EXECUTE_READWRITE, dwOldProt);
    120.               WriteProcessMemory(za_handle, Pointer(Cardinal(za_mem) + dwBuff),
    121.                                  Pointer(Cardinal(za_mem) + dwBuff), $1000,
    122.                  dwBytes);
    123.             end;
    124.         end;
    125.       Cardinal(za_mem) := Cardinal(za_mem) + za_mbi.RegionSize;
    126.       VirtualQueryEx(za_handle, za_mem, za_mbi, SizeOf(MEMORY_BASIC_INFORMATION));
    127.     end;
    128.  
    129.   if CreateRemoteThread(za_handle, nil, 0, EntryFunction,
    130.                         za_module, 0, dwBytes) = 0 then begin
    131.                                                           Result := false;
    132.                                                           Exit;
    133.                                                         end;
    134.   CloseHandle(za_handle);
    135.   Result := true;
    136. end;
    137.  
    138.  




    В программе для примера инжектирую код в Explorer.exe




    Код (Text):
    1.  
    2.   Injection(@SetHook, GetPIDbyName('explorer.exe'));
    3.  




    В результате в explorer'e перехват осуществляется, а запускаемые через него приложения

    вообще не запускаются или все виснет.



    что я делаю неправильно? подскажите пожалуйста.

    Спасибо за внимание.
     
  2. asmasm

    asmasm New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2006
    Сообщения:
    69
    Адрес:
    Uzbekistan
    При входе в функцию TrueCreateProcessW в стеке будет находится:

    1)адресс возврата в CreateProcessW

    2)адресс в Explorer.exe

    3)парметры CreateProcessW.

    Поэтому тебе нужен такой прототип функции:

    function TrueCreateProcessW(addrCreateProcess: DWORD,

    lpApplicationName: PWideChar;

    ...

    ...

    var lpProcessInformation: TProcessInformation): BOOL;

    stdcall;

    т.е. парметры функции CreateProcessW будут начинаться со второго.
     
  3. timofey

    timofey New Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    4
    asmasm



    объясните пожалуйста подробнее.

    для чего нужна addrCreateProcess: DWORD? что в ней будет передаваться?
     
  4. asmasm

    asmasm New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2006
    Сообщения:
    69
    Адрес:
    Uzbekistan
    Нет,в этой функции вроде все в порядке, я ошибся.
     
  5. timofey

    timofey New Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    4
    asmasm

    а в чем же тогда ошибка? третий день уже мучаюсь... может быть есть какие-нибудь предложения?
     
  6. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    ошибка в способе применения отладчика
     
  7. psw1

    psw1 New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2006
    Сообщения:
    8
    Сколько раз вызывается SetHook для исходного процесса, в котором есть несколько вызовов CreateProcessW?
     
  8. asmasm

    asmasm New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2006
    Сообщения:
    69
    Адрес:
    Uzbekistan
    Надо смотреть под отладчиком, если выложишь в откомпилированном виде, то проблему можно быстро решить.
     
  9. timofey

    timofey New Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    4
    staier

    не подскажете, что именно я делаю не правильно?



    psw1

    не совсем понял ваш вопрос. сначала я инжектирую SetHook в explorer.exe. при создании нового процесса из explorer.exe в новый процесс тоже должна быть инжектирована SetHook. в explorer.exe инжект проходит без проблем, а в запускаемые из него процессы - нет...