إجراء MemoryPatch لعمل Loader
#1
السلام عليكم
كتبت بالأمس إجراء يقوم بعمل Patch لموضع محدد من ذاكرة ملف أثناء تشغيله:
PHP كود :
uses
  Windows
;

procedure MemoryPatch(sExecutableFilePath :string; Patch: Byte; BaseAddress: Integer; nSize, BytesCount: Cardinal);
var
   
ProcessInfo: TProcessInformation;
   
StpInfo: TStartupInfo;
   
buf: PChar;
begin
   buf 
:= nil;
   
FillMemory(@StpInfo, sizeof( StpInfo ), 0 );
   
StpInfo.cb := sizeof( StpInfo );
   if 
not CreateProcess(Nil, PChar( sExecutableFilePath ),
                  
Nil, Nil, False, NORMAL_PRIORITY_CLASS,
                  
Nil, Nil, StpInfo, ProcessInfo ) then
    MessageBox
(0, 'Program not found!', '', MB_OK + MB_ICONWARNING)
  else 
begin
    GetMem
(buf, 1);
    
buf^ := Chr(Patch);
    
WriteProcessMemory(ProcessInfo.hProcess, Ptr(BaseAddress), buf, nSize, BytesCount);
    
FreeMem(buf);
  
end;
   
CloseHandle( ProcessInfo.hProcess );
   
CloseHandle( ProcessInfo.hThread );
end; 
الإجراء لا شيء فيه جديد غير أنه سهل الاستخدام، ربما يفيد من يستخدمه بكثرة
يصلح لعمل Loader لبرنامجك، أو أحيانا لبرنامج آخر :bones:
مثال Aimersoft Video Converter Ultimate v3.2.0.3ـ:
كود :
MemoryPatch('VideoConverterUltimate.exe', $DE, $0050F44D, 1, 1);
لأجل:
كود :
http://www.aimersoft.com/video-converter-ultimate.html
تحياتي.
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...
الرد
#2
يبدوا انك تريد دخول عالم الهندسة العكسية اخي kachwahed
لكن لدي سؤال انت استخدمت الباراميتر NORMAL_PRIORITY_CLASS مع الدالة CreateProcess اليس هذا يعني ان البرنامج الهدف سيعمل قبل تعديل البايتات المطلوبة ؟؟
الطبيعي ان تستخدم الباراميتر CREATE_SUSPENDED ثم تجري التعديلات ثم تشغيل البرنامج عن طريق ResumeThread
الرد
#3
السلام عليكم
مرحبا بالأخ Ahmed18
إقتباس :الطبيعي ان تستخدم الباراميتر CREATE_SUSPENDED ثم تجري التعديلات ثم تشغيل البرنامج عن طريق ResumeThread
شيء مثل:
كود :
if not CreateProcess(Nil, PChar( sExecutableFilePath ), Nil, Nil, False, [color=Red]CREATE_SUSPENDED[/color], Nil, Nil, StpInfo, ProcessInfo ) then MessageBox(0, 'Program not found!', '', MB_OK + MB_ICONWARNING) else begin GetMem(buf, 1); buf^ := Chr(Patch); WriteProcessMemory(ProcessInfo.hProcess, Ptr(BaseAddress), buf, nSize, BytesCount); FreeMem(buf); [color=Red] ResumeThread(ProcessInfo.hThread)[/color] end;
إقتباس :اليس هذا يعني ان البرنامج الهدف سيعمل قبل تعديل البايتات المطلوبة ؟؟
أجل، الغريب أن الذي كتبته يعمل أيضا !
أظن أن التغيير تم بسرعة في موضع مبكر من الذاكرة، قبل إقلاع البرنامج، لذلك حصل التغيير.
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...
الرد
#4
بنفس الطريقة يمكن التعديل على Process بتمرير مقبض يؤشر عليه:
PHP كود :
procedure MemoryPatch(WindowName: HWND; PokeValue: Byte; Address: Integer; NumberOfBytes: Cardinal);
var
  
ProcessId: Integer;
  
buf: PChar;
  
HandleWindow: Integer;
  
Write: Cardinal;
begin
  
if WindowName = 0 then
  begin
    MessageBox
(0, 'Program not running.', 'ERROR', MB_OK + MB_ICONWARNING);
    Exit;
  
end;

  
GetWindowThreadProcessId(WindowName, @ProcessId);

  
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);

  
GetMem(buf, 1);
  
buf^ := Chr(PokeValue);
  if 
WriteProcessMemory(HandleWindow, ptr(Address), buf, NumberOfBytes, Write) then
  MessageBox
(0, 'Process successfully patched!.', 'iNFO', MB_OK + MB_ICONINFORMATION);

  
FreeMem(buf);
  
CloseHandle(HandleWindow);
end; 
البحث عن المقبض بالدوال المعروفة... مثل FindWindow.
مثال لتجاوز الـ Password في برامج التثبيت InnoSetup للإصدار 5.3.8.


الملفات المرفقة
.rar   PssingInnoSetupPW.rar (الحجم : 10.11 ك ب / التحميلات : 50)
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...
الرد
#5
بأي حجم Binary/Hex
كود :
[color=Black][COLOR=Blue]procedure [/color]PatchBytes(FileTarget: string; Value: String; Offset: LongInt; IsHex: Boolean = True; MakeBackup: Boolean = True); [color=Blue]var[/color] EXEStream: TMemoryStream; Buf: String; [color=Blue]begin[/color] SetLength(Buf, Length(Value) div 2); [color=Blue]if [/color]IsHex [color=Blue]then[/color] HexToBin(PChar(Value), @Buf[1], Length(Value)) [color=Blue]else [/color]Buf := Value; EXEStream := TMemoryStream.Create; [color=Blue]try[/color] EXEStream.LoadFromFile(FileTarget); [color=Blue]if [/color]MakeBackup [color=Blue]then[/color] EXEStream.SaveToFile(ChangeFileExt(FileTarget, '.bak')); EXEStream.Seek(Offset, 0); EXEStream.WriteBuffer(Buf[1], Length(Buf)); EXEStream.SaveToFile(FileTarget); [color=Blue]finally[/color] EXEStream.Free; [color=Blue]end[/color]; // try [color=Blue]end[/color];[/COLOR]

والأفضل:
كود :
[color=Black][COLOR=Blue]procedure [/color]PatchBytes(FileTarget: [color=Blue]string[/color]; Value: [color=Blue]String[/color]; Offset: LongInt; MakeBackup: Boolean = True); [color=Blue]var[/color] EXEStream: TMemoryStream; Bytes: LongWord; I: Integer; [color=Blue]begin[/color] EXEStream := TMemoryStream.Create; [color=Blue]try[/color] EXEStream.LoadFromFile(FileTarget); [color=Blue]if [/color]MakeBackup [color=Blue]then[/color] EXEStream.SaveToFile(ChangeFileExt(FileTarget, '.bak')); EXEStream.Seek(Offset, 0); I := 1; [color=Blue]while [/color]I < Length(Value) [color=Blue]do begin[/color] Bytes := StrToInt('$'+Value[I] + Value[I+1]); Inc(I, 2); EXEStream.WriteBuffer(Bytes, 1); [color=Blue]end[/color]; EXEStream.SaveToFile(FileTarget); [color=Blue]finally[/color] EXEStream.Free; [color=Blue]end[/color]; // try [color=Blue]end[/color];[/COLOR]
الرد


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


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