Прочитал на вашем сайте статью о иньекции процедуры в процесс (http://www.wasm.ru/article.php?article=apihook_2). Скажу сразу если делать все как там описано, все прекрасно работает. Но мне немножко это не подходит. Как описано там: Код (Text): //копируем данные в нужный нам процесс pInfo := InjectMemory(Process, @RemoteInfo, SizeOf(TRemoteInfo)); //копируем саму процедуру CodeAdr := InjectMemory(Process, @RemoteThread, dword(@RemoteThreadEnd) - вword(@RemoteThread)); Sleep(2000); //выполняем процедуру... CreateRemoteThread(Process, nil, 0, CodeAdr, pInfo, 0, TID); Все прекрасно, но как можно обойтись без копирования данных? И можно ли вообще, дело в том, что сделать иньекцию в процесс я могу только в самом начале, после того как процесс запускается в нем запускается защита в виде nProtect, и уже потом я не могу ничего записать, соответственно, процедура и данные остаются внутри и выполняются, но данные мне нужно менять. Так вот повторю вопрос, возможно ли сделать так чтобы не копировать данные во внедряемый процесс?
А если просто длл подгрузить? Соотв., там же и данные будут? Можно поподробнее про nProtect, а то не совсем понятно про что речь... Сорри. Уже изучаю..
Правильно ли я делаю? Код (Text): //структура данных для внедрения TRemoteInfo = record LoadLibrary: function(lpLibFileName: PChar): HMODULE; stdcall; GetProcAddress: function(hModule: HMODULE; lpProcName: LPCSTR): FARPROC; stdcall; Kernel32 : array[0..16] of Char; User32 : array[0..16] of Char; MessageBoxA : array[0..16] of Char; nExitThread : array[0..16] of Char; SendInput : array[0..16] of char; keybd_event : array[0..16] of char; ReadProcessMemory: array[0..20] of char; Text : array[0..16] of Char; Title : array[0..16] of Char; cchar : array[0..30] of char; cchar1 : array[0..30] of char; lstrcpyA :array [0..30] of char; bpo:pointer; proc:Cardinal; procc:cardinal; lbuff:pointer; BytesRead:Cardinal; end; Код (Text): //процедура, та что внедряется... procedure RemoteThread(RemoteInfo: pointer); stdcall; var MessageBox: function(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall; ExitThread: procedure(uExitCode: UINT); stdcall; SendInputs : function (cInputs:Cardinal; var pInputs:tagINPUT;cbSize:Cardinal):cardinal;stdcall; keybd_events : procedure (bVk:byte;bScan:byte;dwFlags:cardinal;dwExtraInfo:cardinal);stdcall; mReadProcessMemory: function (hProcess:Cardinal;const lpBaseAddress:Pointer;lpBuffer:Pointer;nSize:cardinal;var lpNumberOfBytesRead:Cardinal):BOOL; stdcall; mlstrcpy : function (str1:PAnsiChar;str2:PAnsiChar):PAnsiChar; begin with TRemoteInfo(RemoteInfo^) do begin @mlstrcpy := GetProcAddress(LoadLibrary(kernel32), lstrcpyA); @SendInputs := GetProcAddress(LoadLibrary(User32), SendInput); @MessageBox := GetProcAddress(LoadLibrary(User32), MessageBoxA); @ExitThread := GetProcAddress(LoadLibrary(Kernel32), nExitThread); @keybd_events:=GetProcAddress(LoadLibrary(User32), keybd_event); @mReadProcessMemory:=GetProcAddress(LoadLibrary(kernel32),ReadProcessMemory); //пытаюсь прочитать из моей программы (по адресу bpo:=@b см. ниже) но у меня ничего не выходит... if mReadProcessMemory(proc,bpo,lbuff,1,BytesRead) then MessageBox(0,Text,Title,0) else MessageBox(0,cchar,title,0); ExitThread(0); end; end; Код (Text): ... var b:byte; ... //обработчик. procedure TForm1.Button1Click(Sender: TObject); begin b:=$65; ZeroMemory(@StartInfo, SizeOf(TStartupInfo)); StartInfo.cb := SizeOf(TStartupInfo); with SeAttr do begin nLength:=sizeof(SeAttr); bInheritHandle:=true; lpSecurityDescriptor:=nil; end; //запускаем процесс CreateProcess(nil, 'notepad.exe', @SeAttr, @SeAttr, true, 0, nil, nil, StartInfo, ProcInfo); Process := ProcInfo.hProcess; lstrcpy(RemoteInfo.User32, 'user32.dll'); lstrcpy(RemoteInfo.Kernel32, 'kernel32.dll'); lstrcpy(RemoteInfo.MessageBoxA, 'MessageBoxA'); lstrcpy(RemoteInfo.nExitThread, 'ExitThread'); lstrcpy(RemoteInfo.ReadProcessMemory, 'ReadProcessMemory'); lstrcpy(RemoteInfo.Text, 'Data read!'); lstrcpy(RemoteInfo.Title, 'Injected Proc'); lstrcpy(RemoteInfo.keybd_event, 'keybd_event'); RemoteInfo.bpo:=@b;//запоминаю адрес глобальной переменной lstrcpy(RemoteInfo.cchar1, pchar(cardinal(@b))); RemoteInfo.proc:=GetCurrentProcess; lstrcpy(RemoteInfo.cchar, pchar(inttostr(b))); lstrcpy(RemoteInfo.lstrcpyA, 'lstrcpyA'); @RemoteInfo.LoadLibrary := GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA'); @RemoteInfo.GetProcAddress := GetProcAddress(GetModuleHandle('kernel32.dll'), 'GetProcAddress'); //копируем данные pInfo := InjectMemory(Process, @RemoteInfo, SizeOf(TRemoteInfo)); CodeAdr := InjectMemory(Process, @RemoteThread, dword(@RemoteThreadEnd) - dword(@RemoteThread)); form1.caption:=inttostr(GetCurrentProcessId); Sleep(2500); CreateRemoteThread(Process, nil, 0, CodeAdr, pInfo, 0, TID); end;