![]() |
Assembler -> HexCode
Hi Leute,
Ich schreib ja auch ganz gerne mal n Cheat für kleine Games (nur des Schreibenswillen ich will die nich einsetzten... (bevor hier die Grundsatzdiskusion losgeht "Cheater haben kleine...")) nun ist die Sache das ich dafür normalerweise Code in das zu cheatene Game injecte. Hierfür überlege ich mir immer wie der entsprechene Code in Assembler aussehen muss und schreibe ihn in eine unbenutzte Stelle im Speicher des entsprechenen Programms. Die Umwandlung von dem Assemblercode in HEX habe ich bisher immer TSearch genommen. Das wandelt mir den Code in so genannten Poke-Code um. Nun will ich aber ein Programm schreiben das den Trainer nahezu selbstständig schreibt. Mein größtes Problem dabei ist wie wandel ich nun den Assembler Code in entsprechene Hex-Werte um? Bei so sachen wie Nop -> 90 JE -> 74 JnE -> 75 usw wäre das ja kein Problem aber wie sieht das zB mit einem Call aus? Und vorallem mit den Speicheradressen? Diese scheinen irgendwie in Relation zu der Stelle wo sie aufgerufen werden zu stehen... Kann mir jemand n Ansatzpunkt für diese Problematik geben?? Bin für jede Hilfe dankbar! Greetz Boombuler |
Re: Assembler -> HexCode
Hab hier mal was gefunden:
ASM -> Hex jmp = EB ja = 0F87 jna = 0F86 jae = 0F83 jnae = 0F82 jg = 0F8F jng = 0F8E jge = 0F8D jnge = 0F8C Ein Call hast meist keine eindeutige Adresse (oder irre ich mich?). Wenn nicht dann guck mal bei Google . ;) |
Re: Assembler -> HexCode
ein call/jmp (e8, e9) ist relativ
d.h. du musst das vroher berechnen, E8 = call, dann nen integer/cardinal für die distanz, wobei die berechnung zuadresse-vonadresse-5 ist du musst auch noch die relocations alle fixen, bzw einfach keine benutzen nen call bzw jump würdest könntest auch noch durch ne relocation fake jmp/call hinbekommen
Delphi-Quellcode:
d.h. adresse würde dann bei deiner kompilierten exe in der relocation tabelle vorkommen, dann mussu net mehr nach den distance calls/jumps suchen
mov eax, adresse
call eax wenn du parameter über register übergibst kannste nen call/jmp auch so machen:
Delphi-Quellcode:
du könntest aber auch alle funktionen die du benutzt in eine funktion auslagern dann brauchste dich eigentlich gar nicht mehr drum kümmern
push adresse // unterfunktion oder jump
push @@ret1 // weglassen wenns nen jump sein soll, bei nem call brauchste das ret @@ret1:
Delphi-Quellcode:
dann kopierste die ganze funktion in deine neue exe, aber auch hier musste noch die relcos zu den strings fixen
procedure programstart; stdcall;
procedure unterfunktion1(a,b: integer); stdcall; begin end; procedure unterfunktion2(a,b: integer); stdcall; begin end; begin unterfunktion1(1,2); unterfunktion2(1,2); end; |
Re: Assembler -> HexCode
sind die opcodes nicht bei verschiedenen prozessoren unterschiedlich?
beim alten Z80 z.B. ist nop -> 00. |
Re: Assembler -> HexCode
nicht bei prozessoren sondern bei den befehlssätzen der prozessoren ist das nen unterschied
denk mal er meint den x86 |
Re: Assembler -> HexCode
das heisst ein pentium hat den selben befehlssatz wie ein athlon? es gibt aber doch noch so besondere befehlssätze(MMX, PowerNow)?!
|
Re: Assembler -> HexCode
Befehl satz x86 wird sowohl vom Intel als auch vom AMD unterstüzt.
Man kann abfargen ob ein bestimmter Processor einen bestimmten Befehlsatz unterstüzt und dann auch entsprechend reagieren/optimieren. x86 ist (fast) ein Standard ? :gruebel: Oder ? Zumindest inoffiziel ? :) |
Re: Assembler -> HexCode
Moin!
AMD, Transmeta, Cyrix etc versuchen natürlich kompatibel zu Intel bei ihren Prozessoren der x86 Reihe zu bleiben, weil es wäre schlecht, wenn Windows oder EXE'n auf der Konkurrenz nicht laufen würden, weil diese die Befehle anders belegen/integrieren. Schliesslich enthalten die ausführbaren Daten die direkten Opcodes der Prozessoren und sind keine Zwischenstufe wie z.B. bei Flash, Java und die .NET Zwischencompilate... MfG Muetze1 |
Re: Assembler -> HexCode
Hilft mir teilweise schon mal n bischen weiter nur:
Zitat:
1 = + oder - ?? Greetz Boombuler |
Re: Assembler -> HexCode
na wenn du von adresse 8100 nach adresse 8200 springen willst, musst du 8100-8200-5=-105 angeben. ob das aber negativ oder poisitiv angeben musst, weiss ich nicht. vor allem:wie stellt man negative werte dar?
|
Re: Assembler -> HexCode
Moin!
Wenn, dann schaut euch doch einfach die Befehlssatztabellen an die es bei den Herstellern gibt. Dort ist ganz genau beschrieben, wie welche Bits sich zusammensetzen und vor allem auch wie ihr diese Sprungoffsets berechnen müsst und einkodieren müsst. Da braucht ihr denn hier nicht lange zu rätseln. Ansonsten ist in der Interrupt List von Ralf Brown eine opcodes.lst wodrin der grundlegende x86 Befehlssatz genauso enthalten ist samt Kodierungsregeln... MfG Muetze1 |
Re: Assembler -> HexCode
Zitat:
![]() |
Re: Assembler -> HexCode
um einen ganz leichten API hook zu erstellen (ohne das man die vorherige funtkion wieder callen kann):
Delphi-Quellcode:
function myfunc(a,b,c,d: pchar); stdcall;
begin //... end; var p: pointer; old: cardinal; begin p := GetProcAddress(GetModuleHandle('user32.dll'),'MessageBoxA'); //dynamische adresse holen if VirtualProtect(p,5,PAGE_EXECUTE_READWRITE,old) then //schreibzugrif holen begin pbyte(integer(p)+0)^ := $E9; //$E9 opcode für jump, gewohnheit, pbyte(p)^ := $E9 geht auch pinteger(integer(p)+1) ^ := integer(@myfunc)-integer(p)-5; //distanz berechnen end; end; will man von adresse 4200 zu 4300 springen so wird gerechnet: 4300 -4200-5 = 95 wenn man das als integer macht wie im obigen beispiel bruach man sich um negative distanzen nicht mehr kümmern, das funktioniert wegen dem überlauf schon so (bzw integer kann auch negative zahlen darstellen) |
Re: Assembler -> HexCode
Wollt nur noch mal klar stellen im Prinzip geht es mir darum einen mini-Assembler Parser zu basteln...
Greetz Boombuler... |
Re: Assembler -> HexCode
na dann viel spass, ich habs mal versucht
![]() 1/3 aller befehle hab ich ca. |
Re: Assembler -> HexCode
Kurze frage noch hat jemand n plan wo ich die Befehlssätze herbekomme??
Thx Greetz Boombuler |
Re: Assembler -> HexCode
Von deinem
![]() ![]() punkt fünf, liste der opcodes. bzw. direkt: ![]() |
Re: Assembler -> HexCode
Thx mein freund scheint google nich gewesen zu sein oder ich war mal wieder zu blöd zum googlen...
Dann werd ich mich da mal ransetzten... Vielleicht gibbet ja mal ne Unit die ich hier poste wenn ich "fertig" bin! Greetz Boombuler PS: Alle 25 Jmp befehle kann ich schon mal übersetzten :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:00 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