Ir para conteúdo
Faça parte da equipe! (2024) ×

Como usar um SDK para Cheating - Tutorial


Zary
 Compartilhar

Posts Recomendados

  • Coordenador

Antes de tudo, antes de começar, você deve saber alguma coisa.

Pré-requisitos:
- C++ (obviamente) 😎
- O que é um Hook e como usá-lo. ( A Wikipedia é nossa amiga. )
- Pare o C&P e entenda este tutorial

Antes de começar na parte de codificação, você deve saber que o Unreal Engine 3 é baseado quase no ProcessEvent.
Todas as funções do jogo passam pelo ProcessEvent (que é outra função) que executa todas as funções dentro do jogo.
Então, nosso objetivo de hackear é conectar este ProcessEvent e usar um ProcessEvent Func modificado, para que possamos ver TODAS as funções que passam por ele e usá-las a nosso favor.
Podemos usar muitos métodos de hooking... do JMP Hook ao IAT Hook...
Sugiro que você comece com Detour (já que o JMP Hook é detectado por quase todos os AntiCheats)

Para começar, você deve criar uma DLL vazia projeto em C++.
Depois de fazer isso, você deve incluir apenas os cabeçalhos do SDK completos no projeto. (C/C++ -> Geral -> Diretório de inclusões adicionais)

Depois de ter feito isso, você pode começar a codificar seu cheat.
Então crie um Main.cpp
E comece a incluir todos os cabeçalhos necessários e inclua também apenas o PRIMEIRO cabeçalho do SDK (SdkHeader.h) que inclui automaticamente todos os outros cabeçalhos do SDK.
Como isso:

Spoiler
Código:
  1. #include <windows.h>
  2. #include <iostream>
  3. #include <fstream>
  4. #include "detours.h" //Necessário para a parte de Hooking.
  5. #include "SdkHeaders.h" //Cabeçalho do SDK
  6.  
  7. #pragma comment ( lib , "detours.lib" ) //Biblioteca necessária para a parte de Hooking.

 

Agora que você fez isso, você obviamente deve criar o DllMain que iniciará a dll no jogo. Assim:

Spoiler
Código:
  1. void OnAttach()
  2. {
  3. Beep(1000, 500);
  4. return;
  5. }
  6.  
  7. BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpvReserved)
  8. {
  9. switch (dwReason)
  10. {
  11. case DLL_PROCESS_ATTACH:
  12. CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)OnAttach, NULL, NULL, NULL);
  13. }
  14.  
  15. return TRUE;
  16. }

 

Agora você pode iniciar a parte Hooking de ProcessEvent dentro de OnAttach().
Antes de iniciar o hooking você deve saber o endereço do ProcessEvent, que está contido dentro do SDK em algum lugar... Normalmente está dentro do Core_Classess.h, no meio de VirtualFunctions de UObjects (comentado à direita)... o endereço e comece a definir seu ProcessEvent globalmente (fora do OnAttach) assim:

Spoiler
Código:
  1. typedef void ( __thiscall * tProcessEvent )( class UObject *, class UFunction *, void *, void *);
  2. tProcessEvent ProcessEvent=(tProcessEvent)0xXXXXXXX;

Onde 0xXXXXXX é o endereço do seu ProcessEvent.

Depois de definir seu ProcessEvent, você pode iniciar a parte do hooking, então volte na função OnAttach e use o detour para iniciar o hooking assim:

Spoiler
Código:
  1. void OnAttach ()
  2. {
  3. DetourTransactionBegin ();
  4. DetourUpdateThread ( GetCurrentThread ()); //Este comando define o thread de trabalho atual para o thread atual do jogo.
  5. DetourAttach (&( PVOID &) ProcessEvent , HookedPE ); //Este comando iniciará seu Hook.
  6. DetourTransactionCommit ();
  7. }

(estou usando o Detour da Microsoft neste exemplo)


Como você pode ver, usamos "HookedPE" dentro da função DetourAttach... É nossa função hooked que substituiremos para o ProcessEvent original, então devemos começar a codificar a função HookedPE....
Então vamos começar:
a função de ProcessEvent de O Unreal Engine 3 SEMPRE tem estes 4 argumentos:
- UObject *pObject (este é o objeto da função que é passado pelo PE original)
- UFunction *pFunction (esta é a função passada pelo PE original)
- void *pParms (este é o parâmetros da função)
- void *pResult (este é o resultado da função)
Então apenas defina nossa função hooked como esta:

Spoiler
Código:
  1. void __fastcall HookedPE ( UObject * pObject , void * edx , UFunction * pFunction , void * pParms , void * pResult )
  2. {
  3. ProcessEvent(pObject, pFunction, pParms, pResult);
  4. }

 

Como você pode ver, passamos também um void *edx porque ele é gerado por nossa chamada ( __fastcall ) que salva dados na memória, então quando chamamos novamente o ProcessEvent original (no final do nosso PE ligado) passamos apenas o principal quatro argumentos.

Agora o gancho está feito. Basta começar a implementar e usar nosso SDK.
Antes de tudo, devemos encontrar todas as Functions Name porque precisamos da função de PostRender (isso existe em todos os jogos).
Quando encontrarmos o nome da nossa função PostRender, podemos pegar seus parâmetros e usar o parâmetro UCanvas* para desenhar dentro do jogo 😉

Então vamos fazer algo assim:

Spoiler
Código:
  1. void __fastcall HookedPE ( UObject * pObject , void * edx , UFunction * pFunction , void * pParms , void * pResult )
  2. {
  3. char * szName = pFunction -> GetFullName ();
  4.  
  5. FILE * fp = fopen ( "C:\\Users\\YouUser\\Desktop\\Functions.txt" , "w+" );
  6. fprintf ( fp , "%s\n" , szNome );
  7.  
  8. ProcessEvent(pObject, pFunction, pParms, pResult);
  9. }


Agora é só compilar isso e injetar no seu jogo (enquanto estiver no lobby ou jogando).
Vamos executar a dll por 10-15 segundos e depois feche o jogo.
Vá em sua área de trabalho e abra Functions.txt também com o bloco de notas e procure por:

Spoiler

 

Código:
  1. . Pós-Renderização


    E você encontrará a função Engine do PostRender ... no meu caso é:

    Spoiler
    Código:
    1. FunctionEngine.GameViewportClient.PostRender

    (Esta função é igual em quase todos os jogos)

    Agora vá no seu HookedPE e delete a parte de impressão da função e podemos começar a filtrar todas as funções para selecionar apenas a nossa função necessária (PostRender)...
    Então vamos usar strcmp para fazer isso...

    Spoiler
    Código:
    1. void __fastcall HookedPE ( UObject * pObject , void * edx , UFunction * pFunction , void * pParms , void * pResult )
    2. {
    3. char * szName = pFunction -> GetFullName ();
    4.  
    5. if ( strcmp ( szName , "Function Engine.GameViewportClient.PostRender" ) == 0 )
    6. //Agora filtramos apenas nossa função necessária.
    7.  
    8. ProcessEvent(pObject, pFunction, pParms, pResult);
    9. }


      Agora vá em "Engine_functions.h" e procure por "Function Engine.GameViewportClient.PostRender"
      e você encontrará algo assim:

      Spoiler
      Código:
      1. FunctionEngine.GameViewportClient.PostRender
      2. // [0x00020802] ( FUNC_Event )
      3. // Informações dos parâmetros:
      4. // class UCanvas* Canvas ( CPF_Parm )
      5.  
      6. void UGameViewportClient :: eventPostRender ( class UCanvas * Canvas )
      7. {
      8. UFunction estático * pFnPostRender = NULL ;
      9.  
      10. if ( ! pFnPostRender )
      11. pFnPostRender = ( UFunction *) UObject :: GObjObjects ()-> Data [ 19766 ];
      12.  
      13. UGameViewportClient_eventPostRender_Parms PostRender_Parms ;
      14. PostRender_Parms . Tela = Tela ;
      15.  
      16. ProcessEvent((UObject*)this, pFnPostRender,&PostRender_Parms, NULL );
      17. };


        Como você pode ver, o único parâmetro desta função é UCanvas* que podemos pegar de dentro da estrutura "UGameViewportClient_eventPostRender_Parms" definida como abaixo:

        Spoiler
        Código:
        1. // Function Engine.GameViewportClient.PostRender
        2. // [0x00020802] ( FUNC_Event )
        3. struct UGameViewportClient_eventPostRender_Parms
        4. {
        5. classe UCanvas * Canvas ; // 0x0000 (0x0004) [0x0000000000000080] ( CPF_Parm )
        6. };


          Portanto, devemos antes de todas as outras coisas definir uma nova função em nossa dll, então vamos escrevê-la:

          Spoiler
          Código:
          1. void PostRender ( UCanvas * canvas )
          2. {
          3. if (! canvas ) return ; //Verifica se canvas é um ponteiro válido
          4. }


            Em nossa função PostRender passamos o argumento UCanvas* que vamos pegar da função passada pelo nosso HookedPE.
            Então agora é só voltar no seu HookedPE e adicionar isto:

            Spoiler
            Código:
            1. if ( strcmp ( szName , "Function Engine.GameViewportClient.PostRender" ) == 0 )
            2. {
            3. PostRender ((( UGameViewportClient_eventPostRender_Parms *)( pParms ))-> Canvas );
            4. }

               

              E agora fizemos .... para testar nosso hack, vá em PostRender func e adicione isto:

              Spoiler
              Código:
              1. if (! canvas ) return ;
              2.  
              3. tela -> SetPos ( 10 , 10 , 0 ); //define a posição da tela para (10,10)
              4. canvas -> DrawText ( L "Tutorial por dano20zoo" , false , 1.0f , 1.0f , NULL );


                Agora compile sua Dll e injete no jogo... espere alguns segundos e você verá a string
                "Tutorial by dano20zoo" no canto superior esquerdo da tela.

                Este é o código completo se você não entendeu alguma coisa:

                Spoiler

                main.cpp

                Código:
                1. #include <windows.h>
                2. #include <iostream>
                3. #include <fstream>
                4. #include "detours.h"
                5. #include "SdkHeaders.h"
                6.  
                7. #pragma comment(lib, "detours.lib")
                8.  
                9. typedef void(__thiscall *tProcessEvent)(class UObject *, class UFunction *, void *, void *);
                10. tProcessEvent ProcessEvent = (tProcessEvent)0xXXXXXXX;
                11.  
                12. void PostRender(UCanvas *canvas)
                13. {
                14. if (!canvas) return;
                15.  
                16. canvas->SetPos(10, 10, 0); //define a posição da tela para (10,10)
                17. canvas -> DrawText ( L "Tutorial por dano20zoo" , false , 1.0f , 1.0f , NULL );
                18. }
                19.  
                20. void __fastcall HookedPE(UObject *pObject, void *edx, UFunction *pFunction, void *pParms, void *pResult)
                21. {
                22. char *szName = pFunction->GetFullName();
                23.  
                24. if (strcmp(szName, "Function Engine.GameViewportClient.PostRender") == 0)
                25. {
                26. PostRender(((UGameViewportClient_eventPostRender_Parms*)(pParms))->Canvas);
                27. }
                28.  
                29. ProcessEvent(pObject, pFunction, pParms, pResult);
                30. }
                31.  
                32. void OnAttach()
                33. {
                34. DetourTransactionBegin();
                35. DetourUpdateThread(GetCurrentThread());
                36. DetourAttach(&(PVOID&)ProcessEvent, HookedPE);
                37. DetourTransactionCommit();
                38. }
                39.  
                40. BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpvReserved)
                41. {
                42. switch (dwReason)
                43. {
                44. case DLL_PROCESS_ATTACH:
                45. CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)OnAttach, NULL, NULL, NULL);
                46. }
                47.  
                48. return TRUE;
                49. }

                   

                  Isso é apenas para entender como o SDK funciona! Se você quiser algum código fonte do Aimbot, Wallhack etc, esta seção do fórum está CHEIA de exemplos de código...
                  Basta ligar PlayerController (no ProcessEvent) e usá-lo para fazer quaisquer outros hacks.

                  Isso é tudo. Feliz hacking pessoal!

                   

                   Créditos: dano20zoo

                  Editado por Zary

                  ♔ Player not Prayer ♔

                  Twitch - Discord - Youtube

                   

                  sgzqPw8.gif

                   

                  Link para o comentário
                  Compartilhar em outros sites

                  Participe da Conversa

                  Você pode postar agora e se cadastrar mais tarde. Cadastre-se Agora para publicar com Sua Conta.
                  Observação: sua postagem exigirá aprovação do moderador antes de ficar visível.

                  Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
                  Responder

                  ×   Você colou conteúdo com formatação.   Remover formatação

                    Apenas 75 emoticons são permitidos.

                  ×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

                  ×   Seu conteúdo anterior foi restaurado.   Limpar Editor

                  ×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.

                   Compartilhar

                  ×
                  ×
                  • Criar Novo...

                  Informação Importante

                  Nós fazemos uso de cookies no seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies , caso contrário, vamos supor que você está bem para continuar.