000
20.10.2008, 18:12 Uhr
~Eoleon
Gast
|
Servus!
Also ich hab hier ne dll liegen, die die Auflösung eines Spiels (diablo2) erhöht. Zu der dll wurde der Source-Code geliefert. Im Spiel ist die maximale Auflösung 800x600. Die dll ändert die Auflösung in 1300x700. Ich möchte die Auflösung in 1024x768 haben. Also dacht ich mir, klar, den Source leicht abändern und mit Dev-C++ ne dll kompilieren. Tja falsch gedacht, ich bekomme einige Fehlermeldungen. Ist aber komisch, denn wenn es der originale Source ist, dann hat es beim ehemaligen Entwickler ja geklappt...
Hoffe ihr könnt mir weiterhelfen:
Code: |
#include <windows.h>
#define STD_CALL_LEN 0x05 #define INST_NOP 0x90 #define INST_CALL 0xE8 #define INST_JMP 0xE9 #define INST_JMPR 0xEB #define INST_RET 0xC3
DWORD PatchJMP(DWORD dwAddr, DWORD dwFuncAddr, DWORD dwSize); BOOL WriteBytes(LPVOID dwAddr, LPCVOID pd, DWORD dwSize); void KeyHookIntercept(); void __fastcall KeyHook(BYTE keycode, BYTE repeat);
DWORD KeyJumpBack=0x6FB4F7A5;
BOOL WINAPI DllMain(HINSTANCE hDll,DWORD dwReason,LPVOID lpReserved) { if(dwReason==DLL_PROCESS_ATTACH) { PatchJMP((DWORD)((DWORD)LoadLibraryA("D2Client.dll")+0x6FB4F7A0-0x6fab0000),(DWORD)KeyHookIntercept,5); } return true; }
DWORD ChangeWindowCall=0x6F8ECAC0;
void __declspec(naked) __fastcall NewResolution(DWORD Size) { __asm { push ecx call ChangeWindowCall retn }
}
DWORD NewJump=0x6FB3F800;
void __declspec(naked) __fastcall NewSize(DWORD H,DWORD W) { __asm { MOV DWORD PTR DS:[0x6FBCD528],ecx MOV DWORD PTR DS:[0x6FBCD524],edx-40 MOV DWORD PTR DS:[0x6FBCC324],edx MOV DWORD PTR DS:[0x6FB8C6E8],ECX MOV DWORD PTR DS:[0x6FB8C6E4],EDX MOV DWORD PTR DS:[0x6FB8C6E0],ECX ret } }
void ToggleResolution(int x,int y,int mode) { NewResolution(mode); NewSize(x,y); }
bool Resized=false;
void __fastcall KeyHook(BYTE keycode, BYTE repeat) { if(repeat) return; if(keycode==VK_SUBTRACT) if(!Resized) { ToggleResolution(1024,768,3); Resized=true; } else { ToggleResolution(800,600,2); Resized=false; } }
void __declspec(naked) KeyHookIntercept() { __asm { __asm { //edi = ptr to (hwnd, msg, wparam, lparam) mov eax, [esp+4] mov cl,[eax+0x04+4] //nVirtKey (wparam) mov dl,[eax+0x08+3+4] //lKeyData (lparam) and dl,0x40 //bit 30 of lKeyData (lparam) call KeyHook //original code PUSH EDI ; D2CLIENT.6FB16EC0 MOV EDI,DWORD PTR SS:[ESP+8] jmp KeyJumpBack } } }
// Patch
DWORD PatchJMP(DWORD dwAddr, DWORD dwFuncAddr, DWORD dwSize) { if(IsBadReadPtr((void*)dwAddr,dwSize)) return (FALSE); BYTE* ptData=(BYTE*)malloc(dwSize); //make memory *ptData=INST_JMP; // add call instruction (one byte) dwFuncAddr-=(dwAddr+STD_CALL_LEN); // invert addr memcpy(ptData+sizeof(BYTE),&dwFuncAddr,sizeof(DWORD)); // add function addr if(dwSize>STD_CALL_LEN) //pad extra bytes with nops memset(ptData+STD_CALL_LEN,INST_NOP,dwSize-STD_CALL_LEN); DWORD dwRet=WriteBytes((void*)dwAddr,ptData,dwSize); free(ptData); return dwRet; }
BOOL WriteBytes(LPVOID dwAddr, LPCVOID pd, DWORD dwSize) { DWORD dwOldProtect; if(VirtualProtect(dwAddr, dwSize, PAGE_READWRITE, &dwOldProtect)) //change memory access rights { memcpy(dwAddr, pd, dwSize); // copy data return VirtualProtect(dwAddr, dwSize, dwOldProtect, &dwOldProtect); //restore old access rights } return FALSE; }
|
Danke schonmal
Gruß,
Eoleon. |