Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.042 c
3-1105079633
Mefodiy
2005-01-07 09:33
2005.02.13
Ошибка при записи изменений в Oracle через dbExpress


14-1106408181
Artvz
2005-01-22 18:36
2005.02.13
Кто нибудь знает ресурс посвящённый алгоритмам и разработке


1-1107174788
DEM_s
2005-01-31 15:33
2005.02.13
Подскажите пожайлуста как засунуть avi в res файл?


3-1105613123
Stanislav
2005-01-13 13:45
2005.02.13
Аварийная остановка программы


14-1106380798
Лобастый
2005-01-22 10:59
2005.02.13
Пожелания





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский