Cheat Engine Forum Index Cheat Engine
The Official Site of Cheat Engine
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 


[asm] DLL for ingame trainer menu

 
Post new topic   Reply to topic    Cheat Engine Forum Index -> General programming
View previous topic :: View next topic  
Author Message
dick_traced
Newbie cheater
Reputation: 0

Joined: 22 Sep 2011
Posts: 21

PostPosted: Thu Mar 29, 2012 12:53 am    Post subject: [asm] DLL for ingame trainer menu Reply with quote

does anyone want to share a (m)asm source code for a DLL that creates a ingame trainer menu?
Back to top
View user's profile Send private message
Dark Byte
Site Admin
Reputation: 471

Joined: 09 May 2003
Posts: 25833
Location: The netherlands

PostPosted: Thu Mar 29, 2012 3:02 am    Post subject: Reply with quote

I think you'll have more luck finding a higher level language like pascal or C++ that does this. (Hooking direct3d, creating new textures for the game that represent the gui components, and rendering the gui components each frame)

You could check ce 6.2's sourcecode for direct x mess, it contains code that allows you to draw images and texts inside the game (although the method of hooking that I use might not be something you wish to reproduce, if you can do creation time hooking, use that instead
And my implementation uses interprocess communication using shared memory and event objects, you might be able to put it all in one dll in the same process)

_________________
Do not ask me about online cheats. I don't know any and wont help finding them.

Like my help? Join me on Patreon so i can keep helping
Back to top
View user's profile Send private message MSN Messenger
Acubra
Advanced Cheater
Reputation: 0

Joined: 19 Jun 2011
Posts: 64
Location: C:\Windows\System32\HoG

PostPosted: Thu Mar 29, 2012 11:41 am    Post subject: Reply with quote

Hey,
there is a tutorial concerning exactly what you want. Unfortunately it is in german and all comments are in german too. But most things are self explanatory and I think it is enough to get the idea behind hooking direct x. However you have to change the varibales containing the dll names, since most games are using different direct x versions.

Here is the code:

Code:


;==============================================================================
; Titel: Das Trainer Menü verpackt in einer DLL
;==============================================================================

; hier werde ich euch zeigen, wie ihr eine DLL erstellt, mit der ihr einen sogenannten
; Hook installieren könnt, um letztendlich euer Trainer Menü anzeigen zu lassen
; Voraussetzung ist allerdings, dass ihr was von DirectX verstanden habt, denn das werde ich
; hier nicht mehr erklären, dazu habe ich bereits ein anderes Tutorial geschrieben

; Die Theorie dahinter ist, dass wir den Aufruf der "EndScene" Funktion abfangen und erst
; noch unseren eigenen code ausführen lassen, bevor dann gerendert wird
; Warum fangen wir EndScene ab? ... ganz einfach, wenn das game diese Funktion aufruft, dann
; hat es bereits alle seine eigenen Sachen gerendert und wir können ganz bequem unser Menü
; injecten

.386 ; der übliche kram
.model flat, stdcall ; am Anfang eines Assembler
option casemap :none ; Programms

; unsere selbstgebastelten Funktionen werden hier deklariert

TrnEng PROTO :DWORD, :DWORD, :DWORD ; eine TrainerEngine für innerhalb von DLL's
check_hotkey PROTO ; ein proc zum checken von hotkeys

; hier kommen die importe

include  windows.inc
include kernel32.inc
include user32.inc

includelib kernel32.lib
includelib user32.lib

.data
FontName db 'Arial',0 ; Schriftart
TextToDisplay1 db 'Infinite Stuff',0 ; irgendein Text
TextToDisplay2 db 'Unlimited Shit',0 ; noch'n Text
TextToDisplay3 db 'Refill my beer',0 ; und noch'n Text
d3d9 db 'd3d9.dll',0 ; unsere geliebte Direct3D Dll
d3dx9 db 'd3dx9_43.dll',0 ; die Dll mit den Spezial funktionen
szInjected   db   "called main from dll", 0
szTitle      db   "d3d9 menu", 0
; ihr müsst nachschauen, ob euer game so eine
; DLL schon geladen hat (z.B. d3dx9_30.dll), dann
; müsst ihr sie anders nennen
menutoggle BOOLEAN FALSE ; Menü Aktivierungsstatus
current_item dd 1 ; momentan gewähltes Menü Item
FontFunction db 'D3DXCreateFontA',0 ; die Funktion zum erstellen der Schrift
EndSceneAddy dd 871A0h ; das Offset der EndScene Funktion, wenn ihr
; die Basis Adresse von d3d9.dll habt (was dem
; handle entspricht) dann addiert diesen Wert
; und ihr habt den Anfang der EndScene Adresse
; inerhalb der d3d9.dll

.data?
pd3d_device dd ? ; Pointer für das D3D Device
pd3d_font dd ? ; Pointer für die Schrift
hInst dd ? ; DLL Instanz
dummy dd ? ; Variable zum speichern von Scheiße
d3d9_base dd ? ; Basis Adresse (handle) d3d9.dll
h_d3dx9 dd ? ; handle (Basis Adresse) d3dx9_25.dll
oldprotection dd ? ; brauchen wir für "VirtualProtect"
rct RECT <> ; zum darstellen unseres Textes

.const
DrawText equ 038h ; die altbekannten Offsets, allerdings
Release equ 008h ; brauchen wir diesmal nur zwei

; Bei einer DLL verhält es sich so, dass wenn sie in einen Prozess geladen wird, dass dann
; als erstes die DLL Main Funktion aufgerufen wird, also kommt hier der ganz wichtige code
; rein, der ausgeführt werden muss, damit unser Menü überhaupt funktioniert
; Aber eigentlich solltet ihr schon wissen, was es mit DLL's auf sich hat, das gehört eigentlich
; mit zum Grundwissen
; während ihr die DLL programmiert immer dran denken, dass ihr euch bereits im Prozess des Games
; befindet, denn wir gehen ja davon aus, dass das game unsere DLL geladen hat, also können wir
; uns verhalten, als ob wir im eigenen Prozess schalten und walten


.code
;#############################################################################################
Main PROC hInstDLL:DWORD,reason:DWORD,reserved1:DWORD


invoke MessageBox, NULL, addr szInjected, addr szTitle, MB_OK

push edi ; zwei wichtige Register, werden zur
push esi ; Sicherung auf den Stack gepusht

push hInstDLL ; das handle unsere DLL Instanz
pop hInst ; wird gespeichert

cmp reason,DLL_PROCESS_ATTACH ; wurde diese Funktion aufgerufen, weil
jne not_attached ; die DLL reingeladen wurde
; wenn nicht, dann springe zum Ende

invoke GetModuleHandle,addr d3d9 ; Basis Adresse (handle) der Direct3D DLL
mov d3d9_base,eax ; speichern
add EndSceneAddy,eax ; jez enthält EndSceneAddy die
; die vollständige Adresse von EndScene

; nun wollen wir unseren Hook setzen, d.h. wir wollen die original EndScene Funktion in unsere
; DLL umleiten ... dazu schreiben wir einfach einen "jmp" Befehl an den Anfang der EndScene
; Funktion und berechnen, wohin wir jumpen müssen

; erstmal Schreib- und Zugriffsrechte für den Speicherbereich bekommen
invoke VirtualProtect,EndSceneAddy,5,PAGE_EXECUTE_READWRITE,addr oldprotection

mov edi,EndSceneAddy ; die vollständige Adresse zu EndScene
mov ebx,offset EndSceneHook ; das Label unseres Hooks, siehe unten
sub ebx,edi ; die Differenz ist der Betrag an Bytes
; um den gesprungen werden muss
sub ebx,5 ; 5 bytes abziehen, wegen des jmp Befehl
mov byte ptr [edi],0E9h ; 0E9h steht für einen weiten sprung
inc edi ; 1 byte hinter 0E9h kommt die Sprungweite
mov dword ptr [edi],ebx ; ebx enthält die Sprungweite, 4 bytes

; alte Zugriffsrechte wiederherstellen
invoke VirtualProtect,EndSceneAddy,5,oldprotection,addr dummy

add EndSceneAddy,5 ; wir springen nachher hinter unseren
; jmp befehl zurück, darum +5 bytes

; dieser Thread dient nur zum checken von hotkeys
invoke CreateThread,0,0,offset check_hotkey,0,NORMAL_PRIORITY_CLASS,addr dummy

not_attached: ; hierher gehts, wenn DLL nicht geladen

pop esi ; die gespeicherten Register
pop edi ; wieder zurückgeben


mov eax,TRUE ; Alles wird gut ;-)
ret ; zurück zum Absender

Main ENDP
;#############################################################################################

EndSceneHook: ; zu diesem Label springt die d3d9.dll
; nach der Umleitung, d.h. statt EndScene
; wird zuerst dieser kram hier aufgerufen

pop dummy ; als erstes speichern wir irgendeinen
; komischen scheißwert
pop pd3d_device ; aber jez kommt das wichtige Device, dass
; man ja so ziemlich für alles braucht
push pd3d_device ; alles brav zurück auf den Stack pushen
push dummy ; damit der Kram hier nicht crasht

pushfd ; den Flagstatus komplett speichern
pushad ; alle Register speichern

call DrawMenu ; hier könnt ihr jetzt jeglichen
; Direct3D Quatsch hinschreiben, den ihr
; wollt, aber fürs erste soll einfach
; nur ein Menü gezeichnet werden

popad ; alle Register wieder hervorholen
popfd ; genauso den Flagstatus wiederherstellen

mov edi,edi ; das hier sind die eigentlichen ersten
push ebp ; 5 bytes von EndScene ... ihr erinnert
mov ebp,esp ; euch, wir haben sie mit einem jmp
; überschrieben, also müssen sie wieder
; hergestellt werden, wie bei einer
; Code Injection mit der Code Cave

jmp EndSceneAddy ; springe zurück um EndScene jetzt
; tatsächlich auszuführen

; einfach ist hierbei, dass wir kein Direct3D Device mehr selber erzeugen müssen,
; das hat ja schon das Game für uns erledigt, also können wir direkt mit dem Zeug anfangen,
; was im ersten Tutorial im render proc drin steht

;#############################################################################################
DrawMenu PROC

cmp menutoggle,TRUE ; soll das Menü aktiv sein
jne outta_here ; wenn nicht springe weg von hier

invoke GetActiveWindow ; das aktive Fenster ist meistens das game
invoke GetClientRect,eax,addr rct ; wo können wir zeichnen?
add rct.top,50 ; wir wollen nicht ganz in der linken
add rct.left,20 ; oberen Ecke zeichnen

; ich mache hier standardmäßig ein LoadLibary, da es ja sein kann, dass das game die
; "d3dx9_25.dll" (oder eine neuere Version davon) noch nicht geladen hat und LoadLibrary gibt
; immer das handle zurück, egal ob die dll bereits geladen ist oder nicht
; Ihr könnt natürlich auch GetModuleHandle verwenden, falls ihr wisst, das die dll bereits in
; den Prozess geladen wurde

invoke LoadLibrary,addr d3dx9 ; dll laden und handle bekommen
invoke GetProcAddress,eax,addr FontFunction ; Adresse der CreateFont geschichte
mov ecx,eax ; in ecx speichern

push offset pd3d_font ; späterer Speicher für den FontPointer
push offset FontName ; Name der Schrift
push (DEFAULT_PITCH+FF_DONTCARE) ; Format zur Darstellung
push 4 ; Qualität
push OUT_DEFAULT_PRECIS ; Präzision
push DEFAULT_CHARSET ; CharacterSet ist normal
push FALSE ; kursiv
push 1 ; MipMap Levels oder so
push FW_NORMAL ; wie Fett sind die Buchstaben
push 0 ; wie breit sind die Buchstaben
push 22 ; Schriftgröße
push pd3d_device ; unser Device
call ecx

.if current_item == 1 ; welcher Menüpunkt ausgesucht ist
push 0431B4h ; wird andersfarbig gemacht
.else
push 0431B4h ; Standardfarbe
.endif
push offset TextToDisplay1
call DrawTextLine ; meine eigene kleine Funktion, macht
; das leben etwas einfacher

.if current_item == 2
push 0431B4h
.else
push 0431B4h
.endif
push offset TextToDisplay2
call DrawTextLine

.if current_item == 3
push 0431B4h
.else
push 0431B4h
.endif
push offset TextToDisplay3
call DrawTextLine

mov eax,pd3d_font
push eax
mov ecx,[eax]
call dword ptr [ecx+Release] ; unsere Font wieder freigeben

; Da wir unsere Font bei jedem "Durchlauf" erzeugen, müssen wir sie auch jedesmal wieder
; zerstören

outta_here:
ret

DrawMenu ENDP
;#############################################################################################
DrawTextLine PROC TheText:DWORD,TheColor:DWORD

push TheColor ; Schriftfarbe
push (DT_LEFT+DT_WORDBREAK) ; Format
push offset rct ; Rechteck, in welchem geplottet wird
push -1 ; Unser String hat ein 0 als terminierung
push TheText ; Der Text
push 0 ; kein Text in einem Sprite
mov eax,pd3d_font
push eax
mov ecx,[eax]
call dword ptr [ecx+DrawText] ; schreib den Text

add rct.top,eax ; der Rückgabewert in eax ist die
; höhe des Textes der geschrieben wurde,
; also mal kurz addiert und schon
; schreiben wir in der nächsten Zeile

ret ; zurück

DrawTextLine ENDP
;#############################################################################################
check_hotkey PROC

_again:

invoke Sleep,100 ; nur alle 0,1 Sekunden Abfrage starten

invoke GetAsyncKeyState,VK_F1
.if eax != 0
invoke MessageBox, NULL, addr szInjected, addr szTitle, MB_OK
mov menutoggle,TRUE ; Menü an
.endif

invoke GetAsyncKeyState,VK_F2
.if eax != 0
mov menutoggle,FALSE ; Menü aus
.endif

invoke GetAsyncKeyState,VK_UP
.if eax != 0
.if (current_item > 1 && menutoggle == TRUE) ; ist das oberste Item selected ... ; selected ...
dec current_item ; wenn nicht, gehe noch einen höher
.endif
.endif

invoke GetAsyncKeyState,VK_DOWN
.if eax != 0
.if (current_item < 3 && menutoggle == TRUE) ; ist das unterste Item selected ...
inc current_item ; wenn nicht, gehe noch einen runter
.endif
.endif

jmp _again ; nochmal checken

check_hotkey ENDP
;#############################################################################################
TrnEng PROC Address:DWORD,lpNewValue:DWORD,nByte:DWORD

; dies ist eine TrainerEngine, für Aktionen im selben Prozess ... da die DLL ja ein
; Bestandteil des Game Prozesses ist, braucht man nicht diesen ganzen Quatsch mit
; WriteProcessMemory usw.

invoke VirtualProtect,Address,nByte,PAGE_EXECUTE_READWRITE,addr dummy
mov ecx,nByte ; wieviele bytes zum kopieren
mov esi,lpNewValue ; von wo kopieren
mov edi,Address ; wohin kopieren
rep movsb ; kopiere!!!
ret

TrnEng ENDP
;#############################################################################################
END Main

Back to top
View user's profile Send private message
atom0s
Moderator
Reputation: 205

Joined: 25 Jan 2006
Posts: 8587
Location: 127.0.0.1

PostPosted: Thu Mar 29, 2012 11:46 am    Post subject: Reply with quote

Check out some of attilathedud's posts on DoxCoding here:
http://www.doxcoding.com/forums/index.php

_________________
- Retired.
Back to top
View user's profile Send private message Visit poster's website
Display posts from previous:   
Post new topic   Reply to topic    Cheat Engine Forum Index -> General programming All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2005 phpBB Group

CE Wiki   IRC (#CEF)   Twitter
Third party websites