When invoking WriteProcessMemory, how can you get it to patch decimal instead of heximal. I have tried writing it all diffrent ways. I've tried to get it to write in hex; but for some reason it patches 32 to the offset instead of the 66 66.. I figure I can sole this by writing it in decimal, which is '26214';but it won't patch at all when I do that. If someone would be so kind to help I would appreciate it.....
writebytes db '66,66'
address equ 0079A688h
invoke WriteProcessMemory,gameprocess,address,offset writebytes,1,NULL
invoke CloseHandle, phandle
There are two ways you could do this... Either write:
writebytes db '66h,66h' ; h means hex value
or
writebytes db '102,102' ; dec equivalent of 66h
Thank you, I was able to get my program to patch memory somewhat correctly now. However, I have run into a diffrent problem.....
I have 2 bytes, A3 and A6. When ever I try to compile my program it gives me this error.
error A2006, undefined symbol A3h
error A2006, undefined symbol A6h
what does this mean and how can I fix it????
writebytes1 db 66h
writebytes2 db 66h
writebytes3 db A3h
writebytes4 db 88h
writebytes5 db A6h
writebytes6 db 79h
writebytes7 db 00h
address1 equ 0079A688h
address2 equ 0079A689h
address3 equ 0044CA9Ch
address4 equ 0044CA9Dh
address5 equ 0044CA9Eh
address6 equ 0044CA9Fh
address7 equ 0044CAA0h
address8 equ 0044CAA1h
Any given piece of text in the file starts with an ascii character. Each piece of text is either a reserved word, or some user defined value (or label). Because hex values may start with an ascii character they are assumed to be a label instead (you can have a variable called A6 if you wanted right?), so all hex values must start with a number, so in your case you need to precede it with a '0' in order that the compiler can evaluate it as a number not some label or variable.
Basically change:
"writebytes3 db A3h" -> "writebytes3 db 0A3h"
"writebytes5 db A6h" -> "writebytes5 db 0A6h"
Then masm will realise you mean a number (and the h at the end means its hex).
Mirno
....BTW if you use "t" after a number, MASM knows it's decimal...
Just My 2¢,
Thanks everyone, I rewrote the source code as everyone suggested and it works perfectly. If anyone else has any suggestions on how I can improve this please post ;). It's going to become an anti-cheat memory patch...
.386
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
checkforgame proto
WriteValue proto
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
Winmain proto :DWORD,:DWORD,:DWORD,:DWORD
.data
memname db "Delta Force 2, V1.06.15",0
ACPPATCH db "Deltaforcer Anti Cheat",0
TSPY db "TRAINER SPY",0
PEDREZ db "DF2 THE MEGA TRAINER",0
found db "trainer found, shutting down df2",0
error db "Error !!!!!",0
func db "RegisterServiceProcess", 0
szClassName db "Naughty!!!!!",0
CHEATER db "Naughty,Naughty... Don't be a CHEATER!! ;)",0
writebytes1 db 66h
writebytes2 db 66h
writebytes3 db 0A3h
writebytes4 db 88h
writebytes5 db 0A6h
writebytes6 db 79h
writebytes7 db 00h
address1 equ 0079A688h
address2 equ 0079A689h
address3 equ 0044CA9Ch
address4 equ 0044CA9Dh
address5 equ 0044CA9Eh
address6 equ 0044CA9Fh
address7 equ 0044CAA0h
address8 equ 0044CAA1h
ID_TIMER equ 1
TIMER_INTERRUPT equ 1000
pid dd ?
phandle dd ?
gamewnd dd ?
dwprocessid dd ?
gameprocess dd ?
hDlg HWND ?
RSP dd ?
IsWin dd ?
statClass db "STATIC",0
hInstance dd 0
kernel32 db "kernel32.dll", 0
hWnd dd 0
Kernel BYTE "Kernel32.dll",0
RegServiceProc BYTE "RegisterServiceProcess",0
.const
IDD_DIALOG1 equ 101
.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
Invoke DialogBoxParam, hInstance, IDD_DIALOG1, NULL, NULL, NULL
invoke ShowWindow ,hWnd,SW_HIDE
Invoke FindWindow, NULL, ADDR memname
invoke GetWindowThreadProcessId, eax, offset dwprocessid
invoke OpenProcess,PROCESS_VM_WRITE OR PROCESS_VM_OPERATION,NULL,dwprocessid
mov gameprocess, eax
invoke WriteValue
invoke GetModuleHandle ,ADDR Kernel
invoke GetProcAddress ,eax,ADDR RegServiceProc
push TRUE
push NULL
call dword ptr eax
invoke DialogBoxParamA,hInstance,eax,0,addr DlgProc,0
invoke ExitProcess,0
WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORD
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG
invoke RegisterClassEx,ADDR wc
invoke CreateWindowEx,WS_EX_LEFT,ADDR szClassName,NULL,WS_ICONIC,
NULL,NULL,NULL,NULL,NULL,NULL,hInst,NULL
mov hWnd,eax
WinMain endp
WriteValue Proc
patchloop:
Invoke FindWindow, NULL, ADDR ACPPATCH
.if (eax==0) ;if eax = 0 then its not running
ret 0
.elseif (eax==1)
jmp looptyloop
.endif
Invoke FindWindow, NULL, ADDR TSPY
.if (eax==0) ;if eax = 0 then its not running
jmp looptyloop
.elseif (eax==1)
jmp looptyloop
.endif
invoke FindWindow,ADDR PEDREZ,NULL
mov IsWin, eax
.if IsWin != NULL
invoke MessageBox,hWnd,ADDR CHEATER,ADDR szClassName,MB_OK
mov eax, 0
ret
.endif
looptyloop:
invoke GetModuleHandle ,ADDR Kernel
invoke GetProcAddress ,eax,ADDR RegServiceProc
push TRUE
push NULL
call dword ptr eax
invoke WriteProcessMemory,gameprocess,address1,offset writebytes1,1,NULL
invoke WriteProcessMemory,gameprocess,address2,offset writebytes2,1,NULL
invoke WriteProcessMemory,gameprocess,address3,offset writebytes3,1,NULL
invoke WriteProcessMemory,gameprocess,ad