Atualizado Como desenhar na tela(Menu D3d ou ESP). [Direct3D9]

Vovo_69

Ex-Staff
Registrado
Junho 4, 2017
Mensagens
66
Pontos de reações
89
Localização
PE
Guia iPower feita pela comunidade GuidedHacking
traduzido e adaptado por Aero.


Desta vez, vou mostrar-lhe como encontrar o pDevice em jogos DirectX 9. Sei que o DX9 é um pouco antigo, mas ainda há muitos jogos que o utilizam. Nós também sabemos que você pode criar um dispositivo fictício para obter o ponteiro vTable, mas estou fazendo isso para compartilhar o conhecimento e alguns jogos podem detectar chamadas nesse processo. Eu recomendo fortemente que você saiba pelo menos o básico do DirectX 9 se você quiser continuar lendo este tutorial. Vamos começar então!

Você basicamente precisa de:
-IDA Pro;
-x32dbg / x64dbg (às vezes não podemos encontrar a função importada no IDA olhando para a seção Importações porque a função está sendo importada por uma dll, não pelo executável ou outra porcaria).

Vou dividir esse processo em alguns passos: -
Encontre onde o Direct3DCreate9 é chamado -
Obtenha o pD3D e encontre onde o CreateDevice é chamado para obter o ponteiro do dispositivo;

Neste tutorial, usarei o CS2D como exemplo. Se você tentar abrir o CS2D.exe no IDA Pro e olhar para Importações para ver o Direct3DCreate9, você não encontrará nada. Em seguida, podemos anexar um depurador e localizar todas as chamadas intermodulares no processo.



Se esse for o seu caso, espere até encontrar todas as chamadas e, em seguida, procure por
Direct3DCreate9




Dê um duplo clique na instrução para ver o desmantelamento.


Quando funções que retornam algo são chamadas, o valor de retorno é geralmente colocado no registro EAX. Podemos ver que, após essa chamada, o conteúdo dentro do eax está se movendo para alguma direção (podemos dizer que, devido aos parênteses que o cercam, "desreferenciando" o endereço). Esse endereço é o ponteiro para a interface do d3d e precisamos que você encontre o ponteiro do dispositivo.



Como o cs2d não tem o ASLR ativado, copio este endereço e vou para o IDA. Se esse não é o caso para o seu jogo, você pode obter o seu RVA e adicioná-lo à ImageBase IDA obtido a partir da imagem opcional cabeça (não há necessidade de saber sobre o formato de arquivo de PE para este tutorial, estou apenas explicando as coisas) ou excede todos em IDA . Vamos abrir o IDA com o executável e esperar até que tudo seja processado. Quando tudo estiver bem, pressione G, cole o endereço lá e pressione OK.



Depois de fazer isso, clique com o botão direito no nome e selecione Pular para refX para operar ou simplesmente selecione-o e pressione X e selecione um dos resultados.





Antes de continuar, vamos lembrar o protótipo de função para CreateDevice



Portanto, precisamos encontrar uma chamada para uma função que tenha 7 parâmetros e a última seja o endereço pDevice. Espere, nós não vemos 6 parâmetros lá? Sim, nós fizemos, mas quando lidamos com objetos, o endereço do objeto é realmente o primeiro parâmetro e é um parâmetro oculto para programadores (o compilador fará algumas coisas) e é por isso que existem 7 parâmetros.


Vamos ver o pseudocódigo do primeiro resultado.


Na verdade, existem várias chamadas para alguma função. O que acontece se for o dispositivo Create? (Para esclarecer: eu não vou explicar sobre os vtables porque ele não está no escopo deste tutorial, por isso não se preocupar com comutação e função ponteiros que são usados para chamar funções). Então, vamos analisá-lo.

Parâmetros -7
-O primeiro argumento é D3DADAPTER_DEFAULT 0, é utilizado para especificar a placa principal (segundo argumento na imagem) de tela - sempre é este
D3DDEVTYPE_HAL argumento -Sengundo ou 0x1 (terceiro argumento na imagem) - SEMPRE é isso
-O último parâmetro é o endereço de algo
-pD3D é o primeiro parâmetro que é passado para a função
-Alguns valores passados que fazem sentido
-Removendo algo (podemos dizer isso porque está checando se a chamada foi bem-sucedida, retValue> = 0).

Parece que nós achamos isto. Vamos pegar o endereço e tentar em nosso truque.



Um pouco de molho
C ++:
Código:
Código:
0x0785BC0 DEVICE_PTR #define
#define ENDSCENE_INDEX 42
uintptr_t DX9Device = * reinterpret_cast <uintptr_t *> (DEVICE_PTR);
if (! DX9Device)
{
MessageBox (NULL, "Falha", "do iPower CS 2D Corte" MB_OK | MB_ICONERROR | MB_SERVICE_NOTIFICATION); return 0;
}
VMTHookManager * vmtHooking = new VMTHookManager (* reinterpret_cast <vazio ***> (DX9Devic e));
o_EndScene = reinterpret_cast <f_EndScene> (vmtHooking-> Hook (ENDSCENE_INDEX, hk_EndScene));



Parece que tudo deu certo! Espero que gostem deste tutorial! Como eu disse antes, sei que você pode criar dispositivos fictícios, mas estou mostrando como você pode encontrar as coisas por si mesmo. Além disso, pode ser mais difícil em determinados jogos, mas o conceito é o mesmo, você só precisa de paciência e fazer o seu caminho para encontrá-lo!
 

Membros que estão visualizando este tópico (Total: 1, membros: 0, visitantes: 1)

Topo