muito bom pra quem quer estudar assembly
Hotkey Base em ASM
@open|Fire bom trabalho, muito bom saber de mais um codificador ASM.
Não sei qual compilador ASM está a usar, mas muitos comandos podem ser chamados com o invoke, no caso dos GetAsyncKeyState, das CreateThread e dos Sleep com isso eliminando algumas linhas, mas nada contra seu trabalho, muito bom mesmo.
Só para o pessoal que não entendeu da minha explicação, open|Fire usou argumento a argumento ao programar, estando certíssimo esse modo também, mas quem quiser simplificar o conceito do ASM, segue abaixo a explicação detalhadamente.
Código open|Fire simplificado:
Outra parte que também pode ser simplificada seria nas escritas em memórias das trapaças, porém não me recordo de como fazer isso no momento, mas quem quiser se aventurar, o comando é o invoke WriteMemory que me lembro.
Finalizando, uma boa tarde a todos.
Não sei qual compilador ASM está a usar, mas muitos comandos podem ser chamados com o invoke, no caso dos GetAsyncKeyState, das CreateThread e dos Sleep com isso eliminando algumas linhas, mas nada contra seu trabalho, muito bom mesmo.
Só para o pessoal que não entendeu da minha explicação, open|Fire usou argumento a argumento ao programar, estando certíssimo esse modo também, mas quem quiser simplificar o conceito do ASM, segue abaixo a explicação detalhadamente.
Code:
Essa parte com 2 linhas. push VK_NUMPAD1 call GetAsyncKeyState Pode ser feito com apenas 1 linha. invoke GetAsyncKeyState, VK_NUMPAD1
Code:
Essa parte com 7 linhas. push 0 push 0 push 0 push offset Thread push 0 push 0 call CreateThread Pode ser feito com apenas 1 linha. invoke CreateThread,0,0,offset Thread,0,0,0
Code:
Essa parte com 2 linhas. push 100 call Sleep Pode ser feito com apenas 1 linha. invoke Sleep,100
Code:
;XXXXX Código open|Fire simplificado XXXXX
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
.data
;Module
module db "CShell.dll",0
;Variable
names db 0
invisible db 0
norecoil db 0
noreload db 0
superbullets db 0
weaponrange db 0
rapidfire db 0
;Address
GameStatus dd 3780C6E8h
EspName1 dd 3736996Ch
EspName2 dd 37369A06h
Invisible dd 378165F5h
NoRecoil dd 3746136Ch
NoReload dd 374AD0D4h
SuperBullets dd 374A7DD6h
WeaponRange1 dd 374AD359h
WeaponRange2 dd 374AD5A9h
RapidFire dd 374ADB75h
.code
start:
isingame proc
mov eax,GameStatus
mov eax,[eax]
ret
isingame EndP
hack1 proc
invoke GetAsyncKeyState, VK_NUMPAD1
.if eax!=0
.if names==0
mov names,1
.else
mov names,0
.endif
.endif
invoke isingame
.if eax==1 && names
mov eax,EspName1
mov word ptr ds:[eax],9090h
mov eax,EspName2
mov word ptr ds:[eax],9090h
.else
mov eax,EspName1
mov word ptr ds:[eax],2175h
mov eax,EspName2
mov word ptr ds:[eax],0575h
.endif
ret
hack1 endp
hack2 proc
invoke GetAsyncKeyState, VK_NUMPAD2
.if eax!=0
.if invisible==0
mov invisible,1
.else
mov invisible,0
.endif
.endif
invoke isingame
.if eax==1 && invisible
mov eax,Invisible
mov byte ptr ds:[eax],01h
.else
mov eax,Invisible
mov byte ptr ds:[eax],00h
.endif
ret
hack2 endp
hack3 proc
invoke GetAsyncKeyState, VK_NUMPAD3
.if eax!=0
.if norecoil==0
mov norecoil,1
.else
mov norecoil,0
.endif
.endif
invoke isingame
.if eax==1 && norecoil
mov eax,NoRecoil
mov dword ptr ds:[eax],90909090h
.else
mov eax,NoRecoil
mov dword ptr ds:[eax],102444D9h
.endif
ret
hack3 endp
hack4 proc
invoke GetAsyncKeyState, VK_NUMPAD4
.if eax!=0
.if noreload==0
mov noreload,1
.else
mov noreload,0
.endif
.endif
invoke isingame
.if eax==1 && noreload
mov eax,NoReload
mov dword ptr ds:[eax],90909090h
mov word ptr ds:[eax+4],9090h
.else
mov eax,NoReload
mov dword ptr ds:[eax],01B1840Fh
mov word ptr ds:[eax+4],0000h
.endif
ret
hack4 endp
hack5 proc
invoke GetAsyncKeyState, VK_NUMPAD5
.if eax!=0
.if superbullets==0
mov superbullets,1
.else
mov superbullets,0
.endif
.endif
invoke isingame
.if eax==1 && superbullets
mov eax,SuperBullets
mov dword ptr ds:[eax],5E909090h
.else
mov eax,SuperBullets
mov dword ptr ds:[eax],5EC0940Fh
.endif
ret
hack5 endp
hack6 proc
invoke GetAsyncKeyState, VK_NUMPAD6
.if eax!=0
.if weaponrange==0
mov weaponrange,1
.else
mov weaponrange,0
.endif
.endif
invoke isingame
.if eax==1 && weaponrange
mov eax,WeaponRange1
mov dword ptr ds:[eax],000000B8h
mov word ptr ds:[eax+4],9010h
mov eax,WeaponRange2
mov dword ptr ds:[eax],000000B8h
mov word ptr ds:[eax+4],9010h
.else
mov eax,WeaponRange1
mov dword ptr ds:[eax],02C8808Bh
mov word ptr ds:[eax+4],0000h
mov eax,WeaponRange2
mov dword ptr ds:[eax],02C8808Bh
mov word ptr ds:[eax+4],0000h
.endif
ret
hack6 endp
hack7 proc
invoke GetAsyncKeyState, VK_NUMPAD7
.if eax!=0
.if rapidfire==0
mov rapidfire,1
.else
mov rapidfire,0
.endif
.endif
invoke isingame
push eax
invoke GetAsyncKeyState, VK_LBUTTON
pop edx
.if edx==1 && eax!=0 && rapidfire
mov eax,RapidFire
mov word ptr ds:[eax],9090h
.else
mov eax,RapidFire
mov word ptr ds:[eax],3E74h
.endif
ret
hack7 endp
Thread proc
.while 1
invoke GetModuleHandle,offset module
.if eax!=NULL
.break
.endif
invoke Sleep,100
.endw
.while 1
invoke hack1
invoke hack2
invoke hack3
invoke hack4
invoke hack5
invoke hack6
invoke hack7
invoke Sleep,100
.endw
ret
Thread endp
DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
.if reason==DLL_PROCESS_ATTACH
invoke CreateThread,0,0,offset Thread,0,0,0
.endif
ret 1
DllEntry Endp
End DllEntry
Finalizando, uma boa tarde a todos.
Bom o WE11ington disse que todos os hacks de console da pra se fazer em modo memória, assim se eu achar addie + bytes do NXChams, daria pra usar numa boa.
O Art Of Assembly tem num tópico que eu mesmo postei aqui 1426 páginas é zica mas vale a pena.
Valeu pelas respostas e ta aí pra quem não sabia.
Off-Topic - @WE11ington Você considera o "Art of Assembly" bom?Recomenda algum outro?Algum comentário?
É Sempre bom ter alguém que entende bastante do assunto comentar sobre isso
O Art Of Assembly tem num tópico que eu mesmo postei aqui 1426 páginas é zica mas vale a pena.
Valeu pelas respostas e ta aí pra quem não sabia.
Off-Topic - @WE11ington Você considera o "Art of Assembly" bom?Recomenda algum outro?Algum comentário?
É Sempre bom ter alguém que entende bastante do assunto comentar sobre isso
@WE11ington Estou a usar o Masm32 e realmente se pode usar o invoke mas eu não uso macros só usei macros no .while e .if else para o pessoal entender melhor o código, mas quem quiser usar invoke pode usar não deixa de ser Assembly.
Só que usando macros você não ira aprender como funciona a stack, como os parâmetros de uma função são passados para stack, e não irá aprender como funciona as comparações e saltos condicionais, etc.
A respeito de simplificar a escrita na memória você pode usar RtlMoveMemory que fica na Kernel32.lib
Obrigado por compartilhar o código simplificado vai ajudar os iniciantes.
@BACKD00R muito raro eu entrar em msn, mais fácil me mandar por PM que eu sempre passo aqui quando tenho tempo livre.
Só que usando macros você não ira aprender como funciona a stack, como os parâmetros de uma função são passados para stack, e não irá aprender como funciona as comparações e saltos condicionais, etc.
A respeito de simplificar a escrita na memória você pode usar RtlMoveMemory que fica na Kernel32.lib
Obrigado por compartilhar o código simplificado vai ajudar os iniciantes.
@BACKD00R muito raro eu entrar em msn, mais fácil me mandar por PM que eu sempre passo aqui quando tenho tempo livre.
Eu uso o TASM (Borland) mas ele cria um arquivo .obj, alguma boa alma poderia compartilhar o TLINK comigo?É meio impossível achar.
TLink - transforma .obj em exe
TLink - transforma .obj em exe
A pedido do @WE11ington
Ai está a versão simplificada com o uso da Macro invoke e da API RtlMoveMemory localizada na Kernel32.
@ChaosMagician Recomendo usar o Masm32 ou o Nasm, mas procura no google que acha o TLink
Ai está a versão simplificada com o uso da Macro invoke e da API RtlMoveMemory localizada na Kernel32.
Code:
;XXXXX Código open|Fire simplificado XXXXX
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
.data
;Module
module db "CShell.dll",0
;Variable
names db 0
invisible db 0
norecoil db 0
noreload db 0
superbullets db 0
weaponrange db 0
rapidfire db 0
;Address
GameStatus dd 3780C6E8h
EspName1 dd 3736996Ch
EspName2 dd 37369A06h
Invisible dd 378165F5h
NoRecoil dd 3746136Ch
NoReload dd 374AD0D4h
SuperBullets dd 374A7DD6h
WeaponRange1 dd 374AD359h
WeaponRange2 dd 374AD5A9h
RapidFire dd 374ADB75h
;Bytes
nops db 90h,90h,90h,90h,90h,90h
espbytes1 db 75h,21h
espbytes2 db 75h,05h
invibyteson db 01h
invibytesoff db 00h
norecoilbytes db 0D9h,44h,24h,10h
noreloadbytes db 0Fh,84h,0B1h,01h,00h,00h
superbulbytes db 0Fh,94h,0C0h
weaponbyteson db 0B8h,00h,00h,00h,10h,90h
weaponbytesoff db 8Bh,80h,0C8h,02h,00h,00h
rapidfirebytes db 74h,3Eh
.code
start:
isingame proc
mov eax,GameStatus
mov eax,[eax]
ret
isingame EndP
hack1 proc
invoke GetAsyncKeyState, VK_NUMPAD1
.if eax!=0
.if names==0
mov names,1
.else
mov names,0
.endif
.endif
invoke isingame
.if eax==1 && names
invoke RtlMoveMemory,EspName1,addr nops,2
invoke RtlMoveMemory,EspName2,addr nops,2
.else
invoke RtlMoveMemory,EspName1,addr espbytes1,2
invoke RtlMoveMemory,EspName2,addr espbytes2,2
.endif
ret
hack1 endp
hack2 proc
invoke GetAsyncKeyState, VK_NUMPAD2
.if eax!=0
.if invisible==0
mov invisible,1
.else
mov invisible,0
.endif
.endif
invoke isingame
.if eax==1 && invisible
invoke RtlMoveMemory,Invisible,addr invibyteson,1
.else
invoke RtlMoveMemory,Invisible,addr invibytesoff,1
.endif
ret
hack2 endp
hack3 proc
invoke GetAsyncKeyState, VK_NUMPAD3
.if eax!=0
.if norecoil==0
mov norecoil,1
.else
mov norecoil,0
.endif
.endif
invoke isingame
.if eax==1 && norecoil
invoke RtlMoveMemory,NoRecoil,addr nops,4
.else
invoke RtlMoveMemory,NoRecoil,addr norecoilbytes,4
.endif
ret
hack3 endp
hack4 proc
invoke GetAsyncKeyState, VK_NUMPAD4
.if eax!=0
.if noreload==0
mov noreload,1
.else
mov noreload,0
.endif
.endif
invoke isingame
.if eax==1 && noreload
invoke RtlMoveMemory,NoReload,addr nops,6
.else
invoke RtlMoveMemory,NoReload,addr noreloadbytes,6
.endif
ret
hack4 endp
hack5 proc
invoke GetAsyncKeyState, VK_NUMPAD5
.if eax!=0
.if superbullets==0
mov superbullets,1
.else
mov superbullets,0
.endif
.endif
invoke isingame
.if eax==1 && superbullets
invoke RtlMoveMemory,SuperBullets,addr nops,3
.else
invoke RtlMoveMemory,SuperBullets,addr superbulbytes,3
.endif
ret
hack5 endp
hack6 proc
invoke GetAsyncKeyState, VK_NUMPAD6
.if eax!=0
.if weaponrange==0
mov weaponrange,1
.else
mov weaponrange,0
.endif
.endif
invoke isingame
.if eax==1 && weaponrange
invoke RtlMoveMemory,WeaponRange1,addr weaponbyteson,6
invoke RtlMoveMemory,WeaponRange2,addr weaponbyteson,6
.else
invoke RtlMoveMemory,WeaponRange1,addr weaponbytesoff,6
invoke RtlMoveMemory,WeaponRange2,addr weaponbytesoff,6
.endif
ret
hack6 endp
hack7 proc
invoke GetAsyncKeyState, VK_NUMPAD7
.if eax!=0
.if rapidfire==0
mov rapidfire,1
.else
mov rapidfire,0
.endif
.endif
invoke isingame
push eax
invoke GetAsyncKeyState, VK_LBUTTON
pop edx
.if edx==1 && eax!=0 && rapidfire
invoke RtlMoveMemory,RapidFire,addr nops,2
.else
invoke RtlMoveMemory,RapidFire,addr rapidfirebytes,2
.endif
ret
hack7 endp
Thread proc
.while 1
invoke GetModuleHandle,offset module
.if eax!=NULL
.break
.endif
invoke Sleep,100
.endw
.while 1
invoke hack1
invoke hack2
invoke hack3
invoke hack4
invoke hack5
invoke hack6
invoke hack7
invoke Sleep,100
.endw
ret
Thread endp
DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
.if reason==DLL_PROCESS_ATTACH
invoke CreateThread,0,0,offset Thread,0,0,0
.endif
ret 1
DllEntry Endp
End DllEntry
@ChaosMagician Recomendo usar o Masm32 ou o Nasm, mas procura no google que acha o TLink
É mas tenho um trabalho feito em tasm, e dá algum erro no masm.
Irei checkar o código...
Irei checkar o código...
This thread is closed for replies.