PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Trainer in ASM


Lordaron
12.10.2003, 15:54
Hallo Leute
ich habe ein großes problem wenn ich ein trainer in masm32 programmiere, nachdem ich ihn starte und die tasten f12 oder f11 drücken
werden die values nicht gepatcht aber das spiel wurde gefunden, was gebe ich falsch ein?
Ich habe jetzt als Bespiel das Spiel Solitär genommen!
bitte helft mir


das ist der source von .inc Datei

include /masm32/include/Comctl32.inc
include /masm32/include/windows.inc
include /masm32/include/user32.inc
include /masm32/include/kernel32.inc

includelib /masm32/lib/kernel32.lib
includelib /masm32/lib/user32.lib
includelib /masm32/lib/Comctl32.lib

DlgProc PROTO :HWND,:UINT,:WPARAM,:LPARAM
TrainerEngine Proto :BYTE

.const

IDD_DIALOG1 equ 101
IDC_GRP1 equ 1001
IDC_STC1 equ 1002
IDC_STC2 equ 1003
IDC_BTN1 equ 1004
IDC_BTN2 equ 1005
addie1 equ 952E8h
addie2 equ 952E9h

;TEngine2.Rc
ICON1 equ 201

.data
ErrorCaption db 'ERROR', 0
ErrorMessage db 'Spiel nicht gestartet',0ah
db 'Bitte Spiel starten!',0ah
db 'So You can Use the trainer',0
AboutCaption db 'About',0
AboutMessage db 'Trainer by me',0ah
db 'für Solitär',0ah
db 'CIAO',0
HelpCaption db 'Help',0
HelpMessage db 'Drücke im Spiel F12 oder', 0ah
db 'drücke F11',0
WindCap db 'Solitär',0
bytes2write db 064h



.data?

hInstance dd ?
hWnd dd ?
hGameWin dd ?
pid dd ?
pHandle dd ?
buffer1 dd ?




und das ist der source der .asm Datei


.386
.model flat, stdcall ;32 bit memory model
option casemap :none ;case sensitive

include trainer.inc

.code

start:

invoke GetModuleHandle,NULL
mov hInstance,eax

invoke InitCommonControls
invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL
invoke ExitProcess,0



DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

mov eax,uMsg
.if eax==WM_INITDIALOG
push hWin
pop hWnd
Invoke SetTimer,hWin,0,90,0
invoke LoadIcon,hInstance,ICON1 ;load icon from resource file
invoke SendMessage,hWnd,WM_SETICON,NULL,eax ;tell dialog to set it's icon

.elseif eax==WM_COMMAND
mov eax,wParam
and eax,0FFFFh

.if eax==IDC_BTN1
Invoke MessageBox,hWin,addr AboutMessage, addr AboutCaption,MB_OK
.elseif eax==IDC_BTN2
Invoke MessageBox,hWin,addr HelpMessage,addr HelpCaption,MB_OK
.endif

.elseif eax==WM_TIMER
Invoke GetAsyncKeyState, VK_F12
.if eax != 0
Invoke TrainerEngine,1
.endif
Invoke GetAsyncKeyState, VK_F11
.if eax != 0
Invoke TrainerEngine,2
.endif

.elseif eax==WM_CLOSE
invoke EndDialog,hWin,0
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret

DlgProc endp

TrainerEngine PROC _Option:BYTE

Invoke FindWindow,0,addr WindCap
.if eax==0
Invoke MessageBox,hWnd,addr ErrorMessage,addr ErrorCaption,MB_OK
ret
.endif

mov hGameWin,eax
Invoke GetWindowThreadProcessId,hGameWin,offset pid
Invoke OpenProcess,PROCESS_VM_READ + PROCESS_VM_WRITE,NULL,pid
mov pHandle,eax

mov al,byte ptr[_Option]
.if al==1 ;F12 Procedure
Invoke WriteProcessMemory,pHandle,addie1,offset bytes2write,4,NULL
.elseif al==2 ;F11 Procedure
Invoke ReadProcessMemory,pHandle,addie2,offset buffer1,2,NULL
add [buffer1],10
Invoke WriteProcessMemory,pHandle,addie2,offset buffer1,2,NULL
.endif

Invoke CloseHandle,pHandle
ret

TrainerEngine endp

end start

Was mach ich falsch
mfg Lordaron
Danke!


Jan Krüger
12.10.2003, 16:55
Ich würde dir raten, keinen Assembler-Code zu ändern, wenn du eigentlich gar nicht weißt, wie er funktioniert. Und wenn du noch einmal Code postest, ohne CODE-Tags zu benutzen, dann hetze ich die Schnecken auf dich. :p

PS. bist du sicher, dass die angegebenen Patch-Offsets stimmen? Dir ist klar, dass du da die Offsets der entsprechenden Stellen im Speicher und nicht die Dateioffsets angeben musst, oder?

Scavi
14.10.2003, 10:58
Ausserdem können sich die Speicheroffsets doch ändern.

Jan Krüger
14.10.2003, 18:25
Normalerweise wandert das Programm nicht im Arbeitsspeicher rum...

Scavi
15.10.2003, 17:30
Nein. Ich meinte bei jedem Laden ist es an einer anderen Stelle.

Jan Krüger
16.10.2003, 01:43
Im physikalischen Speicher ja, im virtuellen nein. Und da man unter Win32 mit virtuellen Offsets hantiert, gibt es da keine Probleme.

BarnyHop
24.11.2003, 17:08
Hallo Zusammen!

Der Fehler in dem Listing ist die Zeile
Invoke OpenProcess,PROCESS_VM_READ + PROCESS_VM_WRITE,NULL,pid
Ändert man die in
Invoke OpenProcess,PROCESS_ALL_ACCESS,NULL,pid
dann funktioniertes.
Wieso das so ist weis ich nicht. Bin selber noch Anfänger.

MFG
BarnyHop

Jan Krüger
24.11.2003, 19:26
Das ist überhaupt keine Änderung. Die folgende Gleichung gilt: PROCESS_ALL_ACCESS = PROCESS_VM_READ + PROCESS_VM_WRITE

BarnyHop
25.11.2003, 07:41
Hallo Jan!

Das das keinen Änderung ist habe ich mir auch schon gedacht. Aber trotzdem hat es nach diesem eingriff funktioniert. Da ich denn gleichen Assembler Code benutzt wie Lordaron hatte ich auch das gleiche Problem. Vielleicht liegt es am Assembler das er das nicht versteht oder richtig umsetzen kann. Benutze masm32 und RadASM© Win32. Aber dafür kenne ich mich zu wenig aus.

MFG
BarnyHop

Jan Krüger
25.11.2003, 22:22
Er hatte falsche Werte für die Überschreibung des Speichers angegeben. D.h. entweder hast du die Werte richtig angegeben, oder du hast eine andere Version von Solitär (die haben sich mit den unterschiedlichen Windows-Versionen gelegentlich ein bisschen geändert).

BarnyHop
26.11.2003, 08:17
Hallo Jan!

Ich habe ganz andere Werte, da ich einen Trainer für Delta Force Black Hawk Down schreibe. Habe das Ursprüngliche Listing für meinen zwecke erweitere. Was mir an diesem Listing gut gefallen hat, wahr das es mir gezeigt hat wie man ein Tastatur eingebe abfängt. (GetAsyncKeyState). Habe im Board gelesen das es noch andere Möglichkeiten gibt Tastatureingaben zu überprüfen aber die erschien mir vorerst recht einfach. Meine Adressen Liegen in der DFBHD.exe und nicht im hohen Speicher.
Zu der Sache mit PROCESS_ALL_ACCESS = PROCESS_VM_READ + PROCESS_VM_WRITE ist das nicht egal ob ich PROCESS_ALL_ACCESS oder PROCESS_VM_READ + PROCESS_VM_WRITE schreibe?
Oder gibt es da unterschiede.
Woran ich momentan noch nicht weiter komme, ist einen Wert aus einer Adresse zu sichern, in die Adresse den Wert Nul schreiben und später den gesicherten Wert wieder zurück schreiben.
Habe es mit ReadProcessMemory gemacht. Der Wert wird auch in die dafür angelegte Variable geschrieben aber wenn ich ihn wieder zurück schreiben will dann ist die Variabel die den gesicherten Wert haben soll Null.
Weist du da eine Lösung Jan?
Die Variable habe ich .data? angelegt.

MFG
BarnyHop

BarnyHop
17.12.2003, 18:48
Hallo Zusammen!

Wenn ich einen Speicherwert mit ReadProcessMemory in eine Variable schreibe, wie kann ich dies Variable in einem Editfeld anzeigen lassen. Habe es mit SetDlgItemText versucht aber das funktioniert nicht. Muß ich den wert aus der Variable erst umwandeln oder aufbereiten?
Und wen ja, wie?

Mein Code:
Invoke ReadProcessMemory, pHandle, addie4, addr buffer2, 2, NULL
invoke SetDlgItemText, hWnd, IDC_EDT1, addr

MFG
BarnyHop