Advertisement
agrippa1994

D3D Logger

Jan 16th, 2013
359
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.90 KB | None | 0 0
  1. /************************************************************************/
  2. /*                                                                      */
  3. /*              Programm:   Stride, ReturnAddress Logger            */
  4. /*                                                                      */
  5. /*      Entwickler: agrippa1994                     */
  6. /*                                                                      */
  7. /************************************************************************/
  8.  
  9. #pragma comment(lib,"d3dx9.lib")
  10. #pragma comment(lib,"detours.lib")
  11.  
  12. #include <windows.h>
  13. #include <detours.h>
  14. #include <d3dx9.h>
  15. #include <intrin.h>
  16. #include <vector>
  17. #include <iostream>
  18.  
  19. using namespace std;
  20.  
  21. #pragma intrinsic(_ReturnAddress)
  22.  
  23. typedef HRESULT (WINAPI *_DrawIndexedPrimitive) (LPDIRECT3DDEVICE9,D3DPRIMITIVETYPE,INT,UINT,UINT,UINT,UINT);
  24.  
  25. //////////////////////////////////////////////////////////////////////////
  26. //                  globale Variablen       //
  27. //////////////////////////////////////////////////////////////////////////
  28. bool            g_LoggerOn;
  29. bool            g_FirstRun;
  30. bool            g_DrawMode;
  31. int         g_Index;
  32. int         g_Stride;
  33. int         g_primCount;
  34. _DrawIndexedPrimitive   g_oDrawIndexedPrimitive;
  35. LPDIRECT3DTEXTURE9  g_Green;
  36. LPDIRECT3DTEXTURE9  g_Red;
  37. vector<DWORD>       g_Addresses;
  38.  
  39. //////////////////////////////////////////////////////////////////////////
  40. //                  Funktionsprototypen     //
  41. //////////////////////////////////////////////////////////////////////////
  42.  
  43. bool    WINAPI      DllMain(HINSTANCE hInstance,DWORD dwReason,void* Reserved);
  44. void            InitHack();
  45. void            InitHooks();
  46.  
  47. HRESULT WINAPI      hDrawIndexedPrimitive(LPDIRECT3DDEVICE9 pDevice,D3DPRIMITIVETYPE Type,INT BaseVertexIndex,UINT MinVertexIndex,UINT NumVertices,UINT startIndex,UINT primCount);
  48.  
  49. bool            DataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask);
  50. DWORD           FindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask);
  51. HRESULT         GenerateTexture(IDirect3DDevice9 *pD3Ddev, IDirect3DTexture9 **ppD3Dtex, DWORD colour32);
  52. void            OpenConsole();
  53.  
  54. //////////////////////////////////////////////////////////////////////////
  55. //                  Funktionsdefinitionen       //
  56. //////////////////////////////////////////////////////////////////////////
  57.  
  58. //////////////////////////////////////////////////////////////////////////
  59. //                  Initialisierungen       //
  60. //////////////////////////////////////////////////////////////////////////
  61. bool __stdcall DllMain(HINSTANCE hInstance,DWORD dwReason,void* Reserved)
  62. {
  63.     if(dwReason == DLL_PROCESS_ATTACH)
  64.     {
  65.         CreateThread(0,0,(LPTHREAD_START_ROUTINE)InitHack,0,0,0);
  66.         return true;
  67.     }
  68.     else if(dwReason == DLL_PROCESS_DETACH)
  69.     {
  70.         g_Red->Release();
  71.         g_Green->Release();
  72.  
  73.         FreeConsole();
  74.  
  75.         DetourRemove((PBYTE) g_oDrawIndexedPrimitive, (PBYTE) hDrawIndexedPrimitive);
  76.         return true;
  77.     }
  78.     return false;
  79. }
  80. void InitHack()
  81. {
  82.     OpenConsole();
  83.     printf("Der Logger wurde gestartet!\n");
  84.     printf("Steuerung:\n");
  85.     printf("INSERT:\tWireframe / Texturen\n");
  86.     printf("DEL:\tAktivieren der leuchtenden Texturen / Chams\n");
  87.     printf("END:\tDeaktivieren der leuchtenden Texturen / Chams\n");
  88.     printf("ADD:\tErhöhen des ReturnAddresses Index\n");
  89.     printf("SUB:\tVerkleinern des ReturnAddresses Index\n");
  90.     printf("MULT:\tErhöhen der Stride\n");
  91.     printf("DIV:\tVerkleinern der Stride\n");
  92.     printf("NUM7:\tVerkleinern des PrimCounts\n");
  93.     printf("NUM9:\tErhöhen des PrimCounts\n");
  94.     printf("HOME:\tDeaktivieren des Loggers, vorbereiten auf sicheres Entladen\n");
  95.     printf("--------------------------------------------------------------------------\n\n");
  96.  
  97.     g_DrawMode = false;
  98.  
  99.     g_Addresses.clear();
  100.     g_Index = 0;
  101.  
  102.     g_FirstRun = true;
  103.     g_LoggerOn = false;
  104.  
  105.     g_primCount = -1;
  106.     g_Stride = -1;
  107.  
  108.     InitHooks();
  109.    
  110.  
  111.     while(true)
  112.     {
  113.         if(GetAsyncKeyState(VK_INSERT))
  114.             g_DrawMode = !g_DrawMode;
  115.         if(GetAsyncKeyState(VK_DELETE))
  116.             g_LoggerOn = true;
  117.         if(GetAsyncKeyState(VK_END))
  118.             g_LoggerOn = false;
  119.         if(GetAsyncKeyState(VK_ADD))
  120.         {
  121.             if(g_Addresses.size() > (g_Index+1))
  122.                 g_Index++;
  123.             printf("Stride: %d PrimCount: %d ReturnAdress: 0x%X, Index: %d\n",g_Stride,g_primCount,g_Addresses[g_Index],g_Index);
  124.         }
  125.         if(GetAsyncKeyState(VK_SUBTRACT))
  126.         {
  127.             if(g_Index > 0)
  128.                 g_Index --;
  129.             printf("Stride: %d PrimCount: %d ReturnAdress: 0x%X, Index: %d\n",g_Stride,g_primCount,g_Addresses[g_Index],g_Index);
  130.         }
  131.         if(GetAsyncKeyState(VK_MULTIPLY))
  132.         {
  133.             g_Stride ++;
  134.             printf("Stride: %d PrimCount: %d ReturnAdress: 0x%X, Index: %d\n",g_Stride,g_primCount,g_Addresses[g_Index],g_Index);
  135.         }
  136.         if(GetAsyncKeyState(VK_DIVIDE))
  137.         {
  138.             g_Stride --;
  139.             printf("Stride: %d PrimCount: %d ReturnAdress: 0x%X, Index: %d\n",g_Stride,g_primCount,g_Addresses[g_Index],g_Index);
  140.         }
  141.         if(GetAsyncKeyState(VK_NUMPAD7))
  142.         {
  143.             g_primCount --;
  144.             printf("Stride: %d PrimCount: %d ReturnAdress: 0x%X, Index: %d\n",g_Stride,g_primCount,g_Addresses[g_Index],g_Index);
  145.         }
  146.         if(GetAsyncKeyState(VK_NUMPAD9))
  147.         {
  148.             g_primCount ++;
  149.             printf("Stride: %d PrimCount: %d ReturnAdress: 0x%X, Index: %d\n",g_Stride,g_primCount,g_Addresses[g_Index],g_Index);
  150.         }
  151.         if(GetAsyncKeyState(VK_HOME))
  152.         {
  153.             printf("Die DLL kann nun sicher entladen werden!");
  154.             return;
  155.         }
  156.         Sleep(100);
  157.     }
  158. }
  159. void InitHooks()
  160. {
  161.     HMODULE hModule = NULL;
  162.  
  163.     while((hModule = GetModuleHandleA("d3d9.dll")) == NULL)
  164.         Sleep(100);
  165.  
  166.     // Initialisieren des DIP Hooks
  167.     DWORD *VTable = 0;                  
  168.     DWORD Pattern = FindPattern((DWORD)hModule, 0x128000, (PBYTE)"\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86", "xx????xx????xx");
  169.     memcpy(&VTable, (void*)(Pattern+2), 4);
  170.  
  171.     g_oDrawIndexedPrimitive = (_DrawIndexedPrimitive) DetourFunction((PBYTE)VTable[82],(PBYTE)hDrawIndexedPrimitive);
  172. }
  173. //////////////////////////////////////////////////////////////////////////
  174. //              HOOK                    //
  175. //////////////////////////////////////////////////////////////////////////
  176.  
  177. HRESULT WINAPI hDrawIndexedPrimitive(LPDIRECT3DDEVICE9 pDevice,D3DPRIMITIVETYPE Type,INT BaseVertexIndex,UINT MinVertexIndex,UINT NumVertices,UINT startIndex,UINT primCount)
  178. {
  179.     if(g_FirstRun)
  180.     {
  181.         GenerateTexture(pDevice,&g_Green,D3DCOLOR_ARGB(255,0,255,0));
  182.         GenerateTexture(pDevice,&g_Red,D3DCOLOR_ARGB(255,255,0,0));
  183.         g_FirstRun = false;
  184.     }
  185.  
  186.    
  187.     DWORD Ret = (DWORD)_ReturnAddress();
  188.  
  189.     if(g_Addresses.size() > (g_Index) && g_LoggerOn)
  190.     {
  191.         UINT Stride, Offset;
  192.         IDirect3DVertexBuffer9 *Vertex;
  193.  
  194.         if(pDevice->GetStreamSource(0,&Vertex,&Offset,&Stride) == D3D_OK)
  195.             Vertex->Release();
  196.  
  197.         if(Ret == g_Addresses[g_Index] && (Stride == g_Stride || g_Stride == -1) && (g_primCount == -1 || primCount == g_primCount))
  198.         {
  199.             pDevice->SetRenderState( D3DRS_ZENABLE, false );
  200.  
  201.             // Objekt hinter Mauer
  202.             if(g_DrawMode)
  203.                 pDevice->SetTexture(0,g_Green);
  204.             else
  205.                 pDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
  206.  
  207.             pDevice->SetRenderState( D3DRS_PATCHEDGESTYLE, D3DPATCHEDGE_CONTINUOUS );
  208.             pDevice->DrawIndexedPrimitive(Type,BaseVertexIndex,MinVertexIndex,NumVertices,startIndex,primCount);
  209.  
  210.             // Objekt vor Mauer
  211.             if(g_DrawMode)
  212.                 pDevice->SetTexture(0,g_Red);
  213.             pDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
  214.             pDevice->SetRenderState( D3DRS_ZENABLE, true );
  215.             pDevice->DrawIndexedPrimitive(Type, BaseVertexIndex, MinVertexIndex, NumVertices,startIndex, primCount );
  216.         }
  217.     }
  218.  
  219.     for(int i=0;i<g_Addresses.size();i++)
  220.         if(g_Addresses[i] == Ret)
  221.             return g_oDrawIndexedPrimitive(pDevice,Type,BaseVertexIndex,MinVertexIndex,NumVertices,startIndex,primCount);
  222.  
  223.     g_Addresses.push_back(Ret);
  224.     printf("Adresse 0x%X geloggt!\n",Ret);
  225.  
  226.     return g_oDrawIndexedPrimitive(pDevice,Type,BaseVertexIndex,MinVertexIndex,NumVertices,startIndex,primCount);
  227. }
  228. //////////////////////////////////////////////////////////////////////////
  229. //              UTILS                                                   //
  230. //////////////////////////////////////////////////////////////////////////
  231.  
  232. bool DataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)
  233. {
  234.     for(;*szMask;++szMask,++pData,++bMask)
  235.         if(*szMask=='x' && *pData!=*bMask )
  236.             return false;
  237.     return (*szMask) == NULL;
  238. }
  239. DWORD FindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)
  240. {
  241.     for(DWORD i=0; i < dwLen; i++)
  242.         if(DataCompare((BYTE*)(dwAddress+i),bMask,szMask))
  243.             return (DWORD)(dwAddress+i);
  244.     return 0;
  245. }
  246.  
  247. HRESULT GenerateTexture(IDirect3DDevice9 *pD3Ddev, IDirect3DTexture9 **ppD3Dtex, DWORD colour32)
  248. {
  249.     if( FAILED(pD3Ddev->CreateTexture(8, 8, 1, 0, D3DFMT_A4R4G4B4, D3DPOOL_MANAGED,
  250.         ppD3Dtex, NULL)) )
  251.         return E_FAIL;
  252.     WORD colour16 = ((WORD)((colour32>>28)&0xF)<<12)
  253.         |(WORD)(((colour32>>20)&0xF)<<8)
  254.         |(WORD)(((colour32>>12)&0xF)<<4)
  255.         |(WORD)(((colour32>>4)&0xF)<<0);
  256.     D3DLOCKED_RECT d3dlr;    
  257.     (*ppD3Dtex)->LockRect(0, &d3dlr, 0, 0);
  258.     WORD *pDst16 = (WORD*)d3dlr.pBits;
  259.     for(int xy=0; xy < 8*8; xy++)
  260.         *pDst16++ = colour16;
  261.     (*ppD3Dtex)->UnlockRect(0);
  262.     return S_OK;
  263. }
  264.  
  265. void OpenConsole()
  266. {
  267.     if(AllocConsole())
  268.     {
  269.         freopen("CONOUT$","w",stdout);
  270.         SetConsoleTitleA("Logger");
  271.     }
  272. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement