Иньекция процедуры в процесс.

Тема в разделе "WASM.BEGINNERS", создана пользователем Nefer, 26 сен 2007.

  1. Nefer

    Nefer New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    3
    Прочитал на вашем сайте статью о иньекции процедуры в процесс (http://www.wasm.ru/article.php?article=apihook_2). Скажу сразу если делать все как там описано, все прекрасно работает. Но мне немножко это не подходит.
    Как описано там:
    Код (Text):
    1. //копируем данные в нужный нам процесс
    2.  pInfo := InjectMemory(Process, @RemoteInfo, SizeOf(TRemoteInfo));
    3. //копируем саму процедуру
    4. CodeAdr := InjectMemory(Process, @RemoteThread, dword(@RemoteThreadEnd) - вword(@RemoteThread));
    5. Sleep(2000);
    6. //выполняем процедуру...
    7. CreateRemoteThread(Process, nil, 0, CodeAdr, pInfo, 0, TID);
    Все прекрасно, но как можно обойтись без копирования данных? И можно ли вообще, дело в том, что сделать иньекцию в процесс я могу только в самом начале, после того как процесс запускается в нем запускается защита в виде nProtect, и уже потом я не могу ничего записать, соответственно, процедура и данные остаются внутри и выполняются, но данные мне нужно менять.
    Так вот повторю вопрос, возможно ли сделать так чтобы не копировать данные во внедряемый процесс?
     
  2. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    разве что грузить драйвер и извращаться с каталогом страниц/переключением контекста
     
  3. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    А если просто длл подгрузить? Соотв., там же и данные будут? Можно поподробнее про nProtect, а то не совсем понятно про что речь...

    Сорри. Уже изучаю..
     
  4. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Nefer
    пусть твоя процедура сама читает данные периодически
     
  5. Nefer

    Nefer New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    3
    Правильно ли я делаю?
    Код (Text):
    1.  
    2. //структура данных для внедрения
    3. TRemoteInfo = record
    4.     LoadLibrary: function(lpLibFileName: PChar): HMODULE; stdcall;
    5.     GetProcAddress: function(hModule: HMODULE;
    6.                              lpProcName: LPCSTR): FARPROC; stdcall;
    7.     Kernel32    : array[0..16] of Char;
    8.     User32      : array[0..16] of Char;
    9.     MessageBoxA : array[0..16] of Char;
    10.     nExitThread : array[0..16] of Char;
    11.     SendInput       : array[0..16] of char;
    12.     keybd_event : array[0..16] of char;
    13.     ReadProcessMemory: array[0..20] of char;
    14.     Text        : array[0..16] of Char;
    15.     Title       : array[0..16] of Char;
    16.     cchar : array[0..30] of char;
    17.     cchar1 : array[0..30] of char;
    18.     lstrcpyA :array [0..30] of char;
    19.  
    20.     bpo:pointer;
    21.     proc:Cardinal;
    22.     procc:cardinal;
    23.     lbuff:pointer;
    24.     BytesRead:Cardinal;
    25.   end;
    Код (Text):
    1. //процедура, та что внедряется...
    2. procedure RemoteThread(RemoteInfo: pointer); stdcall;
    3. var
    4.  MessageBox: function(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;
    5.  ExitThread: procedure(uExitCode: UINT); stdcall;
    6.  SendInputs : function (cInputs:Cardinal; var pInputs:tagINPUT;cbSize:Cardinal):cardinal;stdcall;
    7.  keybd_events : procedure (bVk:byte;bScan:byte;dwFlags:cardinal;dwExtraInfo:cardinal);stdcall;
    8.  mReadProcessMemory: function (hProcess:Cardinal;const lpBaseAddress:Pointer;lpBuffer:Pointer;nSize:cardinal;var lpNumberOfBytesRead:Cardinal):BOOL; stdcall;
    9.  mlstrcpy : function (str1:PAnsiChar;str2:PAnsiChar):PAnsiChar;
    10. begin
    11.   with TRemoteInfo(RemoteInfo^) do
    12.   begin
    13.     @mlstrcpy := GetProcAddress(LoadLibrary(kernel32), lstrcpyA);
    14.     @SendInputs := GetProcAddress(LoadLibrary(User32), SendInput);
    15.     @MessageBox := GetProcAddress(LoadLibrary(User32), MessageBoxA);
    16.     @ExitThread := GetProcAddress(LoadLibrary(Kernel32), nExitThread);
    17.     @keybd_events:=GetProcAddress(LoadLibrary(User32), keybd_event);
    18.     @mReadProcessMemory:=GetProcAddress(LoadLibrary(kernel32),ReadProcessMemory);
    19. //пытаюсь прочитать из моей программы (по адресу bpo:=@b см. ниже) но у меня ничего не выходит...
    20.     if mReadProcessMemory(proc,bpo,lbuff,1,BytesRead) then
    21.       MessageBox(0,Text,Title,0)
    22.     else
    23.       MessageBox(0,cchar,title,0);
    24.     ExitThread(0);
    25.   end;
    26. end;
    Код (Text):
    1. ...
    2. var
    3.   b:byte;
    4. ...
    5. //обработчик.
    6.  
    7. procedure TForm1.Button1Click(Sender: TObject);
    8. begin
    9.  
    10.    b:=$65;
    11.   ZeroMemory(@StartInfo, SizeOf(TStartupInfo));
    12.  
    13.   StartInfo.cb := SizeOf(TStartupInfo);
    14.   with SeAttr do
    15.   begin
    16.     nLength:=sizeof(SeAttr);
    17.     bInheritHandle:=true;
    18.     lpSecurityDescriptor:=nil;
    19.   end;
    20.  
    21. //запускаем процесс
    22.   CreateProcess(nil, 'notepad.exe', @SeAttr, @SeAttr, true, 0,
    23.                 nil, nil, StartInfo, ProcInfo);
    24.   Process := ProcInfo.hProcess;
    25.  
    26.   lstrcpy(RemoteInfo.User32, 'user32.dll');
    27.   lstrcpy(RemoteInfo.Kernel32, 'kernel32.dll');
    28.   lstrcpy(RemoteInfo.MessageBoxA, 'MessageBoxA');
    29.   lstrcpy(RemoteInfo.nExitThread, 'ExitThread');
    30.   lstrcpy(RemoteInfo.ReadProcessMemory, 'ReadProcessMemory');
    31.   lstrcpy(RemoteInfo.Text, 'Data read!');
    32.   lstrcpy(RemoteInfo.Title, 'Injected Proc');
    33.   lstrcpy(RemoteInfo.keybd_event, 'keybd_event');
    34.   RemoteInfo.bpo:=@b;//запоминаю адрес глобальной переменной
    35.   lstrcpy(RemoteInfo.cchar1, pchar(cardinal(@b)));
    36.   RemoteInfo.proc:=GetCurrentProcess;
    37.   lstrcpy(RemoteInfo.cchar, pchar(inttostr(b)));
    38.   lstrcpy(RemoteInfo.lstrcpyA, 'lstrcpyA');
    39.  
    40.   @RemoteInfo.LoadLibrary    := GetProcAddress(GetModuleHandle('kernel32.dll'),
    41.                                                'LoadLibraryA');
    42.   @RemoteInfo.GetProcAddress := GetProcAddress(GetModuleHandle('kernel32.dll'),
    43.                                                'GetProcAddress');
    44.   //копируем данные
    45.   pInfo := InjectMemory(Process, @RemoteInfo, SizeOf(TRemoteInfo));
    46.  
    47.   CodeAdr := InjectMemory(Process, @RemoteThread, dword(@RemoteThreadEnd) - dword(@RemoteThread));
    48.   form1.caption:=inttostr(GetCurrentProcessId);
    49.   Sleep(2500);
    50.   CreateRemoteThread(Process, nil, 0, CodeAdr, pInfo, 0, TID);
    51. end;