المشاركات : 2,293
المواضيع 157
:
: 81
الإنتساب : Dec 2008
السلام عليكم
كتبت بالأمس إجراء يقوم بعمل 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
تحياتي.
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...
المشاركات : 52
المواضيع 7
:
: 0
الإنتساب : Feb 2008
يبدوا انك تريد دخول عالم الهندسة العكسية اخي kachwahed
لكن لدي سؤال انت استخدمت الباراميتر NORMAL_PRIORITY_CLASS مع الدالة CreateProcess اليس هذا يعني ان البرنامج الهدف سيعمل قبل تعديل البايتات المطلوبة ؟؟
الطبيعي ان تستخدم الباراميتر CREATE_SUSPENDED ثم تجري التعديلات ثم تشغيل البرنامج عن طريق ResumeThread
المشاركات : 2,293
المواضيع 157
:
: 81
الإنتساب : Dec 2008
السلام عليكم
مرحبا بالأخ 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;
إقتباس : اليس هذا يعني ان البرنامج الهدف سيعمل قبل تعديل البايتات المطلوبة ؟؟
أجل، الغريب أن الذي كتبته يعمل أيضا !
أظن أن التغيير تم بسرعة في موضع مبكر من الذاكرة، قبل إقلاع البرنامج، لذلك حصل التغيير.
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...
المشاركات : 2,293
المواضيع 157
:
: 81
الإنتساب : Dec 2008
19-03-2010, 02:24 PM
(آخر تعديل لهذه المشاركة: 10-10-2010, 02:42 PM بواسطة kachwahed .)
بنفس الطريقة يمكن التعديل على 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.
الملفات المرفقة
PssingInnoSetupPW.rar (الحجم : 10.11 ك ب / التحميلات : 50)
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...
المشاركات : 2,293
المواضيع 157
:
: 81
الإنتساب : Dec 2008
10-10-2010, 02:43 PM
(آخر تعديل لهذه المشاركة: 10-10-2010, 07:33 PM بواسطة kachwahed .)
بأي حجم 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]