View Full Version : سوال: مشکل در DLL injection
Nima NT
جمعه 15 بهمن 1389, 02:19 صبح
با سلام خدمت دوستان
بنده برای کاری نیاز دارم که یک DLL رو به پروسه explorer.exe تزریق کنم ، با استفاده از afxCodeHook این کار رو انجام میدم و DLL رو تزریق میکنم و کدهای مربوطه با موفقیت اجرا میشن ، ولی زمانی که داخل خود dll با استفاده از دستورات CurrentThread.Exit و امثاله اقدام به حذف DLL از پروسه مذکور میکنم عمل نمیکنه و حتما" باید یک بار پروسه رو از نو راه اندازی کنم تا DLL سرگردان از حافظه اون خارج بشه ، به نظر اساتید مشکل از چی میتونه باشه ؟ البته من این کار رو در ویندوز 7 انجام دادم ( نسخه 32 بیتی ).
راه حلی وجود داره ؟
متشکرم.
Nima NT
جمعه 15 بهمن 1389, 14:11 عصر
مشکلم حل شد گفتم بگم تا اگر کسی مشکل مشابهی داشت حل بشه.
استفاده از MadCodeHook 3 راه حل هستش.
lord_viper
شنبه 16 بهمن 1389, 09:25 صبح
شما باید از تابع FreeLibrary برای این کار استفاده کنید
Nima NT
شنبه 16 بهمن 1389, 12:54 عصر
فکر نمیکنم کار بکنه ، چون ماژولی که تزریق میشه آدرس فیزیکی روی هارد دیسک نداره و از یک Stream خوانده و تزریق شده ؛ مشکل اینجاست که پروسه تزریق کننده میتونه اون رو آزاد کنه ولی خود DLL که در پروسه هستش نمیتونه خودش رو آزاد کنه ولی باز این رو هم امتحان میکنم نتیجه رو اینجا اعلام میکنم.
ممنونم.
lord_viper
شنبه 16 بهمن 1389, 17:21 عصر
شما کافیه هندل ماژول مورد نظر رو بدین بهش تا اونو از حافظه خارج کنه
uses
;tlhelp32
procedure UninjectDll(dllname : String; PID : Integer);
var
hProc : Cardinal;
hSnap : Cardinal;
module : moduleEntry32;
modstring : String;
hModule : PByte;
hremThread : Cardinal;
begin
hSnap := CreateToolHelp32Snapshot(TH32CS_SNAPMODULE,PID);
module.dwSize := sizeof(MODULEENTRY32);
If Module32First(hSnap,module) = True then begin
While Module32Next(hSnap,module) do begin
If module.szModule = dllname Then begin
hModule := module.modBaseAddr;
end;
end;
end;
hProc := OPenProcess(PROCESS_ALL_ACCESS,false,PID);
CreateRemoteThread(hProc,nil,0,
GetProcAddress(GetModuleHandle('Kernel32.dll'), 'FreeLibrary')
,hModule,0,hremThread);
CloseHandle(hProc);
CloseHAndle(hSnap);
end;
Nima NT
شنبه 16 بهمن 1389, 17:38 عصر
من در ویندوز XP با استفاده متد CurrentThread.Terminate این کار رو انجام میدادم ولی متاسفانه تو ویندوز ویستا و 7 این کار عمل نمیکنه.
در مورد کدی هم که گذاشتید مشکل اینجاست که ما DLLName نداریم یعنی Dll ای که بنده اینجکت میکنم در لیست ماژولهای پروسه نشون داده نمیشه.
برای این چی کار میتونم بکنم ؟
lord_viper
یک شنبه 17 بهمن 1389, 11:33 صبح
ایا کدی نوشتین که اسم اون مازول رو حذف کنه؟
برای بدست اوردن اسم پروسه ها و مازولها توابع Api مختلفی وجود داره مثلا میتونین از NTQuerySystemInformation استفاده کنین
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.