delphi4arab منتديات دلفي للعرب

نسخة كاملة : تغيير قيمة معينة فى ملف عن طريق دالة معينة
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2
مستحيل أن يكون البايت 10 , لماذا ؟ لأننا نتعامل مع Code Section ,هل قرأت Pe Files
الذي أرفقته ؟؟؟ المهم تابع الشكل العام :

PHP كود :
Entete :
            * 
Offset_PE_Header
            
---------------------------------------------------------
            
PE-Header :
            * 
Nombre de Sections : n
            
* EntryPoint : Offset_EntryPoint
            
* Taille de l'Image : TailleImage
            ---------------------------------------------------------
            Section Header
            * Entrée Section 1
            * Entrée Section 2
            * [...]
            * Entrée Section n
            ---------------------------------------------------------
            Section 1
            ---------------------------------------------------------
            Section 2
            ---------------------------------------------------------
            [...]
            ---------------------------------------------------------
            Section n
            --------------------------------------------------------- 
ستستنتج أن البايت 10 ينتمي للـ Dos Header , ممكن تقوم بتصليح الـ Pe (بعد العبث به) كما وضع
في Home Work1 , فلا تستطيع أصلا تحميله للذاكرة لكي تعدل فيه أصلا ! .
كود :
هل قرأت Pe Files الذي أرفقته ؟؟؟ المهم تابع الشكل العام :
ليس بعد ... لا يحتاج الى قرائة فقط بل الى قرائة و اهم شىء الفهم Smile عند توفر الوقت ان شاء الله ساغوص فيه .
كود :
فلا تستطيع أصلا تحميله للذاكرة لكي تعدل فيه أصلا ! .

ساتعبك معى قليلا اخى tf6 :kick:
فى المشاركة رقم 2 ارفقت ملف تنفيدى اسمه RegMe.exe ... لو غيرنا بايتين فى هدا الملف سيصبح
registred موقع هادين البايتين هما على التوالى (326837, 326808)

---
الان هل يمكن ان نحمل RegMe.exe للداكرة ونغير هادين البايتين ... دون الاستعانة ب OllyDbg اى ليست غندنا va عندنا فقط موقع بايتين فى الملف (326837, 326808)
[COLOR="#000000"]
إقتباس :مستحيل أن يكون البايت 10 , لماذا ؟...
البايت 10 ينتمي للـ Dos Header
لا شيئ مستحيل شرط ان يكون منطقي
تا بع معي (ساتحدث مع نفسي!)
ما فائدة Dos Header ؟
تحتوي معلومات لتنفيذ البرنامج في DOS
هل برامجنا تنفذ في DOS ؟
لا
اذن يمكن الاستغناء عنها ؟
نعم
كليا ؟
لا، على الاقل يجب وجود اول حرفين MZ وبدونهما يعتبر النظام الملف غير تنفيذي
تقصد حذف كليا DOS Header مع الابقاء على MZ
نعم
إذن كيف ينفذ النظام الملف مع ان المعلومات حذفت ؟
PE header هي التي يحتاجها النظام لتنفيذ ملف Win32PE
اها!
نعم
هل لدبك دليل ؟ او مثال حي
نعم، برامج ضغط كثيرة منها uPack/WinUpack رابط تحميله بموضوع سابق
http://www.delphi4arab.net/forum/showthr...p?tid=1530

إقتباس :موقع هادين البايتين هما على التوالى (326837, 326808)
تلك offset
اي موضعها بالملف التنفيذي الخام وهو بالقرص
عندما يتم تحميله للذاكرة قد يتغير شكله
والoffset لا تنفع الى بعد تحويلها RVA
لا وقت لشرح الامر
انصحك بقرائة موضوع لZool@nder بمنتدى AT4RE

هناك طريقة ثانية للتعديل هي Search & Replace البحث ثم التعديل
وبالتوفيق
[/COLOR]
لا أدري إن كنت طرحتها أم لا. العكس Rva2Offset:
PHP كود :
//Convert Rva2Offset & Offset2Rva

  
IMAGE_SECTION_HEADER = packed record
    Name            
: packed array [0..IMAGE_SIZEOF_SHORT_NAME-1] of Char;
    
PhysicalAddress : DWORD;
    
VirtualAddress  : DWORD;
    
SizeOfRawData   : DWORD;
    
PointerToRawData : DWORD;
    
PointerToRelocations : DWORD;
    
PointerToLinenumbers : DWORD;
    
NumberOfRelocations : WORD;
    
NumberOfLinenumbers : WORD;
    
Characteristics : DWORD;
  
end;

  
PIMAGE_DOS_HEADER = ^IMAGE_DOS_HEADER;

  
PIMAGE_NT_HEADERS = ^IMAGE_NT_HEADERS;

  
PIMAGE_SECTION_HEADER = ^IMAGE_SECTION_HEADER;
  
function 
rva2offset( pAddrOfFile: Pointer; dwRva : dword ):dword; 
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:=1 to peh.FileHeader.NumberOfSections do begin 
    
if (dwRva >= Sectionh.VirtualAddress) and 
    (
dwRva < (Sectionh.VirtualAddress + Sectionh.PhysicalAddress)) then break; 
    
inc(sectionh); 
  
end; 
  
result:=dwRva - sectionh.VirtualAddress + sectionh.PointerToRawData; 
end; 


function 
offset2rva (pAddrOfFile: Pointer; dwRva : dword ):dword; 
var 
i : byte; 
    
sectionh : PIMAGE_SECTION_HEADER; 
    
dosh : PIMAGE_DOS_HEADER; 
    
peh : PIMAGE_NT_HEADERS; 
    
temp: dword; 
begin 
  
if dwRva = 0 then begin 
    result
:=dwRva; 
    exit; 
  
end;       
  
dosh     := PIMAGE_DOS_HEADER(pAddrOfFile); 
  
peh      := PIMAGE_NT_HEADERS(Longword(dosh) + Longword(dosh.e_lfanew)); 
  
Sectionh := PIMAGE_SECTION_HEADER(peh); 
  
inc(pimage_nt_headers(Sectionh)); 
  
inc (sectionh, peh.FileHeader.NumberOfSections); 
  for 
i:=peh.FileHeader.NumberOfSections downto 1 do begin 
    temp 
:= dwRva + sectionh.VirtualAddress - sectionh.PointerToRawData; 
    if (
temp >= Sectionh.VirtualAddress) and 
       (
temp < (Sectionh.VirtualAddress + Sectionh.PhysicalAddress)) then break; 
    
dec(sectionh); 
  
end;                                 
  
dwRva := temp + peh.OptionalHeader.ImageBase; 
  
Result := dwRva; 
end 
بالتوفيق.
b.m.abdelaziz كتب :[color="#000000"]

والoffset لا تنفع الى بعد تحويلها rva
[/color]

هل تقصد شىء مثل هدا .
"مستحيل أن يكون البايت 10 " هذا على أساس التساؤل الذي أراد معرفته الاخ هاني .
الصفحات : 1 2