Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi C++ zu delphi (https://www.delphipraxis.net/107279-c-zu-delphi.html)

k4ni 25. Jan 2008 02:35


C++ zu delphi
 
hey leute,

ich will diese c++ function in eine delphi function umwandeln:

Code:
 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]
      }
   }
und hab das erreicht:

Delphi-Quellcode:
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;
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. :)

danke :)
k4ni

QuickAndDirty 25. Jan 2008 07:11

Re: C++ zu delphi
 
Danke für diesen Quiz

k4ni 25. Jan 2008 14:47

Re: C++ zu delphi
 
Wieso Quiz ? Ich kriegs doch selber nich hin :(

Win32.API 25. Jan 2008 14:56

Re: C++ zu delphi
 
Du musst verhindern, dass delphi den stackframe zerstoert.

k4ni 25. Jan 2008 15:08

Re: C++ zu delphi
 
Ahh danke :)
Nur weis ich nicht wie das geht. Und wieso? in C macht ers ja auch nicht oder?

Win32.API 25. Jan 2008 15:17

Re: C++ zu delphi
 
Delphi-Quellcode:
__declspec(naked)
ist in delphi mit

Delphi-Quellcode:
asm
...
end;
zu vergleichen, also kannst du es in asm programmieren oder du laesst dir was anderes einfallen.

Neotracer64 25. Jan 2008 15:56

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;

k4ni 25. Jan 2008 16:04

Re: C++ zu delphi
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke!
Ich habs jetzt dann gleich mal getested mit:
Delphi-Quellcode:
Secure_PostMessageA(ms, Wm_keyDown, VK_Return, 0);
Secure_PostMessageA(ms, Wm_keyUp, VK_Return, 0);
es kommt ne AccessViolation sendet then key aber trotzdem. Idee?

Edit:
Mir ist aber aufgefallen das die address violation diesmal nicht von der user32.dll sondern von der application selber kommt.
[Bild im anhang]

Win32.API 25. Jan 2008 16:08

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

Neotracer64 25. Jan 2008 16:12

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:
0044C86C  $ 55             PUSH EBP
0044C86D  . 8BEC          MOV EBP,ESP
0044C86F  .-FF25 D8FB4400  JMP DWORD PTR DS:[44FBD8]               ; user32.7E36CB8A
Jedenfalls bei Delphi 7.

k4ni 25. Jan 2008 16:29

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:

Neotracer64 25. Jan 2008 16:32

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?

Win32.API 25. Jan 2008 16:40

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;

k4ni 25. Jan 2008 16:43

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.

Neotracer64 25. Jan 2008 16:49

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:

Edit:
Komisch. Win32.Api's geht auch nicht. Auch eAddressViolation.

Hmm. Dann ist was anderes falsch. Mal reinschauen. :D

//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.

Win32.API 25. Jan 2008 16:51

Re: C++ zu delphi
 
Deine kompilierte version laeuft bei mir, welche windows version benutzt du? Welches Programm versucht du zu umgehen?

k4ni 25. Jan 2008 16:55

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:

k4ni 25. Jan 2008 19:05

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:
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;
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.
Dann hab ich hier mal das gleiche versucht wie bei PMA.
Also:
Delphi-Quellcode:
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;
Mal keine EAddressViolation :)
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 :)

Neotracer64 26. Jan 2008 03:20

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 00:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz