Code:
#define _WIN32_WINNT _WIN32_WINNT_WINXP // _WIN32_WINNT_WINXP
#define WINVER _WIN32_WINNT_WINXP // _WIN32_WINNT_WINXP
#define NTDDI_VERSION NTDDI_WINXP
#include <SDKDDKVer.h>
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <string>
#include <vector>
#include <fstream>
using namespace std;
struct FogClick
{
UINT unit;
UINT player;
};
vector<FogClick> fogclicklist;
vector<FogClick> fogclicklisttemp;
typedef int (__cdecl *HEROLEVEL)(DWORD HERO);
HEROLEVEL GetHeroLevel = NULL;
typedef void (__thiscall * Game_SendMessageTimed)(int Inter, const char * text, float time, char unkbyte);
Game_SendMessageTimed SendMessageTimed = NULL;
typedef int (__fastcall * Game_GetInter)(int a1, int a2);
Game_GetInter GetInter = NULL;
typedef bool (__cdecl *CHECKENEMY)(UINT player1, UINT player2);
CHECKENEMY IsEnemy = NULL;
typedef char * (__fastcall *GAME_GetSlotName)(UINT slot);
GAME_GetSlotName GetPlayerName = NULL;
typedef bool (__cdecl *GAME_UnitAlive)(UINT arg1);
GAME_UnitAlive UnitAlive = NULL;
typedef UINT(__cdecl *PLAYEROWNER)(UINT HERO);
PLAYEROWNER OwningPlayer = NULL; // Возвращает игрока которому принадлежит герой
typedef UINT(__cdecl *LOCALPLAYER)();
LOCALPLAYER GetLocalPlayer = NULL;
typedef bool (__cdecl *GAME_IsUnitSelected)(UINT whichUnit, UINT whichPlayer);
GAME_IsUnitSelected IsUnitSelected = NULL;
typedef UINT(__cdecl *GAME_Player)(int number);
GAME_Player Player = NULL;
typedef int (__cdecl *GAME_GetPlayerId)(UINT whichPlayer);
GAME_GetPlayerId GetPlayerId = NULL;
typedef bool (__cdecl *GAME_IsUnitVisible)(UINT whichUnit, UINT whichPlayer);
GAME_IsUnitVisible IsUnitVisible = NULL;
typedef int (__cdecl *GAME_GetPlayerState)(UINT whichPlayer, UINT whichPlayerState);
GAME_GetPlayerState GetPlayerState = NULL;
typedef UINT(__cdecl *GAME_GetUnitTypeId)(UINT whichUnit); // или INT, Юнит
GAME_GetUnitTypeId GetUnitTypeId = NULL;
DWORD GameDll = NULL;
HANDLE mythread = NULL;
bool ingametwo = false;
bool IsGame(void)
{
bool lagscreen = *(bool*) (GameDll + 0xACF668);
return (*(bool*) (GameDll + 0xACF678) || *(int*) (GameDll + 0xAB62A4) > 0) && !lagscreen;
}
bool IsChat(void)
{
return *(bool*) (GameDll + 0xAD15F0);
}
UINT GetMaxUnitForMap(void)
{
UINT tmp = 0;
DWORD tmpaddr = *(DWORD*) (GameDll + 0xAAE2FC);
tmp += *(UINT*) (tmpaddr + 0x428);
tmp += 0x100000;
return tmp;
}
DWORD FogDetect(LPVOID)
{
restartthread:
Sleep(50);
if (IsGame())
{
if (!ingametwo)
{
DWORD Data = *(DWORD *) (GameDll + 0xACEB4C);
DWORD TlsIndex = *(DWORD *) (GameDll + 0xAB7BF4);
if (TlsIndex)
{
DWORD v5 = **(DWORD **) (*(DWORD *) (*(DWORD *) (GameDll + 0xACEB5C) + 4 * Data) + 44);
TlsSetValue(TlsIndex, *(LPVOID *) (v5 + 520));
}
ingametwo = true;
}
for (int m = 0; m < (int) fogclicklist.size(); m++)
{
fogclicklisttemp.push_back(fogclicklist[m]);
}
fogclicklist.clear();
for (int m = 0; m < (int) fogclicklisttemp.size(); m++)
{
if (IsUnitSelected(fogclicklisttemp[m].unit, fogclicklisttemp[m].player) && !IsUnitVisible(fogclicklisttemp[m].unit, fogclicklisttemp[m].player))
fogclicklist.push_back(fogclicklisttemp[m]);
else
{
ofstream logfile;
logfile.open("FogClickLog.txt", ios::out | ios::app);
char * mesgchar2 = new char[220];
sprintf_s(mesgchar2, 220, "%i:%i — [%s] remove selection", GetPlayerState(GetLocalPlayer(), 2), GetPlayerState(GetLocalPlayer(), 5), GetPlayerName(GetPlayerId(fogclicklisttemp[m].player)));
logfile << mesgchar2 << endl;
delete []mesgchar2;
logfile.close();
}
}
fogclicklisttemp.clear();
for (UINT i = 0x100000; i < GetMaxUnitForMap(); i++) // Знаю что начинается первый юнит с 0x100000 , + ~18 на каждого юнита, 0x200000 достаточно.
{
if (GetUnitTypeId(i) > 0)//если юнит:
{
for (int n = 0; n < 12; n++) //перебираем игроков
{
UINT myplayer = Player(n); // получаем игрока
if (myplayer > 0 && IsUnitSelected(i, myplayer) && !IsUnitVisible(i, myplayer)) //если этот игрок выдил юнита, тот оказался невидимым:
{
if (OwningPlayer(i) != myplayer) //Если владелец юнита не равно игрок
{
if (IsEnemy(OwningPlayer(i), myplayer) && IsUnitSelected(i, myplayer))//Если владелец юнита враг игроку
{
bool tmpcheckfog = false;
for (int m = 0; m < (int) fogclicklist.size(); m++)
{
if (myplayer == fogclicklist[m].player)
{
tmpcheckfog = true;
break;
}
}
if (!tmpcheckfog)
{
if (!IsChat())
{
UINT VK_PAUSE_SCAN = MapVirtualKey(VK_PAUSE, 0);
keybd_event(VK_PAUSE, VK_PAUSE_SCAN, 0, 0);
keybd_event(VK_PAUSE, VK_PAUSE_SCAN, KEYEVENTF_KEYUP, 0);
}
ofstream logfile;
logfile.open("FogClickLog.txt", ios::out | ios::app);
char * mesgchar = new char[220];
sprintf_s(mesgchar, 220, "[|c00FF0000%s|r] click -> [|c0000FF40%s|r]", GetPlayerName(GetPlayerId(myplayer)), GetPlayerName(GetPlayerId(OwningPlayer(i))));
char * mesgchar2 = new char[220];
sprintf_s(mesgchar2, 220, "%i:%i — [%s] click -> [%s]", GetPlayerState(GetLocalPlayer(), 2), GetPlayerState(GetLocalPlayer(), 5), GetPlayerName(GetPlayerId(myplayer)), GetPlayerName(GetPlayerId(OwningPlayer(i))));
SendMessageTimed(GetInter(0, 0), mesgchar, 3.f, -1);
logfile << mesgchar2 << endl;
Sleep(3);
FogClick tmpclick;
tmpclick.player = myplayer;
tmpclick.unit = i;
fogclicklist.push_back(tmpclick);
delete []mesgchar;
delete []mesgchar2;
logfile.close();
}
}
}
break;
}
}
}
}
}
else
{
ingametwo = false;
fogclicklisttemp.clear();
fogclicklist.clear();
}
goto restartthread;
return 0;
}
BOOL APIENTRY DllMain(HINSTANCE hiDLL, DWORD reason, LPVOID)
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
{
GameDll = (DWORD) GetModuleHandle("Game.dll");
GetHeroLevel = (HEROLEVEL) (GameDll + 0x3C6ED0);
OwningPlayer = (PLAYEROWNER) (GameDll + 0x3C8190);
GetLocalPlayer = (LOCALPLAYER) (GameDll + 0x3BBB60);
IsEnemy = (CHECKENEMY) (GameDll + 0x3C9580);
UnitAlive = (GAME_UnitAlive) (GameDll + 0x2E0760);
SendMessageTimed = (Game_SendMessageTimed) (0x2F69A0 + GameDll);
GetInter = (Game_GetInter) (0x300710 + GameDll);
GetPlayerName = (GAME_GetSlotName) (GameDll + 0x2F8F90);
IsUnitSelected = (GAME_IsUnitSelected) (GameDll + 0x3C7E00);
Player = (GAME_Player) (GameDll + 0x3BBB30);
IsUnitVisible = (GAME_IsUnitVisible) (GameDll + 0x3C7AF0);
GetPlayerId = (GAME_GetPlayerId) (GameDll + 0x3C9640);
GetPlayerState = (GAME_GetPlayerState) (GameDll + 0x3C9B00);
GetUnitTypeId = (GAME_GetUnitTypeId) (GameDll + 0x3C5910);
if (!GameDll)
return 0;
mythread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) FogDetect, (LPVOID) 1, 0, 0);
}
break;
case DLL_PROCESS_DETACH:
{
TerminateThread(mythread, 0);
}
break;
}
return 1;
}
Share This Thread