Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Inline Assembler (https://www.delphipraxis.net/155516-inline-assembler.html)

Assarbad 27. Okt 2010 22:17

AW: Inline Assembler
 
Gut, der dargestellte Abschnitt ist zu klein um eine vernünftige Aussage zu erlauben.

Zitat:

Zitat von WorstNightmare (Beitrag 1058124)
Die 5 Bytes bei 4BC877 ersetze ich mit einem jmp zu meiner SendPacket Methode. Das mov eax,00b... ist also nur der originale Opcode und dann wird der originale Code weiter ausgeführt (SendPacketRet: Cardinal = $4BC877 + 5).
Mehr weiß ich leider auch nicht, außer dass ecx einen Pointer auf einen record mit dem Paket enthält.

Tja, dann empfehle ich dir erstmal keine Annahmen zu treffen, wie du es getan hast. Nehmen wir erstmal einfach das stdcall raus. Also:

Code:
procedure SendPacket;
asm
  mov eax, [ebp]
  mov eax, [eax+$04]
  push eax
  call OnSendPacket
  mov eax,$00BF0044
  jmp dword ptr [SendPacketRet]
end;
Bei OnSendPacket bleibt es!

... dann versuch mal. Ansonsten mußte vielleicht mal mehr vom Originalcode und von deinem Code rausrücken, denn sonst wird es schwer überhaupt was zu sagen (ohne zu raten).

WorstNightmare 28. Okt 2010 18:35

AW: Inline Assembler
 
Welche Ausschnitte aus dem asm-Code brauchst du denn? Weiter nach oben oder nach unten?

Von meinem Code habe ich schon so ziemlich alles gepostet. Habe jetzt mal das stdcall weggenommen, bringt nichts.

Delphi-Quellcode:
const
  SEND_PACKET = $004BC877;

var
  SendPacketRet: Cardinal = SEND_PACKET + 5;

function JMP(iFrom, iTo: Cardinal): Cardinal;
begin
  Result := (iTo - iFrom) - 5;
end;

function GetModuleFromAddress(Address: Pointer): string;
var
  Res: HMODULE;
  Name: array[0..100] of AnsiChar;
begin
  GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, Address, Res);
  GetModuleBaseName(GetCurrentProcess, Res, Name, 100);
  Result := string(AnsiString(Name));
end;

procedure OnSendPacket(Ret: Pointer); stdcall;
var
  F: TextFile;
begin
  AssignFile(F, 'C:\test.txt');
  Append(F);
  Writeln(F, GetModuleFromAddress(Ret));
  CloseFile(F);
end;

procedure SendPacket;
asm
  mov eax, [ebp]
  mov eax, [eax+$04]
  push eax
  call OnSendPacket
  mov eax,$00BF0044
  jmp dword ptr [SendPacketRet]
end;

procedure InstallHook;
begin
  PByte(SEND_PACKET)^ := $E9;
  PCardinal(SEND_PACKET + 1)^ := JMP(SEND_PACKET, DWORD(@SendPacket));
end;
Und es liegt nicht an meinem allgemeinen Vorgehen; sobald ich das stdcall; wieder hinmache und den OnSendPacket call inklusive push eax auskommentiere geht alles, die Pakete werden gesendet.

Assarbad 28. Okt 2010 19:42

AW: Inline Assembler
 
Zitat:

Zitat von WorstNightmare (Beitrag 1058395)
Und es liegt nicht an meinem allgemeinen Vorgehen; sobald ich das stdcall; wieder hinmache und den OnSendPacket call inklusive push eax auskommentiere geht alles, die Pakete werden gesendet.

In dem Fall müßte man durch den Code durchgehen (im Debugger/Disassembler).

WorstNightmare 4. Nov 2010 13:36

AW: Inline Assembler
 
http://i52.tinypic.com/1z4llwj.png

So sieht es im Disassembler aus. Die obere ist die asm-Prozedur. Damit er die zeigte musste ich sie manuell aufrufen, damit sie überhaupt disassembliert wurde (ansonsten zeigt er an der Stelle nur db XXh an). Der untere Teil ist dementsprechend OnSendPacket.
Kann man an dem Ausschnitt was erkennen?

Edit:
Hab ich's mir gedacht, so geht es:
Delphi-Quellcode:
procedure OnSendPacket(Ret: Pointer); stdcall;
var
  F: TextFile;
begin
  AssignFile(F, 'C:\lol.txt');
  Append(F);
  Writeln(F, GetModuleFromAddress(Ret));
  CloseFile(F);
end;

procedure SendPacket; stdcall;
asm
  mov eax, [ebp]
  mov eax, [eax+$04]
  push ecx
  push eax
  call OnSendPacket
  pop ecx
  mov eax,$00BF0044
  jmp dword ptr [SendPacketRet]
end;
ecx einfach speichern. Warum ist da niemand drauf gekommen, ist das irgendwie gefährlich? o.o

Assarbad 4. Nov 2010 15:42

AW: Inline Assembler
 
Zitat:

Zitat von WorstNightmare (Beitrag 1059632)
ecx einfach speichern. Warum ist da niemand drauf gekommen, ist das irgendwie gefährlich? o.o

Gefährlich ist das nicht. Nur mit den mageren Informationen die du dargeboten hast, ließ sich über die Aufrufkonventionen nicht alles ermitteln.

Aber eigentlich sollte das absolut nichts ändern, denn bei stdcall würde es OnSendPacket obliegen den Registerwert zu speichern und wiederherzustellen. Dein Code ist also eigentlich nach den allgemeinen Regeln redundant. Der Wurm ist woanders zu finden ... nur wo?


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:18 Uhr.
Seite 2 von 2     12   

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