![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Внедрение кода в чужой процесс [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 кто будет?