// diablo_1.2.cpp : Defines the entry point for the DLL application. // #include "stdafx.h" #include "stdio.h" #include "stdlib.h" #include "string.h" #include "diablo.h" #ifdef _MANAGED #pragma managed(push, off) #endif DWORD WINAPI InitializeVariables(); int GetChat(); int MyCamera(int intPlayerNumber); int MyEnum(); int MyGodMode(); int MyMap(); int MyMax(); int MySpell(int intSpellID, int intSpellLevel); int MyVitality(int intVitalityBase, int intVitalityMax); int MyWarp(int intX, int intY); Me Me; //my struct in diablo.h so i can say Me.SomeStat = BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { HANDLE hndDllHandle; if (ul_reason_for_call == DLL_PROCESS_ATTACH) { CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)InitializeVariables, NULL, 0, (LPDWORD)&hndDllHandle); CloseHandle(hndDllHandle); return TRUE; } else { return TRUE; } } int GetChat() { char chrArg0[70]; //the buffer is 69bytes char chrArg1[70]; char chrArg2[70]; char chrArg3[70]; char chrArg4[70]; char chrBuffer[70]; HANDLE hndMyCamera = NULL; HANDLE hndMyEnum = NULL; HANDLE hndUnload; int intArgIndex; int intBufferIndex; int intExitCode; BYTE *bytChatBase = (BYTE *)0x4B87AD; BYTE *bytChatCommandStart = (BYTE *)0x4B87AD; BYTE *bytChatOpen = (BYTE *)0x4B8960; //126 is a ~ character. a command can't start with ~ *bytChatCommandStart = 126; while(1) { intArgIndex = 0; //only room for 5 args, chat is closed, and doesn't start with ~(126) while (intArgIndex < 5 && *bytChatOpen == 0 && *bytChatCommandStart != 126) { intBufferIndex = 0; //32 is a space character while (*bytChatBase != 0 && *bytChatBase != 32) { chrBuffer[intBufferIndex] = (char)*bytChatBase; intBufferIndex++; (BYTE *)bytChatBase = (BYTE *)bytChatBase+1; } chrBuffer[intBufferIndex] = 0; if (chrBuffer[0] != 0 && chrBuffer[0] != 32) { if (intArgIndex == 0) strcpy_s(chrArg0, 70, chrBuffer); if (intArgIndex == 1) strcpy_s(chrArg1, 70, chrBuffer); if (intArgIndex == 2) strcpy_s(chrArg2, 70, chrBuffer); if (intArgIndex == 3) strcpy_s(chrArg3, 70, chrBuffer); if (intArgIndex == 4) strcpy_s(chrArg4, 70, chrBuffer); } if (*bytChatBase == 32) (BYTE *)bytChatBase = (BYTE *)bytChatBase+1; intArgIndex++; if (*bytChatBase == 0 || intArgIndex == 5) { intArgIndex -= 1; //this is where i can check for my commands if (strcmp(chrArg0, "camera") == 0 && intArgIndex >= 1) { if (hndMyCamera == NULL) hndMyCamera = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MyCamera, (LPVOID)atoi(chrArg1), 0, NULL); else { GetExitCodeThread(hndMyCamera, (LPDWORD)&intExitCode); TerminateThread(hndMyCamera, intExitCode); CloseHandle(hndMyCamera); hndMyCamera = NULL; } } if (strcmp(chrArg0, "enum") == 0) { if (hndMyEnum == NULL) hndMyEnum = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MyEnum, NULL, 0, NULL); else { GetExitCodeThread(hndMyEnum, (LPDWORD)&intExitCode); TerminateThread(hndMyEnum, intExitCode); CloseHandle(hndMyEnum); hndMyEnum = NULL; } } if (strcmp(chrArg0, "godmode") == 0) MyGodMode(); if (strcmp(chrArg0, "map") == 0) MyMap(); if (strcmp(chrArg0, "max") == 0) MyMax(); if (strcmp(chrArg0, "spell") == 0 && intArgIndex >= 1) { MySpell(atoi(chrArg1), atoi(chrArg2)); } if (strcmp(chrArg0, "unload") == 0) { if (hndMyEnum != NULL || hndMyCamera != NULL) Beep(750,350); else { hndUnload = GetModuleHandle((LPCSTR)"test.dll"); CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)FreeLibrary, (LPVOID)hndUnload, NULL, NULL); return 0; } } if (strcmp(chrArg0, "vitality") == 0 && intArgIndex >= 2) MyVitality(atoi(chrArg1), atoi(chrArg2)); if (strcmp(chrArg0, "warp") == 0 && intArgIndex >= 2) MyWarp(atoi(chrArg1), atoi(chrArg2)); *bytChatCommandStart = 126; bytChatBase = bytChatCommandStart; memset(chrArg0,0,70); memset(chrArg1,0,70); memset(chrArg2,0,70); memset(chrArg3,0,70); memset(chrArg4,0,70); memset(chrBuffer,0,70); } } } return 0; } DWORD WINAPI InitializeVariables() { Me.bytLevel = (BYTE *)(0x686600 + ushrMemLoc); Me.bytNameStart = (BYTE *)(0x686588 + ushrMemLoc); Me.bytPointsToDistribute = (BYTE *)(0x6865CC + ushrMemLoc); Me.bytResistFire = (BYTE *)(0x686611 + ushrMemLoc); Me.bytResistLightning = (BYTE *)(0x686612 + ushrMemLoc); Me.bytResistMagic = (BYTE *)(0x686613 + ushrMemLoc); Me.intLifeBase = (int *)(0x6865E0 + ushrMemLoc); Me.intLifeMax = (int *)(0x6865E5 + ushrMemLoc); Me.intManaBase = (int *)(0x6865F4 + ushrMemLoc); Me.shrArmorClass = (short *)(0x68B878 + ushrMemLoc); Me.shrChanceToHit = (short *)(0x68B880 + ushrMemLoc); Me.shrDamageBase = (short *)(0x68B870 + ushrMemLoc); Me.shrDamageMax = (short *)(0x68B874 + ushrMemLoc); Me.shrDexterityBase = (short *)(0x6865C0 + ushrMemLoc); Me.shrDexterityMax = (short *)(0x6865BC + ushrMemLoc); Me.intExperienceBase = (int *)(0x686604 + ushrMemLoc); Me.intExperienceMax = (int *)(0x68660C + ushrMemLoc); Me.shrMagicBase = (short *)(0x6865B8 + ushrMemLoc); Me.shrMagicMax = (short *)(0x6865B4 + ushrMemLoc); Me.shrStrengthBase = (short *)(0x6865B0 + ushrMemLoc); Me.shrStrengthMax = (short *)(0x686597 + ushrMemLoc); Me.shrVitalityBase = (short *)(0x6865C8 + ushrMemLoc); Me.shrVitalityMax = (short *)(0x6865C4 + ushrMemLoc); GetChat(); return 0; } int MyCamera(int intPlayerNumber) { BYTE *bytPlayerX = (BYTE *)(0x686480 + ushrMemLoc); BYTE *bytPlayerY = (BYTE *)(0x686484 + ushrMemLoc); BYTE *bytScreenX = (BYTE *)0x5CF33C; BYTE *bytScreenY = (BYTE *)0x5CF340; //make sure we specified a valid player if (intPlayerNumber >= *bytNumberOfPlayers) return 0; while(1) { *bytScreenX = *bytPlayerX; *bytScreenY = *bytPlayerY; Sleep(500); } return 0; } int MyEnum() { char chrHold[50]; char chrPlayer[50]; DWORD dwBaseLoc = 0x686480; int intLocIndex; int intIndex = 0; BYTE *bytPlayerName; BYTE *bytPlayerDungeonLevel; BYTE *bytTabText = (BYTE *)0x679664; BYTE *bytTabTextGame = (BYTE *)0x483B88; BYTE *bytX; BYTE *bytY; while(1) { memset(chrHold, 0, 50); memset(chrPlayer, 0, 50); //whipe out the game: while (*bytTabTextGame != 0) { *bytTabTextGame = 0; (BYTE *)bytTabTextGame = (BYTE *)bytTabTextGame+1; } //whipe out the game name, then restore offsets while (*bytTabText != 0) { *bytTabText = 0; (BYTE *)bytTabText = (BYTE *)bytTabText+1; } (BYTE *)bytTabText = (BYTE *)0x679664; (BYTE *)bytTabTextGame = (BYTE *)0x483B88; //for players 0-3, get their name and loc for (intLocIndex = 0; intLocIndex < *bytNumberOfPlayers; intLocIndex++) { (BYTE *)bytPlayerDungeonLevel = (BYTE *)((dwBaseLoc - 4) + (intLocIndex * 0x54D8)); (BYTE *)bytX = (BYTE *)(dwBaseLoc + (intLocIndex * 0x54D8)); (BYTE *)bytY = (BYTE *)((dwBaseLoc + 4) + (intLocIndex * 0x54D8)); (BYTE *)bytPlayerName = (BYTE *)(bytX+0x108); while (*bytPlayerName != 0) { chrPlayer[intIndex] = *bytPlayerName; intIndex++; (BYTE *)bytPlayerName = (BYTE *)(bytPlayerName + 1); } intIndex = 0; sprintf_s(chrHold, 50, ": %i %i L%i ", *bytX, *bytY, *bytPlayerDungeonLevel); strcat_s(chrPlayer, 50, chrHold); //this writes the two concat.'d strings to the tab text while (chrPlayer[intIndex] != 0) { *bytTabText = (int)chrPlayer[intIndex]; (BYTE *)bytTabText = (BYTE *)bytTabText+1; intIndex++; } intIndex = 0; memset(chrHold, 0, 50); memset(chrPlayer, 0, 50); } Sleep(500); } return 0; } int MyGodMode() { /*when you take damage, the asm show's a sub. this just changes the sub to an add for melee and arrow damage */ BYTE *bytArrowDamage = (BYTE *)0x43EF93; BYTE *bytArrowDamage2 = (BYTE *)0x42A2B2; BYTE *bytMeleeDamage = (BYTE *)0x434B01; BYTE *bytManaSub = (BYTE *)0x45756C; DWORD dwOldProtect = NULL; int *intLifeBase = (int *)0x6865E0; int *intManaBase = (int *) 0x6865F4; *intLifeBase = 65535; *intManaBase = 65535; VirtualProtect((LPVOID)bytMeleeDamage, 1, PAGE_EXECUTE_READWRITE, &dwOldProtect); *bytMeleeDamage = 1; VirtualProtect((LPVOID)bytMeleeDamage, 1, dwOldProtect, &dwOldProtect); VirtualProtect((LPVOID)bytArrowDamage, 1, PAGE_EXECUTE_READWRITE, &dwOldProtect); *bytArrowDamage = 3; VirtualProtect((LPVOID)bytArrowDamage, 1, dwOldProtect, &dwOldProtect); VirtualProtect((LPVOID)bytArrowDamage2, 1, PAGE_EXECUTE_READWRITE, &dwOldProtect); *bytArrowDamage2 = 3; VirtualProtect((LPVOID)bytArrowDamage2, 1, dwOldProtect, &dwOldProtect); VirtualProtect((LPVOID)bytManaSub, 1, PAGE_EXECUTE_READWRITE, &dwOldProtect); *bytManaSub = 1; VirtualProtect((LPVOID)bytManaSub, 1, dwOldProtect, &dwOldProtect); return 0; /*int *intLifeBase = (int *)0x6865E0; while(1) *intLifeBase = 65535;*/ } int MyMap() { DWORD dwMapBase = 0x4B7E6B; BYTE *bytMapBase = (BYTE *)0x4B7E6B; for (dwMapBase; dwMapBase <= 0x4B84AB; dwMapBase++) { *bytMapBase = 1; bytMapBase++; } return 0; } int MyMax() { *Me.shrArmorClass = 32767; *Me.shrChanceToHit = 32767; *Me.shrDamageBase = 32767; *Me.shrDamageMax = 32767; *Me.shrDexterityBase = 32767; *Me.shrDexterityMax = 32767; *Me.shrMagicBase = 32767; *Me.shrMagicMax = 32767; *Me.bytResistFire = 127; *Me.bytResistLightning = 127; *Me.bytResistMagic = 127; *Me.shrStrengthBase = 32767; *Me.shrStrengthMax = 32767; *Me.shrVitalityBase = 32767; *Me.shrVitalityMax = 32767; *Me.intLifeBase = 32767; *Me.intLifeMax = 32767; *Me.intManaBase = 32767; return 0; } int MySpell(int intSpellID, int intSpellLevel) { BYTE *bytPlayerNumber = (BYTE *)0x686444; BYTE *bytSpellLevelBaseAddress = (BYTE *)(0x68650A + (*bytPlayerNumber * 0x54D8)); BYTE *bytSpellID = (BYTE *)(0x6864FC + (*bytPlayerNumber * 0x54D8)); int *intManaBase = (int *) (0x6865F4 + (*bytPlayerNumber * 0x54D8)); bytSpellLevelBaseAddress = bytSpellLevelBaseAddress + intSpellID - 1; *intManaBase = 65535; *bytSpellID = intSpellID; *bytSpellLevelBaseAddress = intSpellLevel; return 0; } int MyVitality(int intVitalityBase, int intVitalityMax) { /*BYTE *bytPlayerNumber = (BYTE *)0x686444; BYTE *bytVitalityBase = (BYTE *)(0x6865C8 + (*bytPlayerNumber * 0x54D8)); BYTE *bytVitalityMax = (BYTE *)(0x6865C4 + (*bytPlayerNumber * 0x54D8)); *bytVitalityBase = intVitalityBase; *bytVitalityMax = intVitalityMax;*/ *Me.shrVitalityMax = intVitalityMax; return 0; } int MyWarp(int intX, int intY) { BYTE *bytPlayerNumber = (BYTE *)0x686444; BYTE *bytScreenX = (BYTE *)0x5CF33C; BYTE *bytScreenY = (BYTE *)0x5CF340; BYTE *bytX1 = (BYTE *)(0x686480 + (*bytPlayerNumber * 0x54D8)); BYTE *bytX2 = (BYTE *)(0x686488 + (*bytPlayerNumber * 0x54D8)); BYTE *bytX3 = (BYTE *)(0x686490 + (*bytPlayerNumber * 0x54D8)); BYTE *bytX4 = (BYTE *)(0x6864A0 + (*bytPlayerNumber * 0x54D8)); BYTE *bytY1 = (BYTE *)(0x686484 + (*bytPlayerNumber * 0x54D8)); BYTE *bytY2 = (BYTE *)(0x68648C + (*bytPlayerNumber * 0x54D8)); BYTE *bytY3 = (BYTE *)(0x686494 + (*bytPlayerNumber * 0x54D8)); BYTE *bytY4 = (BYTE *)(0x6864A4 + (*bytPlayerNumber * 0x54D8)); *bytScreenX = intX; *bytScreenY = intY; *bytX1 = intX; *bytX2 = intX; *bytX3 = intX; *bytX4 = intX; *bytY1 = intY; *bytY2 = intY; *bytY3 = intY; *bytY4 = intY; return 0; } #ifdef _MANAGED #pragma managed(pop) #endif