19-10-2018, 10:48 PM
المشاركة الأصلية كتبت بواسطة MouradPr في 21-07-2008 الساعة 10:35 PM:
السلام عليكم ورحمة الله
أولا أتقدم بالشكر للصديق العزيز GM فلولاه ماكنت عرفت هذا المجال...
ثانيا : ندخل الى الشرح
تعريف ال Trainer
Trainer هو بريمج يقوم بالتعديل على برنامج ما في الذاكرة شأنه شأن اللودر Loader لكنه يستغل لتحسين مستوى اللعب وإستعمال خاصية الألعاب كاملة دون الحاجة للإنتظار
الدوال المستعملة :
شرح الدوال المذكروة :
إسم الدالة : 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 ويحمل معلومات البرنامج بنيتها كالتالي :
المكتبة : 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 و He@vyWe@po التي قد إستعملها GM في درسه..
طريقة الحصول على العناوين : لن أشرحها لأنها أسهل شيء كما يمكنك مراجعة درس GM في ذلك
بعض العناوين المقتنصة من البرنامج :
نقط الحياة وعددها 3 عند العنوان : 0056BB04
النقط المحصل عليها تنطلق من الصفر عند العنوان : 0056BAFC
الدفاع كحد أقصى 3 عند العنوان : 0056BB20
النووي ينطلق من الصفر عند العنوان : 0056BB08
الصواريخ : 0056BB24
ROKETS : 0056BB2C
FLAK CANNON : 0056BB30
LAZER : 0056BB28
THUND : 0056BB34
وأخيرا الكود :
طريقة الإستغلال الأولى:
الكود بالأسمبلي:
لا تحتاج لشر كما أنه سبق شرحها في الكتاب وفي دورة تعلم الأسمبلي
متغير يحمل القيمة القيمة 3 وهي أقصى قيمة للدفاع والصواريخ و البرق و اللايزر و..
السطر الثاني : قمت بتوقيف البرنامج لمدة 12 ثانية حتى تحمل اللعبة وتنطلق في اللع ثم..
السطر الثالث : قمت بإنشاء Thread للإجرائية function
السطر الأول في الإجرائية function : وهو الكتابة في الذاكرة عند العنوان 0056BB04h عدد نقط الحياة
نفس الشي بالنسبة للسطر الثاني و الثالث و الراع و و الى السطر الثامن
أما السطر التاسع : cmp eax,0 فهو فقط للتأكد أن انه قد تم كتابة الباينات وإلا فإن البرنامج غير موجود
السطر العاشر : jz exitTrainer الإن تقال لexitTrainer إن لم يتم كتابة البيانات
السطر الحادي عشر : قمت بتوقيف البرنامج لكي لا ينق الجهاز والسبب سأذكره
السطر الثاني عشر : jmp LoopInfini فالإجرائية function عبارة عن حلقة لا نهائية لكي لا تنتهي أبدا الأسلحة ونقط الحياة
السطر الثالث عشر : بدون تعليق
السطر الرابع عشر : invoke ExitProcess,0 الخروج من البرنامج وليس اللعبة إن لم يتم كتابة البيانات عند العناوين المذكورة
===================================================================
الدرس غير منسق أرجوا من أحد أعضاء الإدارة تنسقه وشكرا له مسبقا ...
ال Trainer في المرفقات : أرجوا تجربته والإستمتاع
سأقوم غذا بتتمة الدرس وسأضيف الكود ب C و Delphi مع الشرح بإذن الله
لقد تعبت في كتابة الدرس لذلك أرجوا ألا تبخلوا بدعاء صالح في ظهر الغيب وليس في الموضوع
:*****:
السلام عليكم ورحمة الله
أولا أتقدم بالشكر للصديق العزيز GM فلولاه ماكنت عرفت هذا المجال...
ثانيا : ندخل الى الشرح
تعريف ال 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 و He@vyWe@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<>
المتغير الذي يشمل معومات التحميل للذاكرة نحتاجه لأجل دالة CreateProcessSTARTUPInfo 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 مع الشرح بإذن الله
لقد تعبت في كتابة الدرس لذلك أرجوا ألا تبخلوا بدعاء صالح في ظهر الغيب وليس في الموضوع
:*****: