AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Inline Assembler

Ein Thema von WorstNightmare · begonnen am 26. Okt 2010 · letzter Beitrag vom 4. Nov 2010
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#11

AW: Inline Assembler

  Alt 27. Okt 2010, 23:17
Gut, der dargestellte Abschnitt ist zu klein um eine vernünftige Aussage zu erlauben.

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).
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
WorstNightmare

Registriert seit: 6. Okt 2008
159 Beiträge
 
RAD-Studio 2010 Arc
 
#12

AW: Inline Assembler

  Alt 28. Okt 2010, 19:35
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.

Geändert von WorstNightmare (28. Okt 2010 um 19:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#13

AW: Inline Assembler

  Alt 28. Okt 2010, 20:42
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).
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
WorstNightmare

Registriert seit: 6. Okt 2008
159 Beiträge
 
RAD-Studio 2010 Arc
 
#14

AW: Inline Assembler

  Alt 4. Nov 2010, 14:36
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

Geändert von WorstNightmare ( 4. Nov 2010 um 14:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#15

AW: Inline Assembler

  Alt 4. Nov 2010, 16:42
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?
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2023, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf