Hotkey Base em ASM

Posts 16–22 of 22 · Page 2 of 2
muito bom pra quem quer estudar assembly
@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.

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
Código open|Fire simplificado:
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
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.
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
@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.
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
A pedido do @WE11ington

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...
Posts 16–22 of 22 · Page 2 of 2
This thread is closed for replies.

Tags for this Thread

None

Need help?