Главная страница
    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.071 c
14-1106310559
Чеширский_Кот
2005-01-21 15:29
2005.02.13
BitTorrent


14-1106392584
SergP.
2005-01-22 14:16
2005.02.13
Нужна фотография Ющенка


1-1106990305
ivane
2005-01-29 12:18
2005.02.13
Графика в TRichEdit


11-1090947892
Андрей
2004-07-27 21:04
2005.02.13
TKOLButton + TKOLAction = EAccessViolation at 00000000


4-1103695704
race1
2004-12-22 09:08
2005.02.13
DrawText





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский