عدة أسئلة حول عمل حاقن و ملف dll
#1
السلام عليكم ورحمة الله وبركاتة

قبل مدة ليست بالكثيرة وجدت برنامج عبارة عن DLL و EXE
وضيفة البرنامج : هاك للعبة ما ... ( يتعامل مع ذاكرة اللعبة .. )

الفكرة العامة له هي ان الملف exe هو الحاقن
والملف dll هو الهاك ..

بحيث يقوم الحقان بتحديد ملف اللعبة ثم يقوم بتحميلها لذاكرة مع حقن ملف dll بها


السؤال الاول ... ما هي الطريقة العامة لعمل مثل هذه الفكرة ؟

السؤال الثاني اي الدوال التي سأتعامل معها اثناء تحميل ملف تنفيذي إلى الذاكرة وحقنة ؟
Dll, PROCESS_ATTACH, CreateThread, CreateProcess ....etc


السؤال الثالث عندما أريـ د ان احصل على Handle نافذة ما استعمل Findwindow
لكن هنا في حالتي هذه سيكون الهاك عبارة عن ملف dll محقون في العملية التي أريـ د الحصول على الـ Handle
الخاص بها ... فهل احصل عليها بالطريقة المعتادة FindWindow أم بطريقة آخرى ؟


وشكراً لحسن القراءة
الرد
#2
إقتباس :السؤال الاول ... ما هي الطريقة العامة لعمل مثل هذه الفكرة ؟

السؤال الثاني اي الدوال التي سأتعامل معها اثناء تحميل ملف تنفيذي إلى الذاكرة وحقنة ؟
Dll, PROCESS_ATTACH, CreateThread, CreateProcess ....etc
سؤالين و الاجابة واحدة Big Grin
هده بعض الدوال التي يمكنك استخدامها
OpenProcess : للحصول على مقبض البروسس
VirtualAllocEx : تستخدم لعمل initializes للداكرة و تجهيزها
WriteProcessMemory : للكتابة في الداكرة
GetProcAddress : دالة شهيرة جدا .. Big Grin
CreateRemoteThread : تستخدم هده الدالة لانشاء ثريد يعمل في بروسس معين

مثال بسيط
PHP كود :
procedure InjectDll(PID: DWORD;  DLL: PChar);
var
  
BytesWritten, hProcess, hThread, TID: Cardinal;
  
Parameters: Pointer;
  
pThreadStartRoutine: Pointer;
begin
  hProcess 
:= OpenProcess(PROCESS_ALL_ACCESS,  False,  PID);
  
Parameters := VirtualAllocEx( hProcess, nil, Length(DLL)+1, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
  
WriteProcessMemory(hProcess,Parameters,Pointer(DLL  ),Length(DLL)+1,BytesWritten);
  
pThreadStartRoutine := GetProcAddress(GetModuleHandle('KERNEL32.DLL'), 'LoadLibraryA');
  
hThread := CreateRemoteThread(hProcess,  nil,  0,  pThreadStartRoutine,  Parameters,  0,  TID);
  
CloseHandle(hProcess);

end; 
يجب تمرير البرامتر PID "Process ID" و مسار المكتبة
يمكن الحصول على ال PID بعدة طرق من بينها عن طريق مقبض النافدة
PHP كود :
var pid : DWORD;
win :HWND;
begin
win
:=FindWindow('Notepad',0);
GetWindowThreadProcessId (win,pid);
InjectDll(pid,'C:\Users\ْX\Desktop\Dll\mdll.dll');

end; 
لقد قمت بحقن المكتبة mdll في النوتباد

mdll هي المكتبة التي تريد حقنها
PHP كود :
library mdll;

uses
  SysUtils
,
  
Windows,
  
Classes;

{
$R *.res}

begin
  MessageBox
(0,'Test',0,0);
end. 

إقتباس :السؤال الثالث عندما أريـ د ان احصل على Handle نافذة ما استعمل Findwindow
لكن هنا في حالتي هذه سيكون الهاك عبارة عن ملف dll محقون في العملية التي أريـ د الحصول على الـ Handle
الخاص بها ... فهل احصل عليها بالطريقة المعتادة FindWindow أم بطريقة آخرى ؟
تحصل عليه بالطريقة المعتادة .. ليس هناك أي اختلاف !!

و السلام عليكم Big Grin
الرد
#3
اهلاً استاذي SMP3 ... جزاك الله خير على الإجابة

الدالة CreateProcess لن استعملها ؟
لني أريـ د ان احقن ملف الـ dll قبل تنفيذ اي امر باللعة ...

الفكرة ( احدد مسار اللعبة ... ثم اضغط على Button فيتم فتح اللعبة من مسارها وحقن ملف الـ dll )

إقتباس :تحصل عليه بالطريقة المعتادة .. ليس هناك أي اختلاف !!

رأيت مثال سابقاً ... كان في Plugin لـ ollydbg وكانت هناك طريقة للحصول على الـ Handle الخاص بالعملية Olly بدون
الحاجة لإستعمال FindWindow او غيرها

شكراً مره اخرى
الرد
#4
لقد قمت مند فترة بعمل درس فلاشي يشرح تطبيق مبدأ ال Injection في كسر البرامج
لقد قمت بتطبيق نفس الفكرة التي تريدها حقن الدلل في البرنامج قبل تشغيله و الحصول على المقبض الخاص بالنافدة و اجراء التغييرات المناسبة ..
لقد اعتمدت على طريقتين :
الأولى الحقن المباشر بالتعديل على الضحية .. بالاستعانة ب Olly
الثانية : عن طريق برمجة حاقن
(حاول الاطلاع على كلتا الطريقتين)
Inject Dll Tut 1
Inject Dll Tut 2
الرد
#5
جزاك الله خير وجعله في موازين حسناتك ... استاذ SMP3 ... مثال جيد جداً

تبقى السؤال الآخير ... إن لم تخني الذاكرة كان شكله هكذا تقريباً
كود :
HwndWindow := ???????.Handle
بحيث يستطيع ملف الـ Dll الحصول على ال Handle الخاص بالبرنامج الذي تم حقنه بالـ dll
الرد
#6
almuhhnad كتب :يستطيع ملف الـ dll الحصول على ال handle الخاص بالبرنامج الذي تم حقنه بالـ dll
نعم :d .. هل نجحت الفكرة معك ؟
الرد
#7
إقتباس :هل نجحت الفكرة معك ؟

اي فكرة ؟ ... تقصد
إقتباس :الفكرة العامة له هي ان الملف exe هو الحاقن
والملف dll هو الهاك ..
نعم منطقياً Smile لكن لدي بعض المشاكل البسيطة ... والتي يوجد لها حلول
طيب دعك من
كود :
hwndwindow := ???????.handle
ال يوجد طريقة من معرفة مقبض العملية التي ساقوم بتحميلها بإستعمال CreateProcess
____
على فكرة انا مبتدى في امور الـ التعامل مع الذاكرة لذلك لا تدقق كثيراً Smile
( لدي احسااس غريب حيال آخر رد P: )
الرد
#8
كود :
ال يوجد طريقة من معرفة مقبض العملية التي ساقوم بتحميلها بإستعمال CreateProcess
أية عملية تقصد .. لم أفهمك !!
الرد
#9
العادة ان الحاقن يقوم بحقن ملف dll في عملية تعمل اثناء الحقن ....

لكن ما أريـ ده هو ان اعمل برنامج يقوم بأخذ المسار الملف التنفيذي ( ليس عملية بل مسار الملف التنفيذي )
ثم يقوم بتشغيل اللملف التنفيذي الموجود بالمسار ... وبعد تحميل الملف التنفيذي اقوم بحقن ملف Dll فيه
واضن اني استطيع فعل ذلك مع الدالة CreateProcess لكن لا أعلم طريقة التي سأتبعها

ما أريـ ده الآن كيف احصل على الـ Handle الخاص بالعملية التي سأقوم بحقنها بملف الـ dll ... هل استطيع ان احصل عليه
عند إستعمال الدالة CreateProcess ؟ ...
ام استطيع ان احصل على Handle العملية التي أريـ د ان احقنها عن طريق Function معين ؟

طبعاً اعررف انك لم تفهم جيداً @@"

--- هذه طريقة آخرى ربما تفهم منها Smile ---

يوجد لدي
TarGetProcess
MyProgram - Injection
MyDll - HackGame

أريـ د ان اجعل ( MyProgram ) يأخذ مسار ( TarGetProcess ) من المستخدم
وبعد ذلك يوقم بتشغيل ( TarGetProcess ) ثم يقوم بحقن ( MyDll ) من خلال إستعمال الدالة ( CreateProcess )

لدي سؤالين على ما سببق :
الاول : هل يمكنني تطبيق ما سبق ؟
السؤال الثاني : هل استطيع ان احصل على ( Handle ) الخاص بـ ( TarGetProcess ) اثناء إستعمالي لدالة ( CreateProcess ) ؟

إذا كان السؤال الاول جوابه ( غير ممكن ) هل توجد طريقة آخرى لعمل ذلك ؟

إذا كان السؤال الثاني جوابه ( لا تستطيع الحصول على Handle الخاص بـ TarGetProcess من خلا الدالة CcreateProcess )
هل توجد طريقة آخرى للحصول على الـ Handle الخاص بـ TarGetProcess بدون إستعمال الطرق الغير مضمونة مثل FindeWindow
إذا نعم ( أريـ د مثال بيسط ) بارك الله فيك ....
--- End ---

اعتقد الطريقة الثانية افضل من ناحية إصال الفكرة .. بما انك مبرمج ستفهمها سريعاً Smile
... واعتذر على عدم مقدرتي لإصال السؤال ففكري مشووش قليلاً @@"
وشكراً على صبرك معي
الرد
#10
نعم الطريقة الثانية أفضل .. فهمتك Big Grin
أولا أعتقد أنك تخلط بين المقبض ال Handle الخاص بالدالة CreateProcess و الدالة FindWindow
الدالة CreateProcess تستخدم للحصول على مقبض البروسس عن طريق PROCESS_INFORMATION.hProcess
أما الدالة FindWindow فهي تعيد مقبض للنافدة (الفورم أو الكونترول) و ليس البروسس
إقتباس :هل استطيع ان احصل عليه
عند إستعمال الدالة CreateProcess ؟ ...
نعم يمكنك بالشكل التالي :
PHP كود :
var
  
pi: TProcessInformation;
  
si: TStartupInfo;
  
ProcessHandle:THandle;
begin
  FillMemory
( @si,sizeof(si), 0 );
  
si.cb := sizeof(si);

 if 
CreateProcess(nil,PChar( 'Your Game Path.exe' ),
                
nil, nil, False,NORMAL_PRIORITY_CLASS,
                
nil, nil,si, pi )
 
then
  ProcessHandle
:= pi.hProcess ;//this is your process Handle
end; 
الطريقة الثانية هي عن طريق الحصول على مقبض النافدة بدون استعمال الدالة CreateProcess
PHP كود :
function GetProcessHandle(win:HWND):THandle;
var 
pid : DWORD;
begin
GetWindowThreadProcessId 
(win,pid);
Result := OpenProcess(PROCESS_ALL_ACCESS,FALSE ,pid );
end; 
بالنسبة للمثال فاطلع على المثال Inject Dll Tut 1
تجنب استخدام كلمة [COLOR="Navy"]عملية .. فقد دهب بالي الى Services[/COLOR]
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم