السلام عليكم ورحمة الله وبركاته
عندي سؤال واحتاج مساعدة منكم الله ينوركم
اريد عمل برنامج صغير هدفه يقرأ قيم الرجستر مثل EAX , EBX , ECX , EDX... في البرنامج
البارامترات : العنوان مثل : 00434262 و اسم البرنامج او مساره
لو حبد اعمله في ال C# او Delphi
وشكرا لم في انتظار ردكم الحار
شكرا اخي
[b]GamingMaster[/b] لكن الموضوع فيه اقتناص السريال وامور كثيرة
باختصار مارايده هو قراءة قيم المسجلات لا اكثر , في الموضوع وضعو التعديل على ال Flag ZF
لكن لم يقرأ قيمة احد المسجلات
الفكرة اذا فهمتها بشكل عام يمكنك توظيفها حسب رغبتك.
المسجلات موجودة في الـ context structure يمكنك قراءتها او الكتابة عليها :
if (context->Eip == 0x00403ff4)
{
// grab the good serial ;)
ReadProcessMemory(pinfo.hProcess, (PVOID)context->Edx, lpSerial, size, 0);
};
وعليكم السلام
في ويندوز الدوال GetThreadContext / SetThreadContext يمكنهما الاطلاع على قيم المسجلات للـ process
بالنسبة لـ
إقتباس :لو حبد اعمله في ال C# او Delphi
انا مبتدأ بالبرمجة
ولكني بحثت لك عن اكواد ربما تفيدك
بالنسبة للدلفي فالكود الخاص بالمنقح cheat-engine يعتبر كنز عظيم وفية ما لذ وطاب
https://github.com/cheat-engine/cheat-engine/search?q=GetThreadContext+SetThreadContext&unscoped_q=GetThreadContext+SetThreadContext
و عليكم السلام و رحمة الله
تقريبا نفس المثال بدلفي:
https://www.at4re.net/f/thread-268.html
شكرا لكم احبتي , سأحاول عمل البرنامج بالدلفي لقراءة قيم الرجسترات , المشكل ان في كلا الاقتراحين امور كثيرة ولست مبرمج دلفي بقدر انا متخصص في ال C# واخواتها Cpp و C . وان شاء الله يكون على C# لقراءة كافة الرجسترات
الان قمت بفكرة افضل وهي عمل اخر مشابه ب C++ يقرأ قيمة العنوان وبه وصلت لما اريد بمقارنة عنوانين ولكن تحتاج لعمل خدعة على ملف exe ليصل الى المكان المطلوب فقط , وهي عمل INT أمام العنوان الموالي ليتوقف البرنامج لاني لم اقم بعمل نقاط توقف بالبرنامج في السورس
السورس
#include <iostream>
#include <windows.h>
#include <string>
#include<cstdlib>
#include<ctime>
using namespace std;
int main() {
int value;
DWORD address = 0x0000C400;
HWND hWnd = FindWindowA(0,"TargetName");
DWORD pId;
srand(time(0));
if (hWnd == 0) {
printf("connot find Api pleaser contact ");
Sleep(1000);
}else {
GetWindowThreadProcessId(hWnd, &pId);
HANDLE hProcess = OpenProcess(PROCESS_VM_READ,FALSE, pId);
if (!hProcess) {
printf("Connot OI Process");
Sleep(1000);
} else {
ReadProcessMemory(hProcess, (LPVOID)address, &value, sizeof(value), 0);
CloseHandle(hProcess);
cout << value << endl;
system("Pause");
}
}
}
بنفس المثال نقوم بعمل hardware breakpoint على عنوان وعندما يتوقف سير البرنامج عند نقطة التوقف نقوم بقراءة الcontext
من فضلك اخي
[b]GamingMaster[/b] هل يمكنك تعديل السورس بحيث يقرأ أحد المسجلات EDX او EBX مع وضع نقطة التوقف على العنوان الدي يليه او نفس العنوان
جزاك الله خيرا اخي
بعد البحث وعمل research عن الموضوع وجدت ان الفكرة ليست جديدة فـ Mario Vilas برمج سكربت بايثون لمنقحة winappdbg يقوم بنفس الامر
إقتباس :dumping code, stack and registers
https://winappdbg.readthedocs.io/en/latest/_downloads/04_dump.py
وكذلك Justin Seitz برمج منقح بايثون صغير وقام ببرمجة سكربت يقوم بنفس الامر في كتابة Gray Hat Python في الشابتر الثالث وشرح الامر كذلك بالتفصيل.
https://nostarch.com/download/ghpython_src.zip
ولكن كلا السكربتان لا يعملان مع ويندوز x64 فهما خاصان بـ 32 بت فقط لذلك قررت تعديل السكربت الثاني (بما انه لا يحتاج تنصيب مكتبات ويعتمد على نفسة)، اكملت جزء من التعديل ولكن واجهتني مشكلة وعند شروعي بالبحث لحلها وجدت ان شخص قد سبقني وقام بتعديل السكربت.
https://crattack.tistory.com/entry/python-thread-context-%EB%B3%B4%EA%B8%B0win7-64bit
لقد قمت بنسخ السكربت المعدل وتعديل التنسيق في المحرر وتجربته وهذه كانت النتيجة على windows 10 pro x64
E:\pytest>python loader.py
Enter The PID of the process to attach to : 6256
[*] Select PID 6256
[*] OpenProcess Handle : 512
[*] self.h_process : 512
[*] Enumerate Thread inside
[*] Dumping registers for Thread ID: 0x00002608
[*] RIP : 0x0000000000000001
[*] RSP : 0x00000000013ef4f0
[*] RBP : 0x00000000013ef280
[*] RAX : 0x000000005e340000
[*] RBX : 0x00000000013ef3b0
[*] RCX : 0x000000000362d560
[*] RDX : 0x000000000362d3e8
[*] End DUMP
[*] Dumping registers for Thread ID: 0x0000230c
[*] RIP : 0x0000000000000001
[*] RSP : 0x00000000013ef4f0
[*] RBP : 0x00000000013ef280
[*] RAX : 0x000000005e340000
[*] RBX : 0x00000000013ef3b0
[*] RCX : 0x00000000013ef2f0
[*] RDX : 0x00009f1917c72eb1
[*] End DUMP
[*] Dumping registers for Thread ID: 0x00000a78
[*] RIP : 0x0000000000000001
[*] RSP : 0x00000000013ef4f0
[*] RBP : 0x00000000013ef280
[*] RAX : 0x000000005e340000
[*] RBX : 0x00000000013ef3b0
[*] RCX : 0x00000000013ef2f0
[*] RDX : 0x00009f1917c72eb1
[*] End DUMP
[*] Dumping registers for Thread ID: 0x00001a58
[*] RIP : 0x0000000000000001
[*] RSP : 0x00000000013ef4f0
[*] RBP : 0x00000000013ef280
[*] RAX : 0x000000005e340000
[*] RBX : 0x00000000013ef3b0
[*] RCX : 0x00000000013ef2f0
[*] RDX : 0x00009f1917c72eb1
[*] End DUMP
[*] Dumping registers for Thread ID: 0x00000c1c
[*] RIP : 0x0000000000000001
[*] RSP : 0x00000000013ef4f0
[*] RBP : 0x00000000013ef280
[*] RAX : 0x000000005e340000
[*] RBX : 0x00000000013ef3b0
[*] RCX : 0x00000000013ef2f0
[*] RDX : 0x00009f1917c72eb1
[*] End DUMP
[*] Dumping registers for Thread ID: 0x000023e4
[*] RIP : 0x0000000000000001
[*] RSP : 0x00000000013ef4f0
[*] RBP : 0x00000000013ef280
[*] RAX : 0x000000005e340000
[*] RBX : 0x00000000013ef3b0
[*] RCX : 0x00000000013ef2f0
[*] RDX : 0x00009f1917c72eb1
[*] End DUMP
[*] Dumping registers for Thread ID: 0x00000994
[*] RIP : 0x0000000000000001
[*] RSP : 0x00000000013ef4f0
[*] RBP : 0x00000000013ef280
[*] RAX : 0x000000005e340000
[*] RBX : 0x00000000013ef3b0
[*] RCX : 0x00000000013ef2f0
[*] RDX : 0x00009f1917c72eb1
[*] End DUMP
[*] Dumping registers for Thread ID: 0x00001688
[*] RIP : 0x0000000000000001
[*] RSP : 0x00000000013ef4f0
[*] RBP : 0x00000000013ef280
[*] RAX : 0x000000005e340000
[*] RBX : 0x00000000013ef3b0
[*] RCX : 0x00000000013ef2f0
[*] RDX : 0x00009f1917c72eb1
[*] End DUMP
[*] finished debugging. Exiting...
E:\pytest>
السكربت سيطلب منك فقط الـ PID للـ process الذي تريده
كلمة السر
www.at4re.net
[
attachment=752]
كذلك لغة بايثون تسهل لك الامر بخصوص اضافة اشياء جديدة للسكربت
ولكن سيكون من الجميل لو تم برمجة كود بـ c او ++c في حال تطلب الامر سرعة او تطوير اداة خاصة