اجراش کردم ولی دقیقا چیزی دستگیرم نشد.
قاعدتا" تا وقتی مفهوم درک نشه ، کد و اجرای اون اهمیت خاصی ندارند . برای درک عملکرد مطالب صفحه قبل رو بخونید صرفا" در مورد کد چند خطی توضیح میدم :
{
Process Injection by Inpy - Soul
inprise@gmail-dot-com
Greets to soul for giving me the imagebase idea.
}
program Project1;
{$IMAGEBASE $13140000}
uses
Windows;
//Injected entrypoint
function Main(dwEntryPoint: Pointer): longword; stdcall;
begin
{now we are in notepad}
LoadLibrary('kernel32.dll');
LoadLibrary('user32.dll');
MessageBox(0, 'Hello, now I am in the memory of another process!', 'Hijacked Process', 0);
MessageBox(0, 'Now we can do anything we want. :)', 'Hijacked Process', 0);
MessageBox(0, 'You can even delete the original exe and these message boxes will still be here.', 'Hijacked Process', 0);
MessageBox(0, 'See?', 'Hijacked Process', 0);
MessageBox(0, 'Told you.', 'Hijacked Process', 0);
MessageBox(0, 'Ok, bye.', 'Hijacked Process', 0);
MessageBox(0, 'Hails to Barnamenevis.org fellas ', 'Hijacked Process', 0);
MessageBox(0, 'I''ll close notepad for you ;)', 'Hijacked Process', 0);
ExitProcess(0);
Result := 0;
end;
//Injection
procedure Inject(ProcessHandle: longword; EntryPoint: pointer);
var
Module, NewModule: Pointer;
Size, BytesWritten, TID: longword;
begin
Module := Pointer(GetModuleHandle(nil));
Size := PImageOptionalHeader(Pointer(integer(M odule) + PImageDosHeader(Module)._lfanew + SizeOf(dword) + SizeOf(TImageFileHeader))).SizeOfI mage;
VirtualFreeEx(ProcessHandle, Module, 0, MEM_RELEASE);
NewModule := VirtualAllocEx(ProcessHandle, Module, Size, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(ProcessHandle, NewModule, Module, Size, BytesWritten);
CreateRemoteThread(ProcessHandle, nil, 0, EntryPoint, Module, 0, TID);
end;
var
ProcessHandle, PID: longword;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin
{lets make a new process}
CreateProcess(nil, 'notepad', nil, nil, False, 0, nil, nil, StartupInfo, ProcessInfo);
{give it some time to wake up}
Sleep(500);
{and hijack it!}
GetWindowThreadProcessId(FindWindow('Notep ad', nil), @PID);
ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
Inject(ProcessHandle, @Main);
CloseHandle(ProcessHandle);
{we have a copy of ourself running in notepad so we can exit}
end.
//go home kid :-)
- 1.تابع Main در بدنهء پروسهء قربانی اجرا میشه . نسخه اصلی کد با دریافت نقطه شروع خودش رو تنظیم میکنه لیکن انتشارش لزومی نداشت . بعد از ورود به کانتکست پروسه Notepad چند پیام نمایش داده میشه که نشاندهنده موفقیت آمیز بودن روند تزریق کد است
2. روتین Inject کد مورد نظر رو تزریق میکنه . به عنوان ورودی پروسه مورد نظر رو در نقش قربانی دریافت ، نقطه مناسب برای شروع کد تزریقی رو پیدا و با روشهای گفته شده در صفحه قبل فضای لازم برای ایجاد یک ریسمان راه دور رو به خودش اختصاص میده .
3. بدنهء اصلی برنامه ابتدا یک نسخه از Notepad به عنوان مثال میسازه ، شماره پروسه رو دریافت و به روتین Inject ارسال میکنه . این روتین ، تابع Main رو به فضای آدرسی Notepad کپی میکنه . حالا کد ِ در حال اجرا ارتباطی با برنامه ساخته شده توسط ما نداره و روی حافظه مختص به Notepad اجرا میشه .