Главная страница
    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.062 c
14-1106241672
Denis_
2005-01-20 20:21
2005.02.13
WIndows Xp ,NTFS


1-1106743509
Eyfel
2005-01-26 15:45
2005.02.13
ECO + Delphi 2005


14-1106509925
Чеширский_Кот
2005-01-23 22:52
2005.02.13
Является ли склонность к чему-либо признаком деградации?


1-1107175746
MakedoneZ
2005-01-31 15:49
2005.02.13
Соеденить Unit ы


1-1107178571
MemoryReader
2005-01-31 16:36
2005.02.13
MemoryStream





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