![]() |
|
إجراء MemoryPatch لعمل Loader - نسخة قابلة للطباعة +- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum) +-- قسم : منتديات دلفي الأخرى (https://delphi4arab.net/forum/forumdisplay.php?fid=4) +--- قسم : الامن و تحليل التطبيقات البرمجية (https://delphi4arab.net/forum/forumdisplay.php?fid=31) +--- الموضوع : إجراء MemoryPatch لعمل Loader (/showthread.php?tid=1642) |
إجراء MemoryPatch لعمل Loader - kachwahed - 10-02-2010 السلام عليكم كتبت بالأمس إجراء يقوم بعمل Patch لموضع محدد من ذاكرة ملف أثناء تشغيله: PHP كود : usesيصلح لعمل 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إجراء MemoryPatch لعمل Loader - Ahmed18 - 11-02-2010 يبدوا انك تريد دخول عالم الهندسة العكسية اخي kachwahed لكن لدي سؤال انت استخدمت الباراميتر NORMAL_PRIORITY_CLASS مع الدالة CreateProcess اليس هذا يعني ان البرنامج الهدف سيعمل قبل تعديل البايتات المطلوبة ؟؟ الطبيعي ان تستخدم الباراميتر CREATE_SUSPENDED ثم تجري التعديلات ثم تشغيل البرنامج عن طريق ResumeThread إجراء MemoryPatch لعمل Loader - kachwahed - 11-02-2010 السلام عليكم مرحبا بالأخ 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;إقتباس :اليس هذا يعني ان البرنامج الهدف سيعمل قبل تعديل البايتات المطلوبة ؟؟أجل، الغريب أن الذي كتبته يعمل أيضا ! أظن أن التغيير تم بسرعة في موضع مبكر من الذاكرة، قبل إقلاع البرنامج، لذلك حصل التغيير. إجراء MemoryPatch لعمل Loader - kachwahed - 19-03-2010 بنفس الطريقة يمكن التعديل على Process بتمرير مقبض يؤشر عليه: PHP كود : procedure MemoryPatch(WindowName: HWND; PokeValue: Byte; Address: Integer; NumberOfBytes: Cardinal);مثال لتجاوز الـ Password في برامج التثبيت InnoSetup للإصدار 5.3.8. إجراء MemoryPatch لعمل Loader - kachwahed - 10-10-2010 بأي حجم 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] |