[Frage]Opcode to Bytes

10/06/2014 19:48 -SoulCr4ck-#1
Hey C/C++ Sektion,

ich wollte fragen wie es möglich ist opcode zu bytes umzuwandeln.
da ich ein Autoupdater in eine Programm einbaun will und dieses Programm soll zmb. ein Call FFFFFFFF in ein Call 00000000 umwandeln ( je nach update der address ).

Code:
 E8 9D020000           - call WerFault.exe+405B8
^hier zum Beispiel call Prozess Address + 405B8 ist 9D020000

und ich versteht nicht wie ich dies umwandeln soll.

ich hab dies hier hin gepostet, da es in c++ geschrieben wurde und eventuell jemand von euch eine Funktion hat und eine gute Erklärung.

Ich hoffe ich bin nicht Falsch ._. ich wusste nicht wo es sonst hin muss.

Danke im Vorraus.

Mit freundlichen Grüßen

-SoulCr4ck-
10/06/2014 21:03 Jeoni#2
Der Aufbau einer Call-Instruktion ist erst das obligatorische E8, was quasi einfach bedeutet, dass die Instruktion ein call mit Delta-Argument ist und dann 4 Byte Delta. Das bedeutet, dass das Delta auf die Adresse der NÄCHSTEN Instruktion gerechnet wird, um die absolute Adresse der call-Instruktion zu erhalten.
In diesem Fall sind die 4 Argument-Byte 0x9D, 0x02, 0x00 und 0x00, woraus sich ein Delta von 0x0000029D ergibt (s. Endianess; Windows benutzt Little-Endian). Da das Ziel WerFault.exe+405B8 ist, ist die Adresse der Instruktion nach dem call also WerFault.exe+4031B bzw die Adresse des calls selber WerFault.exe+40316.
Das gleiche System findet sich auch bei direkten (bedingten und unbedingten) Sprüngen. Wenn das Argument nicht direkt eine Zahl ist, sondern ein register (bspw. call/jmp eax) oder eine Speicheradresse (bspw. call/jmp dword ptr [eax], call/jmp dword ptr [0xDEADBEEF], etc.), so wird der Inhalt des Registers / Speichers nicht als Delta, sondern direkt als absolute Adresse behandelt.
Ich hoffe, dass das anschaulich genug war.
Mit freundlichen Grüßen
Jeoni
10/06/2014 21:04 ​Tension#3
Code:
XXXXXXXX  E8 9D020000           - call WerFault.exe+0x405B8
XXXXXXXX => Die Adresse wo die Bytes gespeichert sind ( wäre hilfreich wenn du die dazu gepostet hättest ).

9D020000 ist ein Offset also: 0x029D
Um zu der Adresse WerFault.exe+0x405B8 zu gelangen gehst du wie folgt vor:
XXXXXXXX+0x029D+0x5 = WerFault.exe+0x405B8
( die +0x5 weil du von der Adresse XXXXXXX ausgehst )
WerFault.exe = Base Adresse des Programmes.
+0x405B8 = Offset wo die Funktion ist.

Also musst du erst mal wissen wo deine Zielfunktion liegt und danach rückwärts rechnen.

Zielfunktion-XXXXXXXX-0x5 => Call Adresse.

Nun musst du die Bytes nur noch überschreiben.

von Stackoverflow:
Code:
CURRENT_RVA: jmp (DESTINATION_RVA - CURRENT_RVA - 5 [sizeof(E9 xx xx xx xx)])
[Only registered and activated users can see links. Click Here To Register...]
(call und jmp verhält sich afaik gleich)

Aber wieso sollte der Updater call X zu call Y umwandeln sollen?


P.S:
Sieht aus als hättest du CE verwendet, würde ich nicht empfehlen, benutz lieber Ollydbg oder IDA Pro.
10/06/2014 21:31 -SoulCr4ck-#4
Quote:
Originally Posted by ​Tension View Post
Code:
XXXXXXXX  E8 9D020000           - call WerFault.exe+0x405B8
XXXXXXXX => Die Adresse wo die Bytes gespeichert sind ( wäre hilfreich wenn du die dazu gepostet hättest ).

9D020000 ist ein Offset also: 0x029D
Um zu der Adresse WerFault.exe+0x405B8 zu gelangen gehst du wie folgt vor:
XXXXXXXX+0x029D+0x5 = WerFault.exe+0x405B8
( die +0x5 weil du von der Adresse XXXXXXX ausgehst )
WerFault.exe = Base Adresse des Programmes.
+0x405B8 = Offset wo die Funktion ist.

Also musst du erst mal wissen wo deine Zielfunktion liegt und danach rückwärts rechnen.

Zielfunktion-XXXXXXXX-0x5 => Call Adresse.

Nun musst du die Bytes nur noch überschreiben.

von Stackoverflow:
Code:
CURRENT_RVA: jmp (DESTINATION_RVA - CURRENT_RVA - 5 [sizeof(E9 xx xx xx xx)])
[Only registered and activated users can see links. Click Here To Register...]
(call und jmp verhält sich afaik gleich)

Aber wieso sollte der Updater call X zu call Y umwandeln sollen?


P.S:
Sieht aus als hättest du CE verwendet, würde ich nicht empfehlen, benutz lieber Ollydbg oder IDA Pro.
Also Updated Address - Address Der Bytes - ByteLength = Bytes ? Hab ich's richtig verstanden ?

Ich will das umwandeln von Kick Vote zu Instant Kick und hab KB das uppen x)

Danke schonma
10/06/2014 21:38 ​Tension#5
Quote:
Originally Posted by -SoulCr4ck- View Post
Also Updated Address - Address Der Bytes - ByteLength = Bytes ? Hab ich's richtig verstanden ?
Updated Address - Call Address - 0x5 = call offset

Quote:
Originally Posted by -SoulCr4ck- View Post
Ich will das umwandeln von Kick Vote zu Instant Kick und hab KB das uppen x)
Willst du in einem Spiel den Call ändern oder wie? :confused: Also über Pattern scan?
10/06/2014 21:45 -SoulCr4ck-#6
Quote:
Originally Posted by ​Tension View Post
Updated Address - Call Address - 0x5 = call offset


Willst du in einem Spiel den Call ändern oder wie? :confused: Also über Pattern scan?
Ja das meinte ich..

Ja den Call Changen.

Also Call NewAddress und NewAddress vorher mit Find Pattern suchen.

----unterfrage im thread---
Ist es nicht auch möglich & warscheinlich einfacher ein JMP zu tätigen zu einer Neu erstellten Page mit code

Code:
_asm {
call instant_kick
jmp backaddress + SizeofBackaddress (0x5)
}
..Sollte eig. Einfacher Funktionieren oder?
Vorher ne If abfrage welche Funktionen genommen wurde zmb. Kick , Team Shuffle, Change Team und diese address dann in ner Variabele zuspeichern die dann gecallt wird.
10/06/2014 23:22 ​Tension#7
Quote:
Originally Posted by -SoulCr4ck- View Post
Also Call NewAddress und NewAddress vorher mit Find Pattern suchen.
Ja dann einfach die "Formel" anwenden.


Quote:
Originally Posted by -SoulCr4ck- View Post
----unterfrage im thread---
Ist es nicht auch möglich & warscheinlich einfacher ein JMP zu tätigen zu einer Neu erstellten Page mit code

Code:
_asm {
call instant_kick
jmp backaddress + SizeofBackaddress (0x5)
}
..Sollte eig. Einfacher Funktionieren oder?
Vorher ne If abfrage welche Funktionen genommen wurde zmb. Kick , Team Shuffle, Change Team und diese address dann in ner Variabele zuspeichern die dann gecallt wird.
Verwendest du eine Dll?
Du könntest einfach die Vote Kick Funktion mit der Instant Kick Funktion "überschreiben"
Also:
Code:
DWORD VoteKickAddress = FindPattern(xyz);
DWORD InstantKickAddress = FindPattern(xyz);
DetourFunction((PBYTE)VoteKickAddress, (PBYTE)InstantKickAddress);
10/06/2014 23:28 -SoulCr4ck-#8
Quote:
Originally Posted by ​Tension View Post
Ja dann einfach die "Formel" anwenden.




Verwendest du eine Dll?
Du könntest einfach die Vote Kick Funktion mit der Instant Kick Funktion "überschreiben"
Also:
Code:
DWORD VoteKickAddress = FindPattern(xyz);
DWORD InstantKickAddress = FindPattern(xyz);
DetourFunction((PBYTE)VoteKickAddress, (PBYTE)InstantKickAddress);
Genau das meinte ich :D

Zu ner eigender Funktion -> Call ausführen -> Jump Back zur Nächsten Funktion / Opcode

Und wenn man andere Funktionen einführen will dazwischen noch ne abfrage setzen ^-^

& Ja ist ne Dll :)