Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Внедрение кода в чужой процесс [D6, WinXP]


Inch ©   (2004-12-26 20:17:00) 

Пытаюсь выполнить сабж с помощью способа описанного Рихтером - удаленных потоков. Ничерта не выходит. Может кто-нть дать пример (на дельфи!)? или помогите найти ошибку в ниже следующем коде.

-----------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
PathToDll:pchar;
mHandle,hProcess:THandle;
hThread,dwThread,PID,BytesWritten:DWORD;
_LoadLibraryA,pTarget: Pointer;
InjectInfo: TRemoteData;
begin

PathToDll:='d:\Coding\compiled\injdll.dll'+#0;
PID:=StrToInt(ePID.text);

if PID = GetCurrentProcessId then
begin MessageBox(0,'Да ты шутник однако!','!',mb_ok); exit;end;

hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
mHandle:=GetModuleHandle(nil);
_LoadLibraryA:=GetProcAddress(GetModuleHandle('kernel32.dll'),'LoadLibraryA');
if (hProcess = 0) then
                       begin
                            MessageBox(0,'Ошибка при попытке получения доступа к
процессу.','Капут',mb_iconerror);
                            exit;
                       end;
pTarget:=VirtualAllocEx(hProcess,nil,Length(PathToDll),MEM_COMMIT,PAGE_EXECUTE_READWRITE);
if pTarget = nil then MessageBox(0,'Ошибка при попытке выделения
памяти.','Ошибка',mb_iconerror);
WriteProcessMemory(hProcess, pTarget, @PathToDll, Length(PathToDll), BytesWritten);
hThread:=CreateRemoteThread(hProcess,nil, 0,_LoadLibraryA,pTarget,0,dwThread);
WaitForSingleObject(hThread, INFINITE);
MessageBox(0,'Все прошло как надо.','!',mb_iconinformation);

end;
-----------------------------------------------------------------

Вот dll'ка:

-----------------------------------------------------------------
library injdll;
uses
 windows;

procedure DLLMain(Reason: Integer);
begin
MessageBox(0,'DLL Loaded.','!',mb_iconinformation);
end;

begin
DLLProc:=@DLLMain;
end.
-----------------------------------------------------------------


n0name   (2004-12-27 09:54:00) [1]

А DllProc(REASON_ATTACH) кто делать будет?
Между begin и end в DLL.
Если не поможет - смотри рабочий исходник:

program dllinject_m2;

{$APPTYPE CONSOLE}

uses
 SysUtils,
 windows,
 shellapi,
 procs in 'procs.pas';

function InjectDllToTarget(dllName : string; TargetProcessID : DWORD ): boolean;
var
 LibName  : pointer;
 hProcess , ThreadHandle : Thandle;
 BytesWritten , TheadID : DWORD;
begin
result := false;

hProcess := OpenProcess( PROCESS_ALL_ACCESS, FALSE, TargetProcessID );
if (hProcess = 0) then exit;

 // alocate and write the dll name to the remote process
LibName := VirtualAllocEx(hProcess , 0, length(dllName) + 5  , MEM_COMMIT , PAGE_READWRITE) ;
if ( LibName <> nil) then
begin
   WriteProcessMemory(hProcess , LibName, pchar(dllName) , length(dllName) , BytesWritten );
end ;

ThreadHandle := CreateRemoteThread( hProcess , nil , 0,   GetProcAddress(LoadLibrary('kernel32.dll'), 'LoadLibraryA') , LibName ,0 , TheadID );
result := ThreadHandle <> 0;
WaitForSingleObject( ThreadHandle , INFINITE);  //wait for the thread to execute

// free the memory we allocated for the dll name
VirtualFreeEx( hProcess , LibName ,  0 , MEM_RELEASE);
CloseHandle(hProcess);
end;

var
  PID       : Dword;
  dll_to_inject : string;
begin

GetDebugPrivs; // give us debug privalages

dll_to_inject := 'F:\Source\Delphi\Examples\2HideMod2\Method 2\Lib.dll'; //just an example, it can be anything

{
 for the perous of this demo we will just inject into
 our own process but PID could be any process we want
}
 PID := GetCurrentProcessID();

if  InjectDllToTarget(dll_to_inject, PID)  then
  writeLn('Dll Injected' )
 else
   writeLn('Dll Inject failed');

writeLn('Press enter to exit');

ReadLn(dll_to_inject);
end.


Игорь Шевченко   (2004-12-27 00:40:00) [2]


> WriteProcessMemory(hProcess, pTarget, @PathToDll, Length(PathToDll),
> BytesWritten);


Как минимум, одна ошибка здесь. Лишний знак @.
Кроме того, большинство API-функций возвращает рузультат своего выполнения. Его тоже следует проверять.

С уважением,


Piter   (2004-12-26 23:05:00) [3]

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1100098886&n=5


Anton_K   (2004-12-26 20:38:00) [4]

А выделять память для PathToDll кто будет?


Наверх

Титульная страница Поиск, карта сайта Написать письмо