السلام عليكم
النقاش في الموضوع هذا تكرر كثيراً سواء في الفريق العربي او في منتديات أخرى عربية أو غيرها ...
هناك الكثير من الطرق التي تعتمد على النظام فان كان Win9x فالعملية سهلة وتزداد تعقيداً في NT family , من تلك الطرق عمل KeyboardHook ولكنها ليست ناجحة في WinXP وأظنها غير ناجحة أيضا في Win2K3 . وهناك طريقة استخدام Gina و ذكرت الطريقة في موضوع في هذا القسم ...
طريقة اخرى لا أعمل ان كان تم ذكرها مسبقاً :-
هذه طريقة ناجحة في WinNT/2K/XP/2K3 (شخصياً جربتها على XP وتمت العملية بنجاح) ..
شكراًً للأخ -المبدع- SadJackal لارشادي لوصلة الموضوع ..
الموضوع الأصلي بالصينية هنا :
http://blog.csdn.net/ly_liuyang/archive/20.../04/569798.aspx
كاتب المقال Liu Yang ..
الطريقة :
علينا بعمل DLL وإضافة الكود الآتي :
لمن لا يعلم كيفية عمل DLL الخيارت كثيرة :
-مراجعة Delphi Help
- احد الموضوعات القديمة لواحد من الشباب -عذراً نسيت اسمه , ربما Madi - .
library SASWinHook;
{
SASWinHook
copyrights by Liu Yang LYSoft http://lysoft.7u7.net 2006.1.1
usage: only need to inject this dll to WinLogon.exe
}
uses Windows, Messages;
{$R *.res}
var
FHandle: THandle;
OldAppProc: Pointer;
function HookProc(hHandle: THandle; uMsg: Cardinal;
wParam, lParam: Integer): LRESULT; stdcall;
var K, C: Word; // wndproc
begin
if uMsg = WM_HOTKEY then
begin
K := HIWORD(lParam);
C := LOWORD(lParam);
// press Ctrl + Alt + Del
if (C and VK_CONTROL<>0) and (C and VK_MENU <>0) and ( K = VK_DELETE)
then Exit; // disable Ctrl + Alt + Del
end;
Result := CallWindowProc(OldAppProc, hHandle,
uMsg, wParam, lParam);
end;
procedure EntryPointProc(Reason: Integer);
begin
case reason of
DLL_PROCESS_ATTACH:
begin // hook SAS window wndproc
FHandle := FindWindow('SAS window class', 'SAS window');
if not IsWindow(FHandle) then Exit; // is window found?
// save old wndproc
OldAppProc := Pointer(GetWindowLong(FHandle, GWL_WNDPROC));
// set new wndproc
SetWindowLong(FHandle, GWL_WNDPROC, Cardinal(@HookProc));
end;
DLL_PROCESS_DETACH:
begin
if FHandle > 0 then
begin // unhook
if Assigned(OldAppProc) then
SetWindowLong(FHandle, GWL_WNDPROC, LongInt(OldAppProc));
OldAppProc := nil;
end;
end;
end;
end;
begin
OldAppProc := nil;
FHandle := 0;
DllProc := @EntryPointProc;
EntryPointProc(DLL_PROCESS_ATTACH);
end.لاستخدام هذا الملف الطريقة كما ذكر صاحب المقال هي :
اقتباسusage: only need to inject this dll to WinLogon.exe
طبعاً صاحب المقال لم يذكر كيف يتم ذلك - وهذه عادة الكثيرين- لانه لا يريد ان يعطينا كل شئ جاهز ونحن نائمين في العسل ..
أظن الكثيرين يعلمون ان هناك عدة طرق لعمل dll injection .. انا كنت كتبت عنها قبل كم سنة ..
بامكاننا الرجوع لموضوع للأخ deltaziz هنا:
http://204.157.36.16/index.php?showtopic=82896
سنجد أكثر من طريقة ..
أيضا هناك ملف لـ MS-Rem وضع فيه dll injection .. اعتقد انه مرفق في احدى مشاركات deltaziz او Romanof
طبعاً من تلك الطرق سنجد طريقة تستخدم CreateRemoteThread ..
هذه الطريقة كنت وضعت مثال عنها في موضوع قديم Jan 14 2002, 01:59 AM (فيه اخطاء) نجده هنا
http://204.157.36.16/index.php?showtopic=7657&hl=inject
من ذلك المقال سنستفيد من الدالة injectmydll وهنا بامكاننا تمرير target process handle لها ... وبامكاننا تغيير ذلك بتمرير Process ID لتصبح الدالة بهذا الشكل
procedure injectmydll(dwRemoteProcessId:DWORD);//hParent : hwnd);
//dwRemoteProcessId: target process ID
//hParent : the handle of the process you want to inject dll into
var
hRemoteThread,hkernel32,{dwRemoteProcessId,}hRemoteProcess : integer;
cb,pcb : dword;
pfnStartAddr,pszLibFileName,pszLibFileRemote : pchar;
begin
cb :=256;
// Get processID of the target program
//GetWindowThreadProcessId(hParent,@dwRemoteProcessId);
//Get target process handle
hRemoteProcess :=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwRemoteProcessId);
//calculate required memory for DLL pathname
getmem(pszLibFileName,cb);
strcopy(pszLibFileName,pchar(ExtractFilePath(ParamStr(0))+'SASWinHook.dll'));
//Assign DLL file name buffer in the remote process memory address space
//more about virtualallocex go http: //msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/memman_8ptk.asp
pszLibFileRemote :=VirtualAllocEx(hRemoteProcess,NIL,cb,MEM_COMMIT,PAGE_READWRITE);
// copy DLL path name to the remote process memory
WriteProcessMemory(hRemoteProcess,pszLibFileRemote,pszLibFileName,cb,pcb);
Freemem(pszLibFileName);
//Get the address of LoadLibraryA function in kernel32.dll
hkernel32 :=GetModuleHandle('Kernel32.dll');
pfnStartAddr :=GetProcAddress(hkernel32,'LoadLibraryA');
//run the remote process thead ,
hRemoteThread :=CreateRemoteThread(hRemoteProcess,NIL,0,pfnStartAddr,pszLibFileRemote,0,pcb);
//waiting for the end of the thread
WaitForSingleObject(hRemoteThread,INFINITE);
TerminateThread(hRemoteThread,0);
end;طريقة معرفة handle or PId لـ winlogon متروكة للقارئ ...
لعمل dll injection لـ winlogon process قد نحتاج لـ SeDebugPrivilege ... ما المقصود ؟ متروك للقارئ ...
طبعاً يفضل عمل تغييرات في الكود بحيث تسمح لبرنامجك بامكانية ارجاع Ctrl+Alt+Del للعمل بشكل صحيح ... متروك للقارئ
* ملحوظة :
يرجى الإبقاء على حقوق الكاتب الأصلي Liu Yang ....
