I got the harddrive today morning and im at my own computer now :)
Here is the current code for main.cpp:
#define _WINSOCKAPI_
#include <windows.h>
#include <winsock2.h>
#include <iostream>
#include <d3d9.h>
#include <d3dx9.h>
#include "vTable.h"
#include "dxhook_proto.h"
#pragma comment(lib, "WS2_32.lib")
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
//#define HOOK_SEND
//#define LOG_PACKETS
#define CHICKEN (ID == 26870121)
#define BANK_DESK (ID == 7500)
#define DEPOSIT_BOX (ID == 13110)
#define BONES (ID == 11010136)
#define ORE_ROCK (ID == 27787767 || ID == 20316628 || ID == 25231890)
#define COW (ID == 61998039 || ID == 61211546 || ID == 61211521)
bool logNextFrame = false;
bool logging = false;
POINT *logObjects = NULL;
UINT numObjects = 0;
UINT maxObjects = 0;
DWORD searchID = 0;
bool drawIDs = false;
typedef int(WINAPI *send_t)(SOCKET, char *, int, int);
DWORD WINAPI Thread(LPVOID lpParam);
void* DetourFunc(BYTE *src, const BYTE *dst, const int len);
void DrawTextF(D3DCOLOR color, int x, int y, const char *fmt, ...);
void DrawRect(LPDIRECT3DDEVICE9 pDevice, int x, int y, int w, int h, BYTE r, BYTE g, BYTE b);
bool Compare(const BYTE* pData, const BYTE* bMask, const char* szMask);
DWORD FindPattern(DWORD dwAddress, DWORD dwLen, BYTE *bMask, char * szMask);
void doDisassembleShader(LPDIRECT3DDEVICE9 pDevice, char* FileName);
void FindRSWindow();
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam);
BOOL CALLBACK EnumWindowProc(HWND hwnd, LPARAM lParam);
void WindowToScreen(HWND hWnd, POINT &wnd, POINT &scrn);
#ifdef HOOK_SEND
int WINAPI hk_send(SOCKET s, char *buf, int len, int flags);
send_t o_send;
SOCKET sckt;
int flgs;
#endif
HWND hWnd = NULL;
LPD3DXFONT font = NULL;
LPDIRECT3DBASETEXTURE9 tex = NULL;
D3DXVECTOR3 mmCoords(0, 0, 0);
Present_t oPresent;
DrawIndexedPrimitive_t oDrawIndexedPrimitive;
DrawPrimitive_t oDrawPrimitive;
BeginScene_t oBeginScene;
EndScene_t oEndScene;
HRESULT WINAPI hkPresent(LPDIRECT3DDEVICE9 pDevice, RECT* pSourceRect, RECT* pDestRect, HWND hDestWindowOverride, RGNDATA *pDirtyRegion);
HRESULT WINAPI hkDrawIndexedPrimitive(LPDIRECT3DDEVICE9 pDevice, D3DPRIMITIVETYPE Type, int BaseVertexIndex, UINT MinIndex, UINT NumVertices, UINT StartIndex, UINT PrimitiveCount);
HRESULT WINAPI hkDrawPrimitive(LPDIRECT3DDEVICE9 pDevice, D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount);
HRESULT WINAPI hkBeginScene(LPDIRECT3DDEVICE9 pDevice);
HRESULT WINAPI hkEndScene(LPDIRECT3DDEVICE9 pDevice);
#pragma pack(push)
#pragma pack(1)
//structs here...
#pragma pack(pop)
BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID reserved)
{
if(dwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hModule);
#ifdef HOOK_SEND
DWORD addr_send = (DWORD)GetProcAddress(GetModuleHandle("WS2_32.dll"), "send");
o_send = (send_t)DetourFunc((PBYTE)addr_send, (PBYTE)hk_send, 5);
#endif
while(GetModuleHandleA("d3d9.dll") == 0)
Sleep(200);
DWORD DXBase = (DWORD)GetModuleHandle("d3d9.dll");
DWORD Pattern = FindPattern(DXBase, 0x128000, (PBYTE)"\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86", "xx????xx????xx");
DWORD* vTable = NULL;
memcpy(&vTable, (void*)(Pattern+2), 4);
oPresent = (Present_t)DetourFunc((BYTE*)vTable[PRESENT], (BYTE*)hkPresent, 5);
oDrawIndexedPrimitive = (DrawIndexedPrimitive_t)DetourFunc((BYTE*)vTable[DRAWINDEXEDPRIMITIVE], (BYTE*)hkDrawIndexedPrimitive, 5);
oDrawPrimitive = (DrawPrimitive_t)DetourFunc((BYTE*)vTable[DRAWPRIMITIVE], (BYTE*)hkDrawPrimitive, 5);
oBeginScene = (BeginScene_t)DetourFunc((BYTE*)vTable[BEGINSCENE], (BYTE*)hkBeginScene, 5);
oEndScene = (EndScene_t)DetourFunc((BYTE*)vTable[ENDSCENE], (BYTE*)hkEndScene, 5);
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)Thread, NULL, NULL, NULL);
FindRSWindow();
}
return TRUE;
}
DWORD WINAPI Thread(LPVOID lpParam)
{
return 0;
for(;;)
{
Sleep(50);
}
return 0;
}
#ifdef HOOK_SEND
int WINAPI hk_send(SOCKET s, char *buf, int len, int flags)
{
sckt = s;
flgs = flags;
#ifdef LOG_PACKETS
if(len != 1 && len != 15 && len != 11 && len != 3)
{
FILE *file = NULL;
fopen_s(&file, "C:\\Users\\(your computer name)\\Desktop\\packetLog.txt", "a");
if(file)
{
fprintf(file, "Packet sent with length %i; first byte 0x%.2X\n", len, (DWORD)buf[0]);
fclose(file);
MessageBox(NULL, "pause", "foo", MB_OK);
}
}
#endif
return o_send(s, buf, len, flags);
}
#endif
HRESULT WINAPI hkPresent(LPDIRECT3DDEVICE9 pDevice, RECT* pSourceRect, RECT* pDestRect, HWND hDestWindowOverride, RGNDATA *pDirtyRegion)
{
return oPresent(pDevice, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion);
}
HRESULT WINAPI hkDrawIndexedPrimitive(LPDIRECT3DDEVICE9 pDevice, D3DPRIMITIVETYPE Type, int BaseVertexIndex, UINT MinIndex, UINT NumVertices, UINT StartIndex, UINT PrimitiveCount)
{
DWORD ID = NumVertices | (PrimitiveCount << 16);
/*UINT stride;
UINT offset;
LPDIRECT3DVERTEXBUFFER9 buffer; //after the GetStreamSource() call this can be used to get the model vertices
pDevice->GetStreamSource(0, &buffer, &offset, &stride);*/
/*static bool once = true;
if(once)
{
once = false;
doDisassembleShader(pDevice, "C:\\Users\\(your computer name)\\Desktop\\shader.txt");
}*/
if(COW)
pDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
D3DXMATRIX WVP;
pDevice->GetVertexShaderConstantF(0, (float*)&WVP, 4);
D3DXMatrixTranspose(&WVP, &WVP);
D3DXVECTOR3 out;
D3DXVECTOR3 in(0, 0, 0);
D3DXVec3TransformCoord(&out, &in, &WVP);
D3DVIEWPORT9 viewport;
pDevice->GetViewport(&viewport);
out.x = (out.x + 1.0f) * viewport.Width * 0.5f + viewport.X;
out.y = (1.0f - out.y) * viewport.Height * 0.5f + viewport.Y;
int x = (int)out.x;
int y = (int)out.y;
if(logging && ID == searchID && numObjects < maxObjects)
{
logObjects[numObjects].x = x;
logObjects[numObjects].y = y;
numObjects++;
}
if(drawIDs && out.x >= 0.0f && out.x <= (float)viewport.Width && out.y >= 0.0f && out.y <= (float)viewport.Height)
{
DrawTextF(D3DCOLOR_XRGB(0, 255, 0), x, y, "%u", ID);
}
HRESULT result = oDrawIndexedPrimitive(pDevice, Type, BaseVertexIndex, MinIndex, NumVertices, StartIndex, PrimitiveCount);
pDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
return result;
}
HRESULT WINAPI hkDrawPrimitive(LPDIRECT3DDEVICE9 pDevice, D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount)
{
if(GetAsyncKeyState(VK_NUMPAD3) & 0x8000)
return D3D_OK;
if(GetAsyncKeyState(VK_INSERT) & 0x8000)
{
doDisassembleShader(pDevice, "C:\\Users\\(your computer name)\\Desktop\\hkDrawPrimitive_shader.txt");
MessageBox(NULL, "done", "hkDrawPrimitive", MB_OK);
}
/*static int numTexturesSaved = 0;
static int numTexturesToSave = 2000;
if(numTexturesSaved < numTexturesToSave)
{
if(SUCCEEDED(pDevice->GetTexture(0, &tex)))
{
char buff[512];
memset(buff, 0, 512);
sprintf_s(buff, 512, "C:\\Users\\(your computer name)\\Desktop\\textures\\texture_%i.dds", numTexturesSaved);
D3DXSaveTextureToFile(buff, D3DXIFF_DDS, tex, NULL);
numTexturesSaved++;
tex->Release();
}
}*/
if(SUCCEEDED(pDevice->GetTexture(0, &tex)))
{
LPDIRECT3DTEXTURE9 _tex = (LPDIRECT3DTEXTURE9)tex;
D3DSURFACE_DESC desc;
if(SUCCEEDED(_tex->GetLevelDesc(0, &desc)))
{
if(desc.Width == 512 && desc.Height == 512)
{
D3DXMATRIX m;
if(SUCCEEDED(pDevice->GetVertexShaderConstantF(0, (float*)&m, 4)))
{
D3DXMatrixTranspose(&m, &m);
D3DXVECTOR3 out;
D3DXVECTOR3 in(1.0f, -1.0f, 0);
D3DXVec3TransformCoord(&out, &in, &m);
mmCoords = out;
}
}
}
tex->Release();
}
return oDrawPrimitive(pDevice, PrimitiveType, StartVertex, PrimitiveCount);
}
HRESULT WINAPI hkBeginScene(LPDIRECT3DDEVICE9 pDevice)
{
static bool init = false;
if(!init)
{
init = true;
D3DXCreateFontA(pDevice, 12, 0, FW_NORMAL, 0, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Verdana", &font);
}
if(GetAsyncKeyState(VK_NUMPAD1) & 0x8000)
{
drawIDs = !drawIDs;
while(GetAsyncKeyState(VK_NUMPAD1) & 0x8000)
Sleep(25);
}
if(logNextFrame)
{
logNextFrame = false;
logging = true;
}
return oBeginScene(pDevice);
}
HRESULT WINAPI hkEndScene(LPDIRECT3DDEVICE9 pDevice)
{
logging = false;
DrawTextF(D3DCOLOR_XRGB(0, 255, 0), 10, 30, "(%f, %f)", mmCoords.x, mmCoords.y);
return oEndScene(pDevice);
}
void DrawTextF(D3DCOLOR color, int x, int y, const char *fmt, ...)
{
if(font == NULL)
return;
va_list args;
va_start(args, fmt);
char buff[512];
memset(buff, 0, 512);
vsprintf_s(buff, 512, fmt, args);
va_end(args);
RECT rct;
SetRect(&rct, x, y - 20, x + 500, y + 20);
font->DrawTextA(NULL, buff, -1, &rct, DT_LEFT | DT_VCENTER, color);
}
void DrawRect(LPDIRECT3DDEVICE9 pDevice, int x, int y, int w, int h, BYTE r, BYTE g, BYTE b)
{
D3DCOLOR RctColor = D3DCOLOR_XRGB(r, g, b);
D3DRECT Rct = { x, y, x + w, y + h };
pDevice->Clear(1, &Rct, D3DCLEAR_TARGET | D3DCLEAR_TARGET, RctColor, 0, 0);
}
void* DetourFunc(BYTE *src, const BYTE *dst, const int len)
{
BYTE *jmp = (BYTE*)VirtualAlloc(NULL, len+5, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
DWORD dwback, dwback2;
VirtualProtect(src, len, PAGE_READWRITE, &dwback);
VirtualProtect(jmp, len+5, PAGE_READWRITE, &dwback2);
memcpy(jmp, src, len); jmp += len;
jmp[0] = 0xE9;
*(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5;
src[0] = 0xE9;
*(DWORD*)(src+1) = (DWORD)(dst - src) - 5;
VirtualProtect(jmp, len+5, dwback2, &dwback2);
VirtualProtect(src, len, dwback, &dwback);
return (jmp-len);
}
bool Compare(const BYTE* pData, const BYTE* bMask, const char* szMask)
{
for(; *szMask; ++szMask, ++pData, ++bMask)
if(*szMask == 'x' && *pData != *bMask) return 0;
return (*szMask) == NULL;
}
DWORD FindPattern(DWORD dwAddress, DWORD dwLen, BYTE *bMask, char * szMask)
{
for(DWORD i = 0; i < dwLen; i++)
if(Compare((BYTE*)(dwAddress + i), bMask, szMask)) return (DWORD)(dwAddress + i);
return 0;
}
void doDisassembleShader(LPDIRECT3DDEVICE9 pDevice, char* FileName)
{
FILE* oLogFile = NULL;
fopen_s(&oLogFile, FileName, "w");
if (oLogFile == NULL)
{
MessageBox(NULL, "Failed to open file", "ERROR", MB_OK);
return;
}
IDirect3DVertexShader9* pShader;
pDevice->GetVertexShader(&pShader);
UINT pSizeOfData;
pShader->GetFunction(NULL, &pSizeOfData);
BYTE* pData = new BYTE[pSizeOfData];
pShader->GetFunction(pData,&pSizeOfData);
LPD3DXBUFFER bOut;
D3DXDisassembleShader(reinterpret_cast<DWORD*>(pData),NULL,NULL,&bOut);
fprintf(oLogFile, "%s", (LPSTR)bOut->GetBufferPointer());
fclose(oLogFile);
delete[] pData;
pShader->Release();
MessageBox(NULL, "Made file", "", MB_OK);
}
void FindRSWindow()
{
EnumWindows(EnumWindowProc, 0);
if(hWnd == NULL)
{
MessageBox(NULL, "Failed to find RS window", "info", MB_OK);
ExitProcess(0);
}
}
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
{
RECT rct;
GetClientRect(hwnd, &rct);
if((rct.right-rct.left) == 765 && (rct.bottom-rct.top) == 503)
{
hWnd = hwnd;
return FALSE;
}
return TRUE;
}
BOOL CALLBACK EnumWindowProc(HWND hwnd, LPARAM lParam)
{
EnumChildWindows(hwnd, EnumChildProc, 0);
if(hWnd)
return FALSE;
return TRUE;
}
void WindowToScreen(HWND hWnd, POINT &wnd, POINT &scrn)
{
WINDOWINFO info;
memset(&info, 0, sizeof(info));
info.cbSize = sizeof(WINDOWINFO);
GetWindowInfo(hWnd, &info);
scrn.x = info.rcWindow.left + wnd.x;
scrn.y = info.rcWindow.top + wnd.y;
}
/*UINT GetObjectsByID(DWORD ID, POINT *pts, UINT maxPoints, bool sortByDistance, POINT *center)
{
logObjects
}*/
Some of the functions are made by some other people like the FindPattern that are used by almost everybody in C++ hacking.
vTable.h:
enum D3D9_vTable
{
QUERYINTERFACE, //0
ADDREF, //1
RELEASE, //2
TESTCOOPERATIVELEVEL, //3
GETAVAILABLETEXTUREMEM, //4
EVICTMANAGEDRESOURCES, //5
GETDIRECT3D, //6
GET_DEVICE_CAPS, //7
GETDISPLAYMODE, //8
GETCREATIONPARAMETERS, //9
SETCURSORPROPERTIES, //10
SETCURSORPOSITION, //11
SHOW_CURSOR, //12
CREATEADDITIONALSWAPCHAIN, //13
GETSWAPCHAIN, //14
GETNUMBEROFSWAPCHAINS, //15
RESET, //16
PRESENT, //17
GETBACKBUFFER, //18
GETRASTERSTATUS, //19
SETDIALOGBOXMODE, //20
GETGAMMARAMP, //21
SETGAMMARAMP, //22
CREATETEXTURE, //23
CREATEVOLUMETEXTURE, //24
CREATECUBETEXTURE, //25
CREATEVERTEXBUFFER, //26
CREATEINDEXBUFFER, //27
CREATERENDERTARGET, //28
CREATEDEPTHSTENCILSURFACE, //29
UPDATESURFACE, //30
UPDATETEXTURE, //31
GETRENDERTARGETDATA, //32
GETFRONTBUFFERDATA, //33
STRETCHRECT, //34
COLORFILL, //35
CREATEOFFSCREENPLAINSURFACE, //36
SETRENDERTARGET, //37
GETRENDERTARGET, //38
SETDEPTHSTENCILSURFACE, //39
GETDEPTHSTENCILSURFACE, //40
BEGINSCENE, //41
ENDSCENE, //42
CLEAR, //43
SETTRANSFORM, //44
GETTRANSFORM, //45
MULTIPLYTRANSFORM, //46
SETVIEWPORT, //47
GETVIEWPORT, //48
SETMATERIAL, //49
GETMATERIAL, //50
SETLIGHT, //51
GETLIGHT, //52
LIGHTENABLE, //53
GETLIGHTENABLE, //54
SETCLIPPLANE, //55
GETCLIPPLANE, //56
SETRENDERSTATE, //57
GETRENDERSTATE, //58
CREATESTATEBLOCK, //59
BEGINSTATEBLOCK, //60
ENDSTATEBLOCK, //61
SETCLIPSTATUS, //62
GETCLIPSTATUS, //63
GETTEXTURE, //64
SETTEXTURE, //65
GETTEXTURESTAGESTATE, //66
SETTEXTURESTAGESTATE, //67
GETSAMPLERSTATE, //68
SETSAMPLERSTATE, //69
VALIDATEDEVICE, // 70
SET_PALETTE_ENTRIES, // 71
GET_PALETTE_ENTRIES, // 72
SETCURRENTTEXTUREPALETTE, // 73
GETCURRENTTEXTUREPALETTE, // 74
SETSCISSORRECT, // 75
GETSCISSORRECT, // 76
SETSOFTWAREVERTEXPROCESSING, // 77
GETSOFTWAREVERTEXPROCESSING, // 78
SETNPATCHMODE, // 79
GETNPATCHMODE, // 80
DRAWPRIMITIVE, // 81
DRAWINDEXEDPRIMITIVE, // 82
DRAWPRIMITIVEUP, // 83
DRAWINDEXEDPRIMITIVEUP, // 84
PROCESSVERTICES, // 85
CREATEVERTEXDECLARATION, // 86
SETVERTEXDECLARATION, // 87
GETVERTEXDECLARATION, // 88
SETFVF, // 89
GETFVF, // 90
CREATEVERTEXSHADER, // 91
SETVERTEXSHADER, // 92
GETVERTEXSHADER, // 93
SETVERTEXSHADERCONSTANTF, // 94
GETVERTEXSHADERCONSTANTF, // 95
SETVERTEXSHADERCONSTANTI, // 96
GETVERTEXSHADERCONSTANTI, // 97
SETVERTEXSHADERCONSTANTB, // 98
GETVERTEXSHADERCONSTANTB, // 99
SETSTREAMSOURCE, // 100
GETSTREAMSOURCE, // 101
SETSTREAMSOURCEFREQ, // 102
GETSTREAMSOURCEFREQ, // 103
SETINDICES, // 104
GETINDICES, // 105
CREATEPIXELSHADER, // 106
SETPIXELSHADER, // 107
GETPIXELSHADER, // 108
SETPIXELSHADERCONSTANTF, // 109
GETPIXELSHADERCONSTANTF, // 110
SETPIXELSHADERCONSTANTI, // 111
GETPIXELSHADERCONSTANTI, // 112
SETPIXELSHADERCONSTANTB, // 113
GETPIXELSHADERCONSTANTB, // 114
DRAWRECTPATCH, // 115
DRAWTRIPATCH, // 116
DELETEPATCH, // 117
CREATEQUERY, // 118
};
I got the vTable enum from some forum long time ago, no idea who is the original creator.
dxhook_proto.h:
#pragma once
typedef HRESULT(WINAPI *Present_t)(LPDIRECT3DDEVICE9 pDevice, RECT* pSourceRect, RECT* pDestRect, HWND hDestWindowOverride, RGNDATA *pDirtyRegion);
typedef HRESULT(WINAPI *DrawIndexedPrimitive_t)(LPDIRECT3DDEVICE9 pDevice, D3DPRIMITIVETYPE Type, int BaseVertexIndex, UINT MinIndex, UINT NumVertices, UINT StartIndex, UINT PrimitiveCount);
typedef HRESULT(WINAPI *DrawPrimitive_t)(LPDIRECT3DDEVICE9 pDevice, D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount);
typedef HRESULT(WINAPI *BeginScene_t)(LPDIRECT3DDEVICE9 pDevice);
typedef HRESULT(WINAPI *EndScene_t)(LPDIRECT3DDEVICE9 pDevice);
Contains just the function porotypes for making pointers to them.
Create a new project, make the files there and compile as DLL and it should work. I use Visual Studio C++ 2008 express edition but it should compile with other versions too. And you need to have the DirectX sdk to have the include files for it to compile.
I also included the compiled version in attachments if someone wants to try it. Dont care about the name "packetHook" cause i tried to make it originally to hook runescapes packets sent to server and make a bot that way but didnt really get anywhere with it. To run it, start up runescape with the same settings as you use with simba (i havent tried with other settings) open the graphics options ingame and leave it there. Then start the RS_Injector.exe, it should say "Waiting for java.exe" and right after it "java.exe found bla bla bla…". After that you have 15 seconds time to change the graphics to use DirectX. This system is just cause with Vista and 7 the Start as admin screen makes the runescape client go to safe mode atleast for me so you have time to change it back before it injects.
After injection you know if it injected succesfully when two green numbers appear in the left upper corner, they are the minimap's current drawings position and rotation, i still have to work out how to get them to screen coordinates.
Its messy i know but i hope you get something out of it.
EDIT: Success! I can now get the coords in the minimap image of where your char is currently with 1 pixel tolerance! 1 tile in the ground is more than 1 pixel wide in minimap so it can get the exact tile on where you are standing on. I can also calculate very easily now the screen coordinates of where to click to get to some other spot, regardless of the minimap rotation. I can detect the minimap 'change' when you move out of the current image by the change in the coordinates too.