unknowncheats uc-forum.com ucdownloads ucdownloads.com

Go Back   UC-Tutorials - Multiplayer Game Hacking and Cheat Tutorials > Programming > Direct3D

- Sponsored Advertisement -
http://www.myfpscheats.com/


Reply
 
Thread Tools Display Modes
  #1  
Old 02-09-2009, 05:00 AM
Alkatraz Alkatraz is offline
Administrator
 
Join Date: Jan 2007
Posts: 72
Default [Source] CRC Logging

Credits Kryptech

Forum Discussion thread
http://www.uc-forum.com/forum/showthread.php?t=54122

Well, since I have seen way too many people using NumVerts and PrimCount to do model rec I have decided to releases the better method. This way is more accurate that Strides+NumVertices. What it does(simply) is get the texture being used, Locks it and converts the bits that are locked into a checksum(crc). This will give you a unique value for each texture in the game, which can then be used in your d3d hack for chams, x-ray, wireframe, etc. Basicly anywhere you could have used strides. One of the big advantages to using this method is that there is usually only 1 number to log for each thing. So instead of a long list of NumVerts/PrimCount for 1 object, you just need 1 CRC.

I have used various code from GD and some of my own stuff here. I no longer remember who posted the original stuff, but it never worked anyway lol. So credits to GD for giving me the idea and leading me in the right direction.

EDIT:I have been informed that it was EvilBert that originally introduced this method of detecting things in D3D. So credit to him for originally releasing this method to the public. I have never seen his code and had no help in putting this class together outside of what I read on GD.

The code is mostly self-explanatory, I will try to comment as I go.

This is what generates the crc.

crc.h:
Code:
 unsigned long crctable[256] = {
            0x00000000L, 0x77073096L, 0xEE0E612CL, 0x990951BAL,
            0x076DC419L, 0x706AF48FL, 0xE963A535L, 0x9E6495A3L,
            0x0EDB8832L, 0x79DCB8A4L, 0xE0D5E91EL, 0x97D2D988L,
            0x09B64C2BL, 0x7EB17CBDL, 0xE7B82D07L, 0x90BF1D91L,
            0x1DB71064L, 0x6AB020F2L, 0xF3B97148L, 0x84BE41DEL,
            0x1ADAD47DL, 0x6DDDE4EBL, 0xF4D4B551L, 0x83D385C7L,
            0x136C9856L, 0x646BA8C0L, 0xFD62F97AL, 0x8A65C9ECL,
            0x14015C4FL, 0x63066CD9L, 0xFA0F3D63L, 0x8D080DF5L,
            0x3B6E20C8L, 0x4C69105EL, 0xD56041E4L, 0xA2677172L,
            0x3C03E4D1L, 0x4B04D447L, 0xD20D85FDL, 0xA50AB56BL,
            0x35B5A8FAL, 0x42B2986CL, 0xDBBBC9D6L, 0xACBCF940L,
            0x32D86CE3L, 0x45DF5C75L, 0xDCD60DCFL, 0xABD13D59L,
            0x26D930ACL, 0x51DE003AL, 0xC8D75180L, 0xBFD06116L,
            0x21B4F4B5L, 0x56B3C423L, 0xCFBA9599L, 0xB8BDA50FL,
            0x2802B89EL, 0x5F058808L, 0xC60CD9B2L, 0xB10BE924L,
            0x2F6F7C87L, 0x58684C11L, 0xC1611DABL, 0xB6662D3DL,
            0x76DC4190L, 0x01DB7106L, 0x98D220BCL, 0xEFD5102AL,
            0x71B18589L, 0x06B6B51FL, 0x9FBFE4A5L, 0xE8B8D433L,
            0x7807C9A2L, 0x0F00F934L, 0x9609A88EL, 0xE10E9818L,
            0x7F6A0DBBL, 0x086D3D2DL, 0x91646C97L, 0xE6635C01L,
            0x6B6B51F4L, 0x1C6C6162L, 0x856530D8L, 0xF262004EL,
            0x6C0695EDL, 0x1B01A57BL, 0x8208F4C1L, 0xF50FC457L,
            0x65B0D9C6L, 0x12B7E950L, 0x8BBEB8EAL, 0xFCB9887CL,
            0x62DD1DDFL, 0x15DA2D49L, 0x8CD37CF3L, 0xFBD44C65L,
            0x4DB26158L, 0x3AB551CEL, 0xA3BC0074L, 0xD4BB30E2L,
            0x4ADFA541L, 0x3DD895D7L, 0xA4D1C46DL, 0xD3D6F4FBL,
            0x4369E96AL, 0x346ED9FCL, 0xAD678846L, 0xDA60B8D0L,
            0x44042D73L, 0x33031DE5L, 0xAA0A4C5FL, 0xDD0D7CC9L,
            0x5005713CL, 0x270241AAL, 0xBE0B1010L, 0xC90C2086L,
            0x5768B525L, 0x206F85B3L, 0xB966D409L, 0xCE61E49FL,
            0x5EDEF90EL, 0x29D9C998L, 0xB0D09822L, 0xC7D7A8B4L,
            0x59B33D17L, 0x2EB40D81L, 0xB7BD5C3BL, 0xC0BA6CADL,
            0xEDB88320L, 0x9ABFB3B6L, 0x03B6E20CL, 0x74B1D29AL,
            0xEAD54739L, 0x9DD277AFL, 0x04DB2615L, 0x73DC1683L,
            0xE3630B12L, 0x94643B84L, 0x0D6D6A3EL, 0x7A6A5AA8L,
            0xE40ECF0BL, 0x9309FF9DL, 0x0A00AE27L, 0x7D079EB1L,
            0xF00F9344L, 0x8708A3D2L, 0x1E01F268L, 0x6906C2FEL,
            0xF762575DL, 0x806567CBL, 0x196C3671L, 0x6E6B06E7L,
            0xFED41B76L, 0x89D32BE0L, 0x10DA7A5AL, 0x67DD4ACCL,
            0xF9B9DF6FL, 0x8EBEEFF9L, 0x17B7BE43L, 0x60B08ED5L,
            0xD6D6A3E8L, 0xA1D1937EL, 0x38D8C2C4L, 0x4FDFF252L,
            0xD1BB67F1L, 0xA6BC5767L, 0x3FB506DDL, 0x48B2364BL,
            0xD80D2BDAL, 0xAF0A1B4CL, 0x36034AF6L, 0x41047A60L,
            0xDF60EFC3L, 0xA867DF55L, 0x316E8EEFL, 0x4669BE79L,
            0xCB61B38CL, 0xBC66831AL, 0x256FD2A0L, 0x5268E236L,
            0xCC0C7795L, 0xBB0B4703L, 0x220216B9L, 0x5505262FL,
            0xC5BA3BBEL, 0xB2BD0B28L, 0x2BB45A92L, 0x5CB36A04L,
            0xC2D7FFA7L, 0xB5D0CF31L, 0x2CD99E8BL, 0x5BDEAE1DL,
            0x9B64C2B0L, 0xEC63F226L, 0x756AA39CL, 0x026D930AL,
            0x9C0906A9L, 0xEB0E363FL, 0x72076785L, 0x05005713L,
            0x95BF4A82L, 0xE2B87A14L, 0x7BB12BAEL, 0x0CB61B38L,
            0x92D28E9BL, 0xE5D5BE0DL, 0x7CDCEFB7L, 0x0BDBDF21L,
            0x86D3D2D4L, 0xF1D4E242L, 0x68DDB3F8L, 0x1FDA836EL,
            0x81BE16CDL, 0xF6B9265BL, 0x6FB077E1L, 0x18B74777L,
            0x88085AE6L, 0xFF0F6A70L, 0x66063BCAL, 0x11010B5CL,
            0x8F659EFFL, 0xF862AE69L, 0x616BFFD3L, 0x166CCF45L,
            0xA00AE278L, 0xD70DD2EEL, 0x4E048354L, 0x3903B3C2L,
            0xA7672661L, 0xD06016F7L, 0x4969474DL, 0x3E6E77DBL,
            0xAED16A4AL, 0xD9D65ADCL, 0x40DF0B66L, 0x37D83BF0L,
            0xA9BCAE53L, 0xDEBB9EC5L, 0x47B2CF7FL, 0x30B5FFE9L,
            0xBDBDF21CL, 0xCABAC28AL, 0x53B39330L, 0x24B4A3A6L,
            0xBAD03605L, 0xCDD70693L, 0x54DE5729L, 0x23D967BFL,
            0xB3667A2EL, 0xC4614AB8L, 0x5D681B02L, 0x2A6F2B94L,
            0xB40BBE37L, 0xC30C8EA1L, 0x5A05DF1BL, 0x2D02EF8DL
       };

unsigned long crc32(unsigned char *block, unsigned long len)
       {
           unsigned long crc = 0xFFFFFFFF;
      
           while (len--)
               crc = crctable[(crc ^ *block++) & 0xFFL] ^ (crc >> 8);
      
           return crc ^ 0xFFFFFFFF;
       }
This file is for logging the crcs that u find.

Logging.h
Code:
#include <vector>
#include "main.h"
using namespace std;





class Logging
{
    public:
    std::vector<DWORD> TexList;

    bool Add(std::vector<DWORD> &List, DWORD tex);
    bool Remove(std::vector<DWORD> &List, DWORD m_Tex);
    void Log(std::vector<DWORD> &List);
};

bool Logging::Add(std::vector<DWORD> &List, DWORD tex)
    {
        for (unsigned int i = 0; i < List.size(); i++)
        {
            if (tex == List[i]) return false;
        }
    List.push_back(tex);
    return true;
    }

    bool Logging::Remove(std::vector<DWORD> &List, DWORD tex)
    {
        if (!List.empty())
    {
        for (unsigned int i = 0; i < List.size(); i++)
        {
            if (tex == List[i])
            {
                List.erase(List.begin() + i);
                return true;
            }
        }
    }
    return false;
}

    void Logging::Log(std::vector<DWORD> &List)
    {
        for(unsigned int i=0; i<List.size(); i++)
        {
            add_log("crc32: 0x%x", List[i]);
        }
    }
This is the crc32 class, where the actual werk is done.

Ccrc32.h
Code:
#include "crc.h"



class Ccrc32
{
    D3DLOCKED_RECT dLockedRect;
    DWORD crc;

public:
    DWORD GetCRC(IDirect3DBaseTexture8* pTex);
};

DWORD Ccrc32::GetCRC(IDirect3DBaseTexture8* pTex)
{
    if(pTex != NULL)
    {
        hkIDirect3DTexture8 *oIDirect3DTexture8 = (hkIDirect3DTexture8*)pTex;
        if(oIDirect3DTexture8->GetType() == D3DRTYPE_TEXTURE)
        {
            
                if(oIDirect3DTexture8->LockRect( 0, &dLockedRect, NULL, D3DLOCK_NOOVERWRITE | D3DLOCK_READONLY )== D3D_OK)
                {
                    DWORD *pData = (DWORD*)dLockedRect.pBits;
                    if(pData != NULL){ crc = crc32( (BYTE*)pData, 1024 ); }//the second parameter is size. 1024 works good for BHD 2048 worked for bf2142        
                }

                oIDirect3DTexture8->UnlockRect( 0 );
        }
    }

    return crc;
}
The rest of the code goes in d3ddev.cpp

Globals At Top:
Code:
#include "Ccrc32.h"
#include "Logging.h"


UINT m_Stride;

Ccrc32 CRC;
DWORD m_crc = 0;
std::vector<DWORD> AllTextures;
std::vector<DWORD> TexturesToLog;

Logging Tlog;
int tx = 0;
In Present this is for the logging:
Code:
if(GetAsyncKeyState(VK_F3)&1){ logging = !logging; }
if(GetAsyncKeyState(VK_NUMPAD9)&1){ Tlog.Log(TexturesToLog); }
if(GetAsyncKeyState(VK_NUMPAD7)&1){ Tlog.Log(AllTextures); }
As you will see here I use Strides to narrow down the textures to log, this is just to make things a bit easier and is optional.

In SetTexture:
Code:
m_crc = CRC.GetCRC(pTexture);

    if(m_Stride == 64)
    {
        Tlog.Add(AllTextures, m_crc);
    }
This part will iterate through all the textures coloring them as you go.

In DIP:
Code:
if(GetAsyncKeyState(VK_NUMPAD6)&1){ tx++; }
    if(GetAsyncKeyState(VK_NUMPAD4)&1){ tx--; }
    if(GetAsyncKeyState(VK_NUMPAD8)&1){ Tlog.Add(TexturesToLog, AllTextures[tx]); }
    
    if( AllTextures.size() != 0)
        {
            if(m_crc == AllTextures[tx])
            {        
            //    SetTexture(0, NULL);
                DWORD dwOldZEnable = D3DZB_TRUE;

            m_pD3Ddev->GetRenderState(D3DRS_ZENABLE, &dwOldZEnable);
            m_pD3Ddev->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); //disable the Z buffer (wallhack)
            m_pD3Ddev->SetPixelShader(pxGre);
            m_pD3Ddev->DrawIndexedPrimitive(PrimitiveType, minIndex, NumVertices, startIndex, primCount);
            m_pD3Ddev->SetRenderState(D3DRS_ZENABLE, dwOldZEnable); //re-enable Z buffer
            m_pD3Ddev->SetPixelShader(pxRed);
            return m_pD3Ddev->DrawIndexedPrimitive(PrimitiveType, minIndex, NumVertices, startIndex, primCount);     
        
            }
        }
and Finally, this is how to implement them:

in DIP:
Code:
if(m_crc == 0x9d2b956a)//enemy crc
    {
            DWORD dwOldZEnable = D3DZB_TRUE;

            m_pD3Ddev->GetRenderState(D3DRS_ZENABLE, &dwOldZEnable);
            m_pD3Ddev->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); //disable the Z buffer (wallhack)
            m_pD3Ddev->SetPixelShader(pxGre);
            m_pD3Ddev->DrawIndexedPrimitive(PrimitiveType, minIndex, NumVertices, startIndex, primCount);
            m_pD3Ddev->SetRenderState(D3DRS_ZENABLE, dwOldZEnable); //re-enable Z buffer
            m_pD3Ddev->SetPixelShader(pxRed);
            return m_pD3Ddev->DrawIndexedPrimitive(PrimitiveType, minIndex, NumVertices, startIndex, primCount);     
    }
That is just about it. The majority of the code there is for the logging and can be taken out once you have logged them all. This is c/p from my hook, so it will work just as it is. I have used this in other games including BF2 and BF2142. Hope this helps people in understanding d3d a little better.
Reply With Quote
Reply

  • Submit Thread to Digg
  • Submit Thread to del.icio.us
  • Submit Thread to StumbleUpon
  • Submit Thread to Google
  • Submit Thread to Facebook
  • Submit Thread to My Yahoo!
  • Submit Thread to MySpace
  • Submit Thread to Twitter
  • Submit Thread to Reddit

Tags
crc, logging, source

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off



All times are GMT. The time now is 04:30 AM.