- أخي hanipino , الدالة عبارة عن Loader أي أنها تقوم بتحميل sExecutableFilePath الى الذاكرة بواسطة CreateProcess .
الهدف منها تغير Byte من البرنامج المحمل (أي عمل Patching) بواسطة WriteProcessMemory
في الذاكرة (يعني نتعامل مع العناوين كـ VA = virtual address) .
إقتباس :المشكل هو كيف الحصول على BaseAddress لهده القيمة (برمجيا).
تم الحصول على BaseAddress من هنا:
القيمة التي أصبحت 74 هي PokeValue. وهي قيمة واحدة لذلك NumberOfBytes =1
ملاحظة: تغيرت العناوين بعد الـ Compile بدلفي 7 كما في الصورة.
إقتباس :برمجيا
ممم... لكن على أساس ماذا؟
ربما يساعدك هذا:
مثال للحصول على EP برمجيا:
PHP كود :
const // PE header constants CENEWHDR = $003C; // offset of new EXE header CEMAGIC = $5A4D; // old EXE magic id: 'MZ' CPEMAGIC = $4550; // NT portable executable
function GetImageNtHeaders(module: dword) : PImageNtHeaders; begin result := nil; try if word(pointer(module)^) = CEMAGIC then begin result := pointer(module + dword(pointer(module + CENEWHDR)^)); if result^.signature <> CPEMAGIC then result := nil; end; except result := nil end; end;
function GetEntryPoint(module: dword) : pointer; var nh : PImageNtHeaders; begin nh := GetImageNtHeaders(module); if (nh <> nil) and (nh^.OptionalHeader.AddressOfEntryPoint <> 0) then dword(result) := module + nh^.OptionalHeader.AddressOfEntryPoint else result := nil; end;
... الأن أوضحت الكود , كنت أظن أنBase Addressهي Image Base ؟؟؟ في المثال الذي وضعته أنت , لكن أخي kachwahed أليس العنوان المشار إليه Va ؟؟ أم أن له تسمية أخرى (Base Address).
بالتوفيق ,,
إقتباس :لكن أخي kachwahed أليس العنوان المشار إليه Va ؟؟ أم أن له تسمية أخرى (Base Address).
نعم هى Va لاكن اخدت اسم Base Address فى الدالة MemoryPatch لانها استعملت فى البرمتر الثانى للدالة
WriteProcessMemory الدى يحمل نفس الاسم ... فقط .
كود :
تم الحصول على BaseAddress من هنا:
والله اعلم يمكن الحصول عليها من خلال موقع البايت فى الملف التنفيدى
مثلا فى المثال الدى الرفقته اخى كاش واحد المسمى PatchMe.exe عند تنفيد الدالة RvaToOffset عليه ستعطى موقع البايت التى تؤشر عيه VA و هو 327165
الان افتح الملف PatchMe.exe بمحرر هكس و دهب الى هدا الموقع ستجد تلك القيمة تغيرت
و بالتالى بطريقة عكسية يمكن الحصول على VA من موقع البايت مثلا
كود :
Edit1.text := InttoHex(327165, 8) ;
ثم نستعمل القيمة المخزة فى EDIT1 فى الدالة offset2rva فنحصل على VA
اى يمكن الحصول على VA من موقع البايت و الله اعلم .
لاكن المشكل الدى واجهنى هو ادا كان موقع هدا البايت اصغر من 18954 ... لا احصل على VA الصحيح
الـ VA هي العنوان الافتراضي، تستخدم عند إنشاء Loader ، وهي التي تظهر في Disassembler
الـ Offset هي عنوان البايت على القرص وهي التي تستخدم عند الـ Patch، وهي التي تستخدم في محررات الـ Hex
الـ Relative Virtual Address (أو RVA) هي عنوان VA بعد تحميله في الذاكرة (أي بزيادة ImageBase)
لتسهيل التحويل بين VA و RVA و Offset استخدم بريمج LordPE كما يلي:
للتحويل من VA إلى غيره:
أنقر على زر آخر لتحويل باتجاه آخر
إقتباس :اقتباس:
لكن أخي kachwahed أليس العنوان المشار إليه Va ؟؟ أم أن له تسمية أخرى (Base Address).
نعم هى Va لاكن اخدت اسم Base Address فى الدالة MemoryPatch لانها استعملت فى البرمتر الثانى للدالة
WriteProcessMemory الدى يحمل نفس الاسم ... فقط .
var i : byte; sectionh : PIMAGE_SECTION_HEADER; dosh : PIMAGE_DOS_HEADER; peh : PIMAGE_NT_HEADERS; begin if dwRva = 0 then begin result:=dwRva; exit; end; dosh := PIMAGE_DOS_HEADER(pAddrOfFile); peh := PIMAGE_NT_HEADERS(Longword(dosh) + Longword(dosh._lfanew)); Sectionh := PIMAGE_SECTION_HEADER(peh); inc(pimage_nt_headers(Sectionh)); // dwRva := dwRva - peh.OptionalHeader.ImageBase; for i:=peh.FileHeader.NumberOfSections Downto 1 do begin if (dwRva >= Sectionh.VirtualAddress) and (dwRva < (Sectionh.VirtualAddress + Sectionh.PhysicalAddress)) then break; inc(sectionh); end; Result := dwRva + peh.OptionalHeader.ImageBase + sectionh.VirtualAddress - sectionh.PointerToRawData; end;
الان المشكل الدى يقع هو ادا اردنا الحصول على va لبايت موقعه قبل 4096 النتائج تكون خاطئة فى غير دالك النتائج صحيحة ... للمقارنة نستعمل البرنامج الدى اشار اليه اخى كاش واحد بارك الله فيه .
مثلا الحصول على va للبايت الاول نقوم بحساب
كود :
InttoHex(1, 8) ;
ونسجله فى حانة ال offset لبرنامج LordPE ونقارن مع نتائج هدا الرفق .
أخي hanipino , بغض النظر عن من&إلى التحويل Offset&RVA , لكن كيف عرفت الـ Target Offset ؟
هل تستعمل منقح يعمل بالـ Offset ؟, نقوم بدراسة الملف بـ OllyDbg (أشهرdebugger) عند معرفة مكان
تغير القفزة مثلا ؟؟ ... ستكون بالـ VA , لديك قاعدة بسيطة :
نفترض انه لديك ملف تنفيدى و انت تعلم لو غيرت البايت العاشر مثلا سيصبح البرنامج Registred
هل تستطيع تحميل هدا الملف للداكرة وتغير دالك البايت فى الداكرة
بشرط دون استعمال OllyDbg او اى برنامج اخر من هدا النوع .اى (عندك ملف تنفيدى و محرر هكس و دالفى ).