|
You last visited: Today at 05:53
Advertisement
Problem mit DMA
Discussion on Problem mit DMA within the General Coding forum part of the Coders Den category.
05/22/2011, 14:15
|
#1
|
elite*gold: 0
Join Date: Jun 2009
Posts: 7
Received Thanks: 0
|
Problem mit DMA
Hey Leute,
ich hoffe, ihr könnt mir bei meinem kleinen (Verständnis-)Problem weiterhelfen.
Worum gehts?
Ich versuche DMA durch Code Injection auszutricksen. Leider hab ich ein kleines Problem mit der wechselnden Position des Gamecodes im Speicher.
Nehmen wir als Beispiel das Flash-Game Multitask 2. Dort will ich die abgelaufene Zeit freezen (Ich weiß, es macht keinen Sinn, ist jetzt nur ein Beispiel). Da diese Variable wohl dynamisch allociert (DMA) wird, versuche ich den entsprechenden Inkrementierungscode zu NOPpen. Dabei gehe ich wie folgt vor:
- Finden der Adresse mit CE (Die Zeit ist hier eine Doublevariable)
- Breakpoint-on-write auf die Variable
- Disassemblieren der gefunden Codestelle
- AusNoppen der betreffenden Zeile
So, das klappt soweit so gut.
Mein Problem hier ist jedoch (wie angekündigt), dass die Speicheradresse des Codes bei jedem Neustart (des Games) sich verändert und ich die oben erwähnten Schritte erneut ausführen muss.
Ich hab mehrere DMA-Tutorials durchgelesen. In jedem davon war die Rede, dass die Variablen dynamisch allociert werden, der Gamecode hingegen jedoch statisch ist.
Das ist jedoch ein Widerspruch zu dem, was ich jetzt vorliegen habe.
Wie muss man diese Aussage "der Gamecode ist statisch" verstehen?- Heisst es, dass er eine feste Position im Ram oder im Virtual Memory des PCs hat? (Das macht für mich keinen Sinn, da Windows das Programm doch da reinlädt, wo gerade Platz ist, oder?)
- Oder heisst es, dass er ein festes Offset zur Startadresse des Games hat? Also beispielsweise Game.exe+0x00000034.
- oder lieg ich mit beidem total daneben?
Wie kann ich im zweiten Fall die Startadresse herausfinden? Das finden des Offsets dürfte dann ja kein Problem sein.
Ich hoffe ihr könnt mir weiterhelfen.
Grüße,
Riches
|
|
|
05/22/2011, 18:08
|
#2
|
elite*gold: 150
Join Date: Dec 2010
Posts: 112
Received Thanks: 159
|
Quote:
da Windows das Programm doch da reinlädt, wo gerade Platz ist, oder?
|
Das Programm wird an die ImageBase Addresse geladen (die steht im PE Header des Programms und ist bei .exe Dateien meistens 0x400000).
Nur bestimmte Dlls werden an zufällige Addressen geladen (ab vista, ).
Evtl. hast du Code einer Dll verändert?
In welcher Sprache ist das Programm geschrieben, VB?
|
|
|
05/22/2011, 23:08
|
#3
|
elite*gold: 0
Join Date: Jun 2009
Posts: 7
Received Thanks: 0
|
Hey,
ich glaube, mein Text ist doch zu ungenau
Ich habe selbst noch kein Trainer/Hack etc. erstellen können, da die dazu nötigen Adressen des Programmcodes des Spiels, das ich hacken möchte, sich bei jedem Start verändert.
|
|
|
05/23/2011, 10:27
|
#4
|
elite*gold: 150
Join Date: Dec 2010
Posts: 112
Received Thanks: 159
|
Jaa, sehr ungenau.
1. Schau mal in der Memory Map (in Ollydbg "Alt + M"), in welchem Modul sich die Addresse befindet (main.exe, .dlls, stack usw.).
2. Und/oder poste die "Linker Info", aus PEiD ( ).
|
|
|
05/23/2011, 15:06
|
#5
|
elite*gold: 0
Join Date: Jun 2009
Posts: 7
Received Thanks: 0
|
Ich versuchs jetzt nochmal genauer zu erläutern
(Entschuldigt die Wasserzeichen bei den Screenshots )
Hier habe ich links das Flashgame Multitask 2 im Firefox 4 Browser gestartet.
Rechts habe ich mit Hilfe von Cheat Engine den Prozess "Plugin-container" geöffnet, in dem das Spiel bei Firefox "ausgelagert" wird.
Wie man unten in der Liste von CE sehen kann, habe ich bereits die Zeit als Doublevariable gefunden und gefrezzt.
Da mir das jedoch nicht ausreicht, setze ich nun einen Breakpoint auf diese Variable und finde folgende Codestelle(orange gekennzeichnet):
Mein Problem ist jetzt, dass diese Codestelle beim erneuten Starten des Spiels eine andere Adresse hat, d.h. nicht statisch ist. So muss ich jedes mal diese Stelle erneut aufsuchen und kann gar keinen Trainer schreiben, der einfach diese Stelle beispielsweise ausnoppt, da die Adresse jedesmal wechselt.
Leider weiß ich nichts damit anzufangen.
Eine kurze Frage am Ende noch:
Die Adressen, die bei CE oder Ollydbg angezeigt werden (also z.B. die Adresse der Codestelle oben), geben diese die absoulte Position im Arbeitsspeicher an oder sind das Virtual Adresses (d.h. 00 00 00 00 ist hier Anfang des Programms)?
Danke
|
|
|
05/23/2011, 19:14
|
#6
|
elite*gold: 150
Join Date: Dec 2010
Posts: 112
Received Thanks: 159
|
Natürlich sind das Virtuelle Addressen (Windows unterstützt "Paging").
Sieht so aus, als ob die plugin-container.exe das Flashgame jedesmal an eine andere Addresse lädt.
|
|
|
05/23/2011, 20:34
|
#7
|
elite*gold: 0
Join Date: Jun 2009
Posts: 7
Received Thanks: 0
|
Quote:
Originally Posted by Kiakar
Sieht so aus, als ob die plugin-container.exe das Flashgame jedesmal an eine andere Addresse lädt.
|
Daraus entnehme ich jetzt, dass es nicht möglich ist, einen Trainer einfach mit festen Adressen zu füttern und diese Codestellen verändern zu lassen :/
Was hälst du denn von der Idee, die Suche der Codestelle zu automatisieren? Das wäre jetzt meine Idee das Problem zu umgehen.
|
|
|
05/23/2011, 21:07
|
#8
|
elite*gold: 0
Join Date: Jun 2010
Posts: 5
Received Thanks: 0
|
Hey, ich hab noch nie einen flash-trainer geschrieben daher kp wie man das elegant löst.
Der Code liegt immer an anderer Stelle, also vermutet dass das Game im Heap liegt wo gerade genug Platz war. Olly -> Memory Map -> Sektion gesucht in der der Code liegt -> fail.
Der Code liegt immer in zwischen nem Bereich markiert als "stack of thread xy". Dann versucht rauszufinden welche DLL den Code im Stack gecallt hat; also ab Stelle mit Zugriff auf die Zähler-Adresse: Olly->Debug->SetCondition-> "command is one of:" RET, dann solange "Trace Over" bis caller gefunden: 01468383 call edx in npswf32.dll
Wenn "call edx" zum gewünschten Codepath mit Zugriff auf Zähler führt endet EDX bei mir immer auf 7A6 (z.B. 02F9B7A6). Unter der Adresse liegt dann immer der Einstieg in den Code:
02F9B7A6 55 PUSH EBP | 02F9B7A7 8BEC MOV EBP,ESP | 02F9B7A9 83EC 08 SUB ESP,8 | 02F9B7AC 895D FC MOV DWORD PTR SS:[EBP-4],EBX | 02F9B7AF 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8] | 02F9B7B2 8B5D 0C MOV EBX,DWORD PTR SS:[EBP+C] | 02F9B7B5 8B55 10 MOV EDX,DWORD PTR SS:[EBP+10] | 02F9B7B8 85DB TEST EBX,EBX | 02F9B7BA 75 1E JNZ SHORT 02F9B7DA | 02F9B7BC 8BC1 MOV EAX,ECX | 02F9B7BE 8B4D 0C MOV ECX,DWORD PTR SS:[EBP+C] | 02F9B7C1 8B1A MOV EBX,DWORD PTR DS:[EDX] | 02F9B7C3 83E3 F8 AND EBX,FFFFFFF8 | 02F9B7C6 891A MOV DWORD PTR DS:[EDX],EBX | 02F9B7C8 8B5D FC MOV EBX,DWORD PTR SS:[EBP-4] | 02F9B7CB 52 PUSH EDX | 02F9B7CC 51 PUSH ECX | 02F9B7CD 50 PUSH EAX | 02F9B7CE E8 DD0378FF CALL 0271BBB0 | 02F9B7D3 83C4 0C ADD ESP,0C | 02F9B7D6 8BE5 MOV ESP,EBP | 02F9B7D8 5D POP EBP | 02F9B7D9 C3 RETN |
Paar mal die Adresse angeguckt von der Stelle wo auf den Zähler zugegriffen wird ob der Abstand gleichbleibt zum Stack-Anfang, oder Programmeinstieg -> fail.
ABER: Der Abstand zwischen der Adresse in CALL 0271BBB0 und dem Zähler Zugriff ist immer derselbe! Einfach 0x6F abziehen = immer die letzten beiden Bytes auf 41 setzen und man landet an der gesuchten stelle (hier 0271BB41).
Jetzt musst du nur noch prüfen ob bei dir auch EDX immer mit 0x7A6 endet wenn an den Code gesprungen wird, dann Wert aus dem Call ... lesen, letzten 2 Byte auf 41 ändern -> Stelle gefunden.
Scheint mir von Hinten durchs Knie in den Kopf, aber funktioniert.. wenn jemand ne elegante Lösung kennt wär ich auch dankbar ^^ (btw. Zeitaufwand 2h~).
Zim
|
|
|
05/23/2011, 22:51
|
#9
|
elite*gold: 0
Join Date: Jun 2009
Posts: 7
Received Thanks: 0
|
Quote:
Originally Posted by InvaderZim
Der Code liegt immer an anderer Stelle, also vermutet dass das Game im Heap liegt wo gerade genug Platz war. Olly -> Memory Map -> Sektion gesucht in der der Code liegt -> fail.
Zim
|
Ich hab zwar nicht so viel Ahnung, aber ich hab rausgefunden, dass der Code, der die Zeit hochzählt, erst im Speicher ist, sobald man im Menu das Spiel einmal richtig gestartet hat. Damit meine ich, dass solange man sich im Menu befindet, ohne ein Spiel gespielt zu haben, sind die Funktionen auch unauffindbar. Das würde doch die Vermutung mit dem Heap stützen.
|
|
|
05/23/2011, 22:52
|
#10
|
elite*gold: 150
Join Date: Dec 2010
Posts: 112
Received Thanks: 159
|
Um Bytecodes in der Memory zu finden, kannst du z.B. benutzen. C++ Beispiele kann man googeln, das hier ist in asm.
Code:
.data
mbi MEMORY_BASIC_INFORMATION
lpAddress dd 10000000h ;start address
.code
@IsExecute:
invoke VirtualQuery, lpAddress, addr mbi, sizeof(MEMORY_BASIC_INFORMATION)
mov eax, mbi.AllocationProtect
.if eax==PAGE_EXECUTE_READ
.elseif eax==PAGE_EXECUTE_READWRITE
.elseif eax==PAGE_EXECUTE_WRITECOPY
.else ;no execution rights, so...
@NoExecute:
mov eax, lpAddress
add eax, mbi.RegionSize ;increase lpAddress by
mov lpAddress, eax ;mbi.RegionSize and
jmp @IsExecute ;continue the search
.endif
;example code to check if we found the right page
mov eax, lpAddress
cmp word ptr [eax], 5A4Dh
jne @NoExecute
|
|
|
05/24/2011, 00:31
|
#11
|
elite*gold: 0
Join Date: Mar 2008
Posts: 747
Received Thanks: 245
|
Quote:
Originally Posted by Kiakar
Um Bytecodes in der Memory zu finden, kannst du z.B. benutzen. C++ Beispiele kann man googeln, das hier ist in asm.
Code:
.data
mbi MEMORY_BASIC_INFORMATION
lpAddress dd 10000000h ;start address
.code
@IsExecute:
invoke VirtualQuery, lpAddress, addr mbi, sizeof(MEMORY_BASIC_INFORMATION)
mov eax, mbi.AllocationProtect
.if eax==PAGE_EXECUTE_READ
.elseif eax==PAGE_EXECUTE_READWRITE
.elseif eax==PAGE_EXECUTE_WRITECOPY
.else ;no execution rights, so...
@NoExecute:
mov eax, lpAddress
add eax, mbi.RegionSize ;increase lpAddress by
mov lpAddress, eax ;mbi.RegionSize and
jmp @IsExecute ;continue the search
.endif
;example code to check if we found the right page
mov eax, lpAddress
cmp word ptr [eax], 5A4Dh
jne @NoExecute
|
Wie kann jemmand der in Assembler Programmieren will nur so einen schlechten programmierstil haben.
|
|
|
05/24/2011, 12:40
|
#12
|
elite*gold: 0
Join Date: Jun 2009
Posts: 7
Received Thanks: 0
|
Weiß denn jemand, wodurch der Code immer an einer anderen Stelle zu finden ist?
Kann man das als Codeshifting oder so bezeichnen? :/
|
|
|
05/24/2011, 15:33
|
#13
|
elite*gold: 0
Join Date: Feb 2010
Posts: 18
Received Thanks: 0
|
i dont know convert english
|
|
|
05/25/2011, 12:57
|
#14
|
elite*gold: 0
Join Date: Jun 2009
Posts: 7
Received Thanks: 0
|
Quote:
Originally Posted by besimbicer
i dont know convert english
|
So i have a problem with the flash game multitask 2. Its gamecode is always shifiting and i can't really calculate the position of certain codelines after restarting the game
|
|
|
|
Similar Threads
|
[Hilfe]Ungelöstes Server Erstell Problem, ausführliche Problem Schilderung
09/15/2011 - Flyff Private Server - 8 Replies
Hey Com!
Ich hoffe, dass dieser Thread nicht als Spamthread angesehen wird, da ich ja gestern schon einen zu diesem Thema eröffnet habe.
Sorry wenn ich euch mit dem Thema nerve, aber ich sitze nun schon 4 Tage über dem Problem, und finde einfach keine Lösung.
Nun werde ich hier allerdings eine ausführlichere Beschreibung des Problems geben.
Mein Problem ist, dass ich den Windows Mssql Server 2008/2005 aus Sedrika's TuT nicht installieren kann, da sobald ich ihn immer installiere...
|
[Problem] Problem with server starting - cannot find quest index for PaxHeader
12/22/2009 - Metin2 Private Server - 1 Replies
Hello!
I have this same problem as here when i'm starting my server:
http://www.elitepvpers.com/forum/metin2-pserver-di scussions-questions/307143-metin2-serverfiles-ques t-index-fehler.html
But I didn't know the answer.. how to repair this?
Greetings
|
All times are GMT +2. The time now is 05:53.
|
|