![]() |
C++ zu delphi
hey leute,
ich will diese c++ function in eine delphi function umwandeln:
Code:
und hab das erreicht:
ULONG reentry_address = GetProcAddress( LoadLibrary("user32.dll"), "PostMessageA" ) + 5;
__declspec(naked) void myPostMessageA(void) { __asm { mov edi,edi push ebp mov ebp,esp jmp [reentry_address] } }
Delphi-Quellcode:
Was ist daran falsch? beim compilen bekomm ich kein error aber dann beim ausführen. Hab schon viele sachen ausprobiert. k.A. was da falsch ist. Ich hoffe ihr könnt mir helfen. :)
function PostMessage1337(
hWnd:HWND; MSG:UINT; WPARAM:wParam; LPARAM:lParam):BOOL; var reentry_address: pointer; nub: Integer; begin reentry_address:=GetProcAddress( LoadLibrary('user32.dll'), 'PostMessageA'); Nub := integer(reentry_address)+5; reentry_address := pointer(nub); asm mov edi,edi push ebp mov ebp,esp jmp reentry_address end; Result := LongBool(Nub); end; danke :) k4ni |
Re: C++ zu delphi
Danke für diesen Quiz
|
Re: C++ zu delphi
Wieso Quiz ? Ich kriegs doch selber nich hin :(
|
Re: C++ zu delphi
Du musst verhindern, dass delphi den stackframe zerstoert.
|
Re: C++ zu delphi
Ahh danke :)
Nur weis ich nicht wie das geht. Und wieso? in C macht ers ja auch nicht oder? |
Re: C++ zu delphi
Delphi-Quellcode:
ist in delphi mit
__declspec(naked)
Delphi-Quellcode:
zu vergleichen, also kannst du es in asm programmieren oder du laesst dir was anderes einfallen.
asm
... end; |
Re: C++ zu delphi
Delphi-Quellcode:
var
pOrgPostMessage: Pointer; function Secure_PostMessageA(hWnd:HWND ;MSG:UINT ;WPARAM: wParam; lPARAM:lParam):BOOL;stdcall;assembler; asm jmp pOrgPostMessage end; procedure InitializeSecureApi; begin pOrgPostMessage := Pointer(DWORD(GetProcAddress( GetModuleHandle('user32.dll'), 'PostMessageA'))+5); end; procedure TForm1.FormCreate(Sender: TObject); begin InitializeSecureApi; Secure_PostMessageA(Application.Handle,WM_SYSCOMMAND,SC_MINIMIZE,0); end; |
Re: C++ zu delphi
Liste der Anhänge anzeigen (Anzahl: 1)
Danke!
Ich habs jetzt dann gleich mal getested mit:
Delphi-Quellcode:
es kommt ne AccessViolation sendet then key aber trotzdem. Idee?
Secure_PostMessageA(ms, Wm_keyDown, VK_Return, 0);
Secure_PostMessageA(ms, Wm_keyUp, VK_Return, 0); Edit: Mir ist aber aufgefallen das die address violation diesmal nicht von der user32.dll sondern von der application selber kommt. [Bild im anhang] |
Re: C++ zu delphi
Wie soll das auch funktionieren? Diesmal wird garkein stackframe erzeugt ... Versuche doch erstmal zu verstehen was du da versuchst.
//Edit: sorry, hatte das stdcall nicht wahrgenommen |
Re: C++ zu delphi
Funktioniert, wenn einige Bedingungen stimmen.(5 Bytes Hotpatch Fix vorhanden,...) Das "stdcall" induziert den Function Prolog.
Disassembly von Secure_PostMessageA:
Delphi-Quellcode:
Jedenfalls bei Delphi 7.
0044C86C $ 55 PUSH EBP
0044C86D . 8BEC MOV EBP,ESP 0044C86F .-FF25 D8FB4400 JMP DWORD PTR DS:[44FBD8] ; user32.7E36CB8A |
Re: C++ zu delphi
Hmm ich habs mit Delphi 7 und 10 versucht.
Es macht schon was es machen muss aber dann gibts dann halt danach ne eAddressViolation :gruebel: |
Re: C++ zu delphi
Gib nochmal den ganzen Code oder gleich das Test Projekt als Anhang.
Vlt. habe ich einen Fall übersehen. Geht es denn, wenn du ein ganz neues projekt machst und meinen code reinkopierst? |
Re: C++ zu delphi
Dann liegt das Problem warscheinlich auch woanders, hast du dir den Anfang von PostMessage mal im disassembler angeschaut?
BTW, mein vorschlag waere:
Delphi-Quellcode:
function PostMessage1337(hWnd:HWND;MSG:UINT;WPARAM:wParam;LPARAM:lParam):BOOL; stdcall;
asm jmp @go @usr32: db 'user32.dll',0 @PMA: db 'PostMessageA',0 @go: lea eax, @usr32 push eax call LoadLibraryA lea ecx, @PMA push ecx push eax call GetProcAddress add eax,5 jmp eax end; |
Re: C++ zu delphi
Liste der Anhänge anzeigen (Anzahl: 1)
Hab ich auch schon versucht.
Werd jetz auch mal Win32.Api's version testen. Ich hab das project mal im ahhang. (mit der kompilierten exe). Edit: Komisch. Win32.Api's geht auch nicht. Auch eAddressViolation. |
Re: C++ zu delphi
Jo Win32.APIs Lösung klappt bei mir auch problemlos. ;)
Wollte halt sowenig ASM wie möglich benutzen, da man daraus dann besser eine Secure Api Klasse basteln könnte. Zitat:
//Edit2: Selbst die Binary von dir klappt bei mir. Das bedeutet wohl, dass entweder: 1. PostMessageA bei dir von irgendeinem anderen Programm so merkwürdig gehookt wird, dass es nicht geht. 2. Du hast ServicePack2 nicht, da dort (afaik?) MOV EDI, EDI für Hotpatching eingeführt wird. Hmm mehr fällt mir im Moment nicht ein. |
Re: C++ zu delphi
Deine kompilierte version laeuft bei mir, welche windows version benutzt du? Welches Programm versucht du zu umgehen?
|
Re: C++ zu delphi
Okay..danke.
Ne SP2 hab ich nicht, werd ich mir jetzt aber mal ziehen aber vorher erst mal mit nem PC restart versuchen. Hatte vorher das spiel mal aus mit dem GameGuard (nProtect rev1139) das PMA hookt Und genau das will ich damit umgehen. Achso ja, das spiel heist MapleStory. Edit: Vielen vielen dank an euch 2. Liegt wohl an SP2 (installier ich gerade) müsst dann gehen. DANKE!! :thumb: |
Re: C++ zu delphi
Hey, das soll jetz kein bump sein sondern nur eine frage zum gleichen thema.
Also das spile bzw. der GameGuard hookt ReadProcessMemory auch. (glaub ich zumindest) Wenn ich versuche vom Prozess zu lesen gibt er einfach keine value zurück. So hab ich das gemacht:
Delphi-Quellcode:
Bei anderen prozessen geht das super. Dann hab ich das bei MapleStory (also das spiel) versucht dann bekomm ich die Message "1337". Hab ich ja davor noch deklariert.
procedure TForm1.Button1Click(Sender: TObject);
var ThreadId: Integer; HandleWindow: Integer; wnd: HWND; ProcessId, vl: Integer; p : pointer; puffer : array[0..1] of DWord; BytesRead: DWord; begin vl := 1337; wnd := FindWindow('MapleStoryClass', nil); if wnd = 0 then begin ShowMessage('Could not find the Window'); Exit; end; ThreadId := GetWindowThreadProcessId(wnd, @ProcessId); HandleWindow := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId); ReadProcessMemory( HandleWindow, ptr($0040000), @puffer[0], 4, BytesRead ); vl := Puffer[0]; ShowMessage(IntToStr(vl)); CloseHandle(HandleWindow); end; Dann hab ich hier mal das gleiche versucht wie bei PMA. Also:
Delphi-Quellcode:
Mal keine EAddressViolation :)
function RPM(hProcess: Cardinal; const IpBaseAddress: Pointer; IpBuffer: Pointer; nSize: Cardinal; var IPNumberOfBytedRead: Cardinal):BOOL;stdcall;assembler;
asm jmp @go @usr32: db 'Kernel32.dll',0 @PMA: db 'ReadProcessMemory',0 @go: lea eax, @usr32 push eax call LoadLibraryA lea ecx, @PMA push ecx push eax call GetProcAddress add eax,5 jmp eax end; Jetzt kommt auch kein "1337" mehr als message sondern immer diese zahl bei jeder addy: 1769498 Wenigstens ein kleiner erfolg. Jetzt die frage: Kann das sein das es auch an OpenProcess() liegt das er das hookt? Oder ist der asm-code extra nur für PMA`? Danke :) |
Re: C++ zu delphi
Gameguard veranstaltet wesentlich mehr als Usermode Apis zu hooken. (Obwohl ich mir jetzt nicht sicher bin, ob GameGuard ÜBERHAUPT was im Userland hooked, aber da scheinst du dich informiert zu haben oder hast nachgeschaut?)
Wie dem auch sei, GameGuard lädt einen Treiber und verhindert jegliche Manipulation des Zielprozesses von Ring0 aus. Es wird also viel schwieriger werden GameGuard zu umgehen, als du anfangs dachtest. Denn jetzt wäre es an der Zeit GameGuard zu reversen um zu gucken, was GameGuard macht und was man dagegen tun könnte. Leider kommen auch noch AntiDebug-Tricks dazu, also wie gesagt es wird nicht einfach. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz