تقييم الموضوع :
  • 6 أصوات - بمعدل 3.5
  • 1
  • 2
  • 3
  • 4
  • 5
شرح شامل لل Trainer
#1
المشاركة الأصلية كتبت بواسطة MouradPr في 21-07-2008 الساعة 10:35 PM:
السلام عليكم ورحمة الله
أولا أتقدم بالشكر للصديق العزيز GM فلولاه ماكنت عرفت هذا المجال... Smile
ثانيا : ندخل الى الشرح
تعريف ال Trainer
Trainer هو بريمج يقوم بالتعديل على برنامج ما في الذاكرة شأنه شأن اللودر Loader لكنه يستغل لتحسين مستوى اللعب وإستعمال خاصية الألعاب كاملة دون الحاجة للإنتظار
الدوال المستعملة :
-CreateProcess
-ReadProcessMemory
-WriteProcessMemory
-CreateThread
-Sleep
-ExitProcess
شرح الدوال المذكروة :
إسم الدالة : CreateProcess
المكتبة      : Kernel32
الوظيفة     : هذه الدالة تقوم بتحمل ملف تنفيذي للذاكرة
البارمترات :
تحتاج هذه الدالة لعشر برمترات سأقوم بشرح ما نحتاج فقط بترتيبها
LPCTSTR lpApplicationName, إسم التطبيق ومساره
LPTSTR lpCommandLine,        لا نحتاجه سنعطيه القيمة 0
LPSECURITY_ATTRIBUTES lpProcessAttributes, لن نحتاجه سنعطيه القيمة 0
LPSECURITY_ATTRIBUTES lpThreadAttributes, لن نحتاجه سنعطيه القيمة 0
BOOL bInheritHandles, لن نحتاجه سنعطيه القيمة 0
DWORD dwCreationFlags ,  كنا نحتاجه في كتابة اللودر  لكن هذه المرة لن نحتاجه لأننا لن نحتاج لإيقاف البرنامج أو إتمامه Suspend & Resume
 LPVOID lpEnvironment, لن نحتاجه سنعطيه القيمة 0
LPCTSTR lpCurrentDirectory, لن نحتاجه سنعطيه القيمة 0
 LPSTARTUPINFO lpStartupInfo, لا أدري  كيف أشرحها لكنه عبارة عن متغير يشمل الحزمة  STARTUPINFO  ويحمل معلومات البرنامج بنيتها كالتالي :
[LEFT]typedef struct _STARTUPINFO { // si  
    DWORD   cb; 
    LPTSTR  lpReserved; 
    LPTSTR  lpDesktop; 
    LPTSTR  lpTitle; 
    DWORD   dwX; 
    DWORD   dwY; 
    DWORD   dwXSize; 
    DWORD   dwYSize; 
    DWORD   dwXCountChars; 
    DWORD   dwYCountChars; 
    DWORD   dwFillAttribute; 
    DWORD   dwFlags; 
    WORD    wShowWindow; 
    WORD    cbReserved2; 
    LPBYTE  lpReserved2; 
    HANDLE  hStdInput; 
    HANDLE  hStdOutput; 
    HANDLE  hStdError; 
} STARTUPINFO, *LPSTARTUPINFO[/LEFT]
LPPROCESS_INFORMATION lpProcessInformation , سنقوم يتعريف متغير يشملالحزمة PROCESS_INFORMATION  وهي حزمة تحمل معلومة التحميل في الذاكرة بنيتها كالتالي :
[LEFT]typedef struct _PROCESS_INFORMATION { // pi  
    HANDLE hProcess; 
    HANDLE hThread; 
    DWORD dwProcessId; 
    DWORD dwThreadId; 
} PROCESS_INFORMATION; 
[/LEFT]
إسم الدالة : ReadProcessMemory
المكتبة      : Kernel32
الوظيفة     : هذه الدالة تقوم بقراءة بيانات من عنوان معين
البارمترات :
تحتاج لخمس برمترات
HANDLE hProcess, مقبض الملف في الذاكرة ويتم الحصول عليه بالدالة CreateProcess وهو ضمن الحزمة PROCESS_INFORMATION
LPCVOID lpBaseAddress, العنوان الذي نريد قراءة المعلومات عنده وهو نفسه   VA = RVA + ImageBase
LPVOID lpBuffer, المتغير الذي سنحفظ فيه المعلومات التي ستقرأها
DWORD nSize, عدد البايتات التي نود قراءتها
LPDWORD lpNumberOfBytesRead , لن نحتاجه ستعطيه القيمة 0
إسم الدالة : WriteProcessMemory
المكتبة      : Kernel32
الوظيفة     : هذه الدالة بكتابة البيانات في عنوان معين
البارمترات :
تحتاج لخمس برمترات
HANDLE hProcess, مقبض الملف في الذاكرة ويتم الحصول عليه بالدالة CreateProcess وهو ضمن الحزمة PROCESS_INFORMATION
LPCVOID lpBaseAddress, العنوان الذي نريد قراءة المعلومات عنده وهو نفسه   VA = RVA + ImageBase
LPVOID lpBuffer, البيانات التي سنقوم بكتابتها في العنوان VA
DWORD nSize, حجم الباياتات
LPDWORD lpNumberOfBytesWritten , لن نحتاجه سنعطيه القيمة 0
إسم الدالة : CreateThread
المكتبة      : Kernel32
الوظيفة     : هذه الدالة تقوم بتنفيذ مقطع كود مستقل على البرنامج
البارمترات :
تحتاج لستة 6 برمترات
LPSECURITY_ATTRIBUTES lpThreadAttributes , لن نحتاجه سنعطيه القيمة 0
DWORD dwStackSize, لن نحتاجه أيضا سنعطيه القيمة 0
LPTHREAD_START_ROUTINE lpStartAddress, العنوان الذي يشمل الكود المراد تنفيذه في إستقلال عن البرنامج
LPVOID lpParameter, سنحتاجه فيما بعد وسأقوم بتعريفه في وقته
DWORD dwCreationFlags, لن نحاجه ستعطيه قيمة 0
LPDWORD lpThreadId , المتغير الذي سيحفظ مقبض الthread
إسم الدالة : Sleep
المكتبة      : Kernel32
الوظيفة     : هذه الدالة تقوم بإيقاف تقدم البرنامج للمدة التي تريدها
البارمترات :
تحتاج لبرامتر واحد
DWORD dwMilliseconds , مدة التوقف وهي وتحسب بالجزء من الألف للثانية
إسم الدالة : ExitProcess
المكتبة      : Kernel32
الوظيفة     : هذه الدالة تقوم بإيقاف تقدم البرنامج للمدة التي تريدها
البارمترات :
تحتاج لبرامتر واحد
UINT uExitCode , سنعطيه القيمة 0
الإستغلال:
أولا أحب أن أقول لكم لدي لعبتين على جهازي GTA و [email protected]@po التي قد إستعملها GM في درسه..

طريقة الحصول على العناوين : لن أشرحها لأنها أسهل شيء كما يمكنك مراجعة درس GM في ذلك
بعض العناوين المقتنصة من البرنامج :
نقط الحياة وعددها 3 عند العنوان : 0056BB04
النقط المحصل عليها تنطلق من الصفر عند العنوان : 0056BAFC
الدفاع كحد أقصى 3 عند العنوان : 0056BB20
النووي ينطلق من الصفر عند  العنوان : 0056BB08
الصواريخ : 0056BB24
ROKETS : 0056BB2C
FLAK CANNON : 0056BB30
LAZER : 0056BB28
THUND : 0056BB34
وأخيرا الكود :
طريقة الإستغلال الأولى:
الكود بالأسمبلي:
[LEFT].386
.model flat, stdcall  ;32 bit memory model
option casemap :none  ;case sensitive
[/LEFT]

لا تحتاج لشر كما أنه سبق شرحها في الكتاب وفي دورة تعلم الأسمبلي
[LEFT]include windows.inc
include kernel32.inc
include user32.inc
includelib user32.lib
includelib kernel32.lib
[/LEFT]
تضمين المكتبات لإستعمال الدوال المشروحة أعلاه
[LEFT]function proto[/LEFT]
الإجرائية التي سنقوم بعمل Thread لها
[LEFT].data
AppFile db "Heavy Weapon Deluxe.exe",0
ProcessInfo			PROCESS_INFORMATION<>
STARTUPInfo			STARTUPINFO<>
LIVE db 10,0
MAXED db 3,0
NUC db 99,0
.data?
ThreadID dword ?
[/LEFT]
[
CENTER]AppFile db "Heavy Weapon Deluxe.exe",0[/CENTER]
إسم التطبيق أو مساره إن كنت تريد تشغيل Trainer من أي مكان تريد
ProcessInfo PROCESS_INFORMATION<>
المتغير الذي يشمل معومات التحميل للذاكرة نحتاجه لأجل دالة CreateProcess
STARTUPInfo STARTUPINFO<>
شأنه شأن السابق وتم شرحه من قبل
LIVE db 99,0
نقط الحياة وقد قمت برفعها لأقصى حد يمكن أن تضيف h الى جانب 99 لرفع
MAXED db 3,0

متغير يحمل القيمة القيمة 3 وهي أقصى قيمة للدفاع والصواريخ و البرق و اللايزر و..
NUC db 99,0
متغير النووي لا تقلق فلن ينتهي أبدا ولو أن القيمة 99 فقط
[LEFT].code
start:
invoke CreateProcess,CTXT("Heavy Weapon Deluxe.exe"),0,0,0,0,0,0,0,addr STARTUPInfo,addr ProcessInfo	
invoke Sleep,12000
invoke CreateThread,0,0,offset function,0,0,addr ThreadID
[/LEFT]
في السطر الأول قمت بإستدعاء الدالة الدالةCreateProcess لتحميل الملف للذاكرة بالبرمترات المشروحة في الأعلى
السطر الثاني : قمت بتوقيف البرنامج لمدة 12 ثانية حتى تحمل اللعبة وتنطلق في اللع ثم..
السطر الثالث : قمت بإنشاء Thread للإجرائية function
[LEFT]function proc 
	
LoopInfini:
invoke WriteProcessMemory,ProcessInfo.hProcess,0056BB04h,addr LIVE,1,0
invoke WriteProcessMemory,ProcessInfo.hProcess,0056BB08h,addr NUC,1,0
invoke WriteProcessMemory,ProcessInfo.hProcess,0056BB20h,addr MAXED,1,0
invoke WriteProcessMemory,ProcessInfo.hProcess,0056BB24h,addr MAXED,1,0
invoke WriteProcessMemory,ProcessInfo.hProcess,0056BB2Ch,addr MAXED,1,0
invoke WriteProcessMemory,ProcessInfo.hProcess,0056BB30h,addr MAXED,1,0
invoke WriteProcessMemory,ProcessInfo.hProcess,0056BB28h,addr MAXED,1,0
invoke WriteProcessMemory,ProcessInfo.hProcess,0056BB34h,addr MAXED,1,0
cmp eax,0
jz exitTrainer
invoke Sleep,1000
jmp LoopInfini
exitTrainer:
invoke ExitProcess,0
ret
function endp 
end start[/LEFT]  

السطر الأول في الإجرائية function : وهو الكتابة في الذاكرة عند العنوان 0056BB04h عدد نقط الحياة
نفس الشي بالنسبة للسطر الثاني و الثالث و الراع و و الى السطر الثامن
أما السطر التاسع : cmp eax,0 فهو فقط للتأكد أن انه قد تم كتابة الباينات وإلا فإن البرنامج غير موجود
السطر العاشر : jz exitTrainer الإن تقال لexitTrainer إن لم يتم كتابة البيانات
السطر الحادي عشر : قمت بتوقيف البرنامج لكي لا ينق الجهاز والسبب سأذكره
السطر الثاني عشر : jmp LoopInfini فالإجرائية function عبارة عن حلقة لا نهائية لكي لا تنتهي أبدا الأسلحة ونقط الحياة
السطر الثالث عشر : بدون تعليق
السطر الرابع عشر : invoke ExitProcess,0 الخروج من البرنامج وليس اللعبة إن لم يتم كتابة البيانات عند العناوين المذكورة
===================================================================
الدرس غير منسق أرجوا من أحد أعضاء الإدارة تنسقه وشكرا له مسبقا ...    
ال Trainer في المرفقات : أرجوا تجربته والإستمتاع
سأقوم غذا بتتمة الدرس وسأضيف الكود ب C و Delphi  مع الشرح بإذن الله
لقد تعبت في كتابة الدرس لذلك أرجوا ألا تبخلوا بدعاء صالح في ظهر الغيب وليس في الموضوع
:*****:


الملفات المرفقة
.rar   Game_trainer.rar (الحجم : 2.5 KB / التحميلات : 28)
قطرة الماء تـثـقب الحجر.. لا بالعنف. لكن بتكرار المحاولة
أخي لن تنال العلم إلا بستة... ذكاء و حرص و اجتهاد و بلغة...و صحبة أستاذ و طول زمان
تم الشكر بواسطة: M!X0R , mribraqdbra
#2
تم التنسيق حسب رغبة الاخ مراد mdr


الملفات المرفقة
.rar   MouradPr.rar (الحجم : 90.09 KB / التحميلات : 26)
To avoid mistakes, you need to gain experience; To gain experience, you need to make mistakes
تم الشكر بواسطة: M!X0R , mribraqdbra


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


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