Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.13;
Скачать: CL | DM;

Вниз

Внедрение кода в чужой процесс   Найти похожие ветки 

 
Inch ©   (2004-12-26 20:17) [0]

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

-----------------------------------------------------------------
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.
-----------------------------------------------------------------


 
Anton_K ©   (2004-12-26 20:38) [1]

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


 
Piter ©   (2004-12-26 23:05) [2]

http://delphimaster.net/view/4-1100098886/


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


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


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

С уважением,


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

А 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.



Страницы: 1 вся ветка

Текущий архив: 2005.02.13;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.03 c
1-1106934373
Юрий К
2005-01-28 20:46
2005.02.13
RichEdit и Unicode.


3-1105955534
Максим
2005-01-17 12:52
2005.02.13
FireBird и SQL запрос


6-1102072233
Vyacheslav
2004-12-03 14:10
2005.02.13
FTP&amp;indy Проблема при уничтожения FTPServer - a


14-1106346115
AlterEgo of WondeRu
2005-01-22 01:21
2005.02.13
Почему флудерные ветки такие рейтинговые?


1-1106753411
KLAUS
2005-01-26 18:30
2005.02.13
Help Tray