Ver um Único Post
Antigo 25-03-2010, 08:45 PM   #1 (permalink)
NecroBoy
Amigo SE
 
Avatar de NecroBoy
 
Registrado em: Nov 2009
Localização: SMA Vip
Posts: 1,301
Agradeceu: 197
Agradecido 564 Vezes em 328 Posts
Achei Ruim:
Acharam ruim Vezes em Posts
Rate Designer: Moderado
Meu Estado:
Enviar mensagem via Windows Live Messenger para NecroBoy
Pontos: 10,817, Nível: 68
Pontos: 10,817, Nível: 68 Pontos: 10,817, Nível: 68 Pontos: 10,817, Nível: 68
Atividade: 99%
Atividade: 99% Atividade: 99% Atividade: 99%

Nome Real: David Junior

Inventório de NecroBoy Usuário possui 1x PS User Usuário possui 1x Milan Usuário possui 1x Adidas Red Usuário possui 1x Mu Coder

Post [TUTO] Criando Npc de Reset

Ao falar com o NPC Crossbow Guard irá ser resetado

Use um ASM Compiler, compile o arquivo e hook no GS
Funciona corretamente no GS v.1.00.16 do Endi, Luciano e SCF.

Citação:
.386
.Model flat , StdCall
Option CaseMap:none
;Includes
Include \masm32\include\windows.inc
Include \masm32\include\user32.inc
Include \masm32\include\kernel32.inc
Include \masm32\include\masm32.inc
IncludeLib \masm32\lib\user32.lib
IncludeLib \masm32\lib\kernel32.lib
IncludeLib \masm32\lib\masm32.lib

.Const

.Data
MessageOutPut DD 00500EE0H
NoMoneyMSG DB "É necessario ter 100.000 Zen para efetuar o reset!", 0
NoLevelMSG DB "É necessario estar acima do nível 350 para efetuar o reset!", 0
RelogMSG DB "Reset realizado, deslogue para finalizar o processo!", 0
.Data?

.Code

DllEntry Proc hInstDLL:HINSTANCE, reason : DWord, reserved1: DWord
Mov Eax, TRUE
Ret
DllEntry EndP

ResetNPC Proc
Local PlayerID : DWord
Local lpObj: DWord
Mov Eax, DWord Ptr Ss:[Ebp + 8] ;Eax recebe um valor. As variáveis são acessadas a patir de [ebp + 8], a 2ª é [ebp + 12] depois [ebp + 16] e assim por diante
Mov lpObj, Eax ;lpObj recebe o valor de Eax
Mov Edx, DWord Ptr Ds:[Eax] ;Edx recebe um valor
Mov PlayerID, Edx ;PlayerID recebe o valor de Edx
Mov Eax, lpObj
Mov Edx, DWord Ptr Ds:[Eax + 0A0H]
Cmp Edx, 15EH ;Compara o valor em Edx com 15EH, isso afetará somente aos flags. a comparação é assim Edx - 15EH
Jle NoLevel ;Faz um salto condicional para o label NoLevel, só salta se for menor ou igual <=
Jmp CheckMoney ;Salta para o rótulo CheckMoney
NoLevel:
Lea Edx, NoLevelMSG ;Carrega a variável a partir da pilha. Carrega o offset da posição de memória da variável NoLevelMSG
Push Edx ;Move para a pilha todos os argumentos antes da instrucão de chamada. copia de Edx
Mov Ecx,PlayerID ;Move o valor. Faz com que o registrador ECX passe a ter o mesmo valor que PlayerID. ECX:= PlayerID
Push Ecx
Call MessageOutPut ;Salta para MessageOutPut
Jmp Finish
CheckMoney:
Mov Eax, lpObj
Mov Ecx, DWord Ptr Ds:[Eax + 0B4H]
Cmp Ecx, 186A0H
Jle NoMoney
Jmp ReduceMoney
NoMoney:
Lea Eax, NoMoneyMSG
Push Eax
Mov Ecx, PlayerID
Push Ecx
Call MessageOutPut
Jmp Finish
ReduceMoney:
Mov Eax, lpObj
Mov Ecx, DWord Ptr Ds:[Eax + 0B4H]
Sub Ecx, 186A0H
Mov DWord Ptr Ds:[Eax + 0B4H], Ecx
Lea Edx, RelogMSG
Push Edx
Mov Ecx, PlayerID
Push Ecx
Call MessageOutPut
Finish:
Ret
ResetNPC EndP
End DllEntry
O reset só funciona com nível 350 e com 100,000 Zen para completar os requisitos do NPC de reset, mas você precisa reconectar em sua conta p/ finalizar o processo.

Pode efetuar o hook aqui:
Código: [Somente Usuários Registrados Podem Visualizar os Links Desta PáginaClique aqui para se Registrar]
00405AF6 $ /E9 75541400 JMP gameserv.NPCDeviasGuard
[Somente Usuários Registrados Podem Visualizar os Links Desta PáginaClique aqui para se Registrar]
Esse é o offset referente ao NPC Crossbow Guard, porem se deseja por outro offset de NPC e faça a ligação (hook) corretamente.

Ao fazer o hook da dll, lembre-se de no final da sequencia deverá fazer o salto para a sequencia original o offset do NPC (JMP 00405AF6)

Obs.1: para usar outro NPC procure pelo qual deseja e faça o hook corretamente. Escolha um NPC vendedor (ShopX.txt por ex.: Shop3.txt referente a Lorencia crava)

Download dll: [Somente Usuários Registrados Podem Visualizar os Links Desta PáginaClique aqui para se Registrar]


Para compilar em DLL
Antes de compilar a DLL, é necessário criar um Modulo de Definição (Nome_DLL.def) que contem:
Citação:
LYBRARY NomeDaDLL
EXPORTS INILoad
1º. Instale o MASM32
2º. Vá no menu Iniciar ~> Executar ~> digite CMD e pressione Ok ou Enter e execute os seguintes comandos dentro da pasta Masm32\Bin\
ML /c /coff GReset.asm
Nesse passo será criado o arquivo GReset.obj
3º e depois execute:
Link /SUBSYSTEM:WINDOWS /DLL GReset.obj
E será criado o arquivo GReset.dll

Algumas explicações sobre o código:
LEA (Load Effective Address): ele é usado para carregar variáveis a partir da pilha. Calcula e carrega o endereço efetivo (offset dentro de um segmento provido) de um operando de origem e partes de um registrador de uso geral.
Ex.: Carrega o offset da posição de memória da variável LIST
Citação:
LEA BX, LIST
PUSH: Move para a pilha todos os argumentos antes da instrucão de chamada. copia de um registrador especifico, posição da memória, ou immediate para o topo da pilha. Esta instrução diminui o pointeiro da pilha em 2, 4 ou 8, dependendo do tamanho do operando, e então copia o operando para a posição da memória apontado por SS:rSP.
Ex.:
Citação:
Push Edx
Push Ecx
MOV: instrução que move valores. Permite deslocar valores entre endereços de memória ou entre registradores.
Ex.:
Faz com que o valor numérico 1995 seja colocado no registrador EAX. Seria o mesmo que dizer EAX:= 1995.
MOV EAX,1995

Faz com que o registrador EBX passe a ter o mesmo valor que EAX. Poderia ser compreendido como EBX:= EAX.
MOV ebx,eax

Faz com que EAX contenha o valor que está no endereço 1995.
MOV eax,[1995]

Faz com que EAX contenha o valor que está no endereço apontado pelo registrador EBX.
MOV eax,[ebx]

Registradores especiais, que não podem ser manipulados (diretamente):
- EAX: é o Acumulador, pois mantém os resultados das operações matemáticas;
- EBX: é o Base, pois ele é usado como ponteiro de uma string;
- ECX: é o Contador, pois o principal uso é em controlar loops
- EDX: é o registrador de Dados, pode conter um endereço que aponte para uma variável ou uma string.

CALL e RET: Ela salta para uma posiçäo especificada e quando a instruçäo RET for encontrada na sub-rotina a CPU retorna para CALL e executa a próxima instrução
Ex.:
CALL 1993
Chama a rotina no endereço 1993
CALL Ebx
Chama a rotina no endereço apontado por Ebx
CALL [Ebx]
Chama a rotina no endereço conteúdo Ebx

Salta para a subrotina ShowNumber e depois retorna para CALL ao encontrar RET
CALL ShowNumber
...
RET

JMP: essa instruçäo simplesmente salta para onde se quer. O operando da instruçäo JMP é um endereço na memória, mas, como usaremos sempre um compilador assembly, é necessário criar um "rotulo" (label) para onde o salto será efetuado. O compilador trata de calcular o endereço pra gente.
Ex.:
Citação:
JMP Aqui2
Aqui1:
JMP Aqui3
Aqui2:
JMP Aqui1
Aqui3:
CMP: é usada quando se quer comparar dois dados, afetando somente aos flags. Esta instruçäo faz a subtraçäo entre o operando mais a esquerda e o mais a direita, afetando somente os flags. Por exemplo, se os dois operandos tiverem valores iguais a subtraçäo dará valores iguais e o flag de ZERO será 1.
Ex.:
Citação:
CMP AL,1Fh será AL - 1Fh onde muda o valor da flag
JLE: é um salto condicional, onde o Salto só ocorre se menor ou igual <= sendo necessário criar um "rotulo" (label) para onde o salto será efetuado.
Ex.:
Citação:
JLE NoLevel
Esqueleto de uma DLL em ASM:

Citação:
.386
.Model flat, StdCall
Option CaseMap:none
;--------------------------------------------------------------
;Faz-se o "Include" a fim evitar definir C/macro
Include masm32includewindows.inc
Include masm32includeuser32.inc
Include masm32includekernel32.inc
Include masm32includemasm32.inc
IncludeLib masm32libuser32.lib
IncludeLib masm32libkernel32.lib
IncludeLib masm32libmasm32.lib

.Const
;---------------------------
;Constantes a declarar

.Data
;---------------------------
;Informação inicializada

.Data?
;-------------------------------
;Informação sem inicializar

.Code
DLLEntry Proc hInstDLL:HINSTANCE, reason: DWord, reserved1: DWord
Mov Eax, TRUE
Ret

;---------------------------------------------------
;Espaço para Proc (procedimentos/funções)

DLLEntry EndP
End DllEntry
Hook da DLL:
Encontrei 2 códigos:

Código: [Somente Usuários Registrados Podem Visualizar os Links Desta PáginaClique aqui para se Registrar]
PUSH OFFSET_NOME_DLL
CALL [LoadlibraryA] (chamamos da LoadLibraryA) DWORD PTR DS:[LoadLibraryA]
PUSH OFFSET_NOME_FUNÇÃO (Init, Loaded)
PUSH EAX (endereço inicial de carregar a função da DLL)
CALL GetProcAddress (carrega a função) DWORD PTR DS:[GetProcAddress]
CALL EAX 
JMP OFFSET_ENTRYPOINT

Código: [Somente Usuários Registrados Podem Visualizar os Links Desta PáginaClique aqui para se Registrar]
PUSH OFFSET_NOME_DLL
CALL DWORD PTR DS:[LoadLibraryA]
OR EAX,EAX
JE OFFSET_ENTRYPOINT ou JE 0
PUSH Init
PUSH EAX
CALL DWORD PTR DS:[GetProcAddress]
CALL EAX
JMP OFFSET_ENTRYPOINT
LoadlibraryA: função que carrega a DLL na memória dinamicamente, ou seja, sem estar no IMPORT_TABLE do binário

GetProcAddress: função para saber o endereço de memória da nossa rotina quando for injetada no target. Responsável por, dado um handle de uma biblioteca (retorno da função LoadLibrary()) e um nome de API, retorna um ponteiro para a rotina da API. A chamada à GetProcAddress() busca e retorna o endereço da própria API GetProcessAddress em Kernel32.dll, armazenando seu retorno em DS:[ESI].


Cretidos: Liclopes

__________________
[Somente Usuários Registrados Podem Visualizar os Links Desta PáginaClique aqui para se Registrar]
@L2Stylus
NecroBoy está offline  
Os Seguintes 3 Usuários disseram Obrigado(a) para NecroBoy por gostarem deste post :
C.Bartowski (15-09-2010), camargoN (16-01-2012)
Links Patrocinados
 

Search Engine Optimization by vBSEO 3.3.0