#include "pch.h" #include "hook.h" //注册nut uint32_t __cdecl hook::H_Register_Nut(uint32_t v, void* f, int freeVarsCnt) { /* wchar_t* funcName = nullptr; SQGetString(v, -1 - freeVarsCnt, &funcName); //std::wcout << funcName << std::endl; wprintf(L"Function:%s Num:%d Address: 0x%p\n", funcName, freeVarsCnt,f); */ static int build = 0; if (build == 0 && f == (void*)0x005C5980) { squirrel::R_Register_Nut(); } return MLnewclosure(v, f, freeVarsCnt); } //注册收包 void hook::H_Register_Pack(void* Ecx) { Lpfn_Init(Ecx); sock::R_Register_Pack(); } //HOOK绘制字体 void _fastcall hook::H_Register_DrawCode(DWORD thisc, int Seat, int a3, int a4, int a5, int a6) { //std::cout << "a3:" << a3 << std::endl; //std::cout << "a4:" << a4 << std::endl; //Ver.1180.2.1r if (a3 == 290 && a4 == 550) { a3 = 999; a4 = 999; } // ui/hud/hud.ui 请勿删除 if (a3 == 9999 && a4 == 9999) { squirrel::SqrCallBackFunc(); //imguiC::Init(); } // ui/hud/hud.ui 特殊 if (a3 == 9999 && a4 == 9998) { uint32_t v = GetSqVm(); SQPushRootTable(v); SQPushString(v, L"Sq_DrawMainMaxLayerCustomUI", -1); SQ_Get(v, -2); SQPushRootTable(v); SQPushString(v, L"Lenheart", -1); SQ_Call(v, 2, 0, 0); SQPop(v, 2); for (DrawCodestruct iter : DrawCodeT1_STL) { wchar_t* str = DNFTOOL::char2wchar(iter.str.c_str()); DrawCodeF(thisc, Seat, iter.Xpos, iter.Ypos, iter.Color, (int)str); delete[]str; } DrawCodeT1_STL.clear(); } // ui/selectcharacter/selectcharacterover.ui 选角色 if (a3 == 9999 && a4 == 9489) { static bool Init = false; if (!Init) { squirrel::InitGameScript();//调用初始化程序 Init = true; } uint32_t v = GetSqVm(); SQPushRootTable(v); SQPushString(v, L"Sq_SelectCharacter", -1); SQ_Get(v, -2); SQPushRootTable(v); SQPushString(v, L"Lenheart", -1); SQ_Call(v, 2, 0, 0); SQPop(v, 2); } // ui/event/creatednftwevent/creatednftwevent.ui 顶层绘制 if (a3 == 8888 && a4 == 8884) { uint32_t v = GetSqVm(); SQPushRootTable(v); SQPushString(v, L"Sq_DrawMainTopLayerCustomUI", -1); SQ_Get(v, -2); SQPushRootTable(v); SQPushString(v, L"Lenheart", -1); SQ_Call(v, 2, 0, 0); SQPop(v, 2); for (DrawCodestruct iter : DrawCodeT2_STL) { wchar_t* str = DNFTOOL::char2wchar(iter.str.c_str()); DrawCodeF(thisc, Seat, iter.Xpos, iter.Ypos, iter.Color, (int)str); delete[]str; } DrawCodeT2_STL.clear(); } #if defined MONSTER_BLOOD_UI //移走怪物血条的一些配置文件 if (a4 == 100 || a4 == 107 || a4 == 99) { //if (a3 == 37 || a3 == 100 || a3 == 74 || a3 == 70) //{ a3 = 5000; a4 = 5000; //} } #endif return DrawCodeF(thisc, Seat, a3, a4, a5, a6); } //HOOK创建角色 #ifdef CREAT_CHR_UI typedef DWORD(_fastcall _OldCreatChr)(DWORD thisc, DWORD Seat, DWORD a3); static _OldCreatChr* OldCreatChr; DWORD _fastcall CreatChr(DWORD thisc, DWORD Seat, DWORD a2) { //std::cout << "a2:" << a2 << std::endl; if (*(int*)0x1A5FE1C == 1) { if (*(int*)a2 == 25481068) { uint32_t v = GetSqVm(); SQPushRootTable(v); SQPushString(v, L"Sq_CreatChr", -1); SQ_Get(v, -2); SQPushRootTable(v); SQPushString(v, L"Lenheart", -1); SQ_Call(v, 2, 0, 0); SQPop(v, 2); } } return OldCreatChr(thisc, 0, a2); } #endif // CREAT_CHR_UI //HOOK Item颜色 #ifdef ITEMRARITY extern std::map< int,int>ItemColorMap; typedef DWORD(_cdecl _OldHookEquNameColor)(int rarity); static _OldHookEquNameColor* OldHookEquNameColor; DWORD _cdecl HookEquNameColor(int rarity) { DWORD OldColor = OldHookEquNameColor(rarity); switch (rarity) { case 6: return 0xFF0055FF; case 7: return 0xFF9314FF; case 8: return 0xFF1CBC0C; case 9: return 0xFFACFF08; } return OldColor; } typedef DWORD(_fastcall _OldHookItemColor)(DWORD thisc, DWORD Seat); static _OldHookItemColor* OldHookItemColor; DWORD _fastcall HookItemColor(DWORD thisc, DWORD Seat) { int ItemCode = *(int*)(thisc + 0x1C); if (ItemColorMap.count(ItemCode) == 1) { return ItemColorMap[ItemCode]; } //不在注册项目颜色map里就执行原颜色获取 int Rarity = *(int*)(thisc + 0xF4); int color = HookEquNameColor(Rarity); return color; } #endif //HOOK 发包类型 #ifdef SENDPACKHOOK static SendPacksType _OldSendPackType; int __fastcall NewSendPacksType(DWORD thisc, int Seat, int Parm) { uint32_t v = GetSqVm(); SQPushRootTable(v); SQPushString(v, L"Sq_SendPackType_Event", -1); SQ_Get(v, -2); SQPushRootTable(v); SQPushInt(v, Parm); SQ_Call(v, 2, 0, 0); SQPop(v, 2); return _OldSendPackType(thisc, 0, Parm); } #endif /* //HOOK 获取ITEM 坐标 typedef int(_fastcall __GetItemPos)(DWORD thisc, DWORD Seat); static __GetItemPos* GetItemPos; int __fastcall NewGetItemPos(DWORD thisc, int Seat) { int PosX = *(int*)(thisc + 0x14); int PosY = *(int*)(thisc + 0x18); return PosX; } */ /* //Img 绘制函数 typedef int(_fastcall __sub_11A97E0)(DWORD a1, DWORD Seat, int a2, int a3,DWORD a4, int a5,int a6,int a7 ,int a8,float a9, float a10); static __sub_11A97E0* sub_11A97E0; int _fastcall Newsub_11A97E0(DWORD a1, DWORD Seat, int a2, int a3, DWORD a4, int a5, int a6, int a7, int a8, float a9, float a10) { //std::cout << "a1: " << a1 << std::endl; //std::cout << "a2: " << a2 << std::endl; //std::cout << "a3: " << a3 << std::endl; //std::cout << "a4: " << a4 << std::endl; //std::cout << "a5: " << a5 << std::endl; //std::cout << "a6: " << a6 << std::endl; //std::cout << "a7: " << a7 << std::endl; //std::cout << "a8: " << a8 << std::endl; //std::cout << "a9: " << a9 << std::endl; //std::cout << "a10: " << a10 << std::endl; static DWORD st = a4; return sub_11A97E0(a1, 0, a2, a3, st, a5, a6, a7, a8, a9, a10); } */ //HOOK 绘制stackable typedef int(_cdecl _sub7AA800)(int a1, int a2, int a3 , int a4, int a5 , int a6,char a7); static _sub7AA800* sub7AA800; int _cdecl newsub7AA800(int a1, int a2, int a3, int a4, int a5, int a6, char a7) { return sub7AA800(a1, a2, a3, a4, a5, a6, a7); } //HOOK 绘制Item typedef int(_fastcall _sub11A8F60)(DWORD a1, DWORD Seat, int a2, int a3, int a4); static _sub11A8F60* sub11A8F60; int _fastcall newsub11A8F60(DWORD a1, DWORD Seat, int a2, int a3, int a4) { static bool OpenSw = false; if (!OpenSw) { //std::cout << DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") << std::endl; if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 1) { OpenSw = true; } return sub11A8F60(a1, 0, a2, a3, a4); } else { uint32_t v = GetSqVm(); SQPushRootTable(v); SQPushString(v, L"Sq_DrawItemBack", -1); SQ_Get(v, -2); SQPushRootTable(v); SQPushInt(v, a2); SQPushInt(v, a3); SQPushInt(v, a4); SQ_Call(v, 4, 0, 0); SQPop(v, 2); int ret = sub11A8F60(a1, 0, a2, a3, a4); SQPushRootTable(v); SQPushString(v, L"Sq_DrawItemFront", -1); SQ_Get(v, -2); SQPushRootTable(v); SQPushInt(v, a2); SQPushInt(v, a3); SQPushInt(v, a4); SQ_Call(v, 4, 0, 0); SQPop(v, 2); return ret; } } /* //模拟SQRCAll typedef int(__sub_5AADF0)(void(__cdecl* a1)(int, int, int, int), int a2, int a3); static __sub_5AADF0* sub_5AADF0; int Newsub_5AADF0(void(__cdecl* a1)(int, int, int, int), int a2, int a3) { std::cout << "drawani: " << a1 << std::endl; //std::cout << "TestDrawSkill" << std::endl; //std::cout << "DrawSkillAddr:" << a1 << std::endl; return sub_5AADF0(a1, a2, a3); } */ /* //大部分IMG数字的调用函数 typedef int(_fastcall __sub_11B2390)(DWORD a1, DWORD Seat, int a2, int a3, int a4, int a5, DWORD* a6); static __sub_11B2390* sub_11B2390; int _fastcall Newsub_11B2390(DWORD a1, DWORD Seat, int a2, int a3, int a4, int a5, DWORD* a6) { //std::cout << "a2: " << a2 << std::endl; //std::cout << "a3: " << a3 << std::endl; //std::cout << "a4: " << a4 << std::endl; //std::cout << "a5: " << a5 << std::endl; a2 = 100; a3 = 100; return sub_11B2390(a1, 0, a2, a3, a4, a5, a6); } */ /* //push string std::map< std::wstring, int>BQS; static SqPushStringFunc* OldSQPushString; int NewSqPushStringFunc(uint32_t v, const wchar_t* s, int len) { std::wstring a = s; if (BQS.count(a) != 1) { wprintf(L"Name:%s Len:%d\n", s, len); BQS[a] = 1; } //std::wcout << funcName << std::endl; return OldSQPushString(v, s, len); } */ int hook::RegisterHook() { MH_Initialize(); //Hook收包 MH_CreateHook((void*)INIT_PACK_ADDRESS, &H_Register_Pack, reinterpret_cast(&Lpfn_Init)); MH_EnableHook((void*)INIT_PACK_ADDRESS); //HookNut函数注册 MH_CreateHook((void*)INIT_NUT_ADDRESS, &H_Register_Nut, reinterpret_cast(&MLnewclosure)); MH_EnableHook((void*)INIT_NUT_ADDRESS); //Hook绘制字符 MH_CreateHook((void*)INIT_NUT_DRAWCODE, &H_Register_DrawCode, reinterpret_cast(&DrawCodeF)); MH_EnableHook((void*)INIT_NUT_DRAWCODE); #ifdef CREAT_CHR_UI MH_CreateHook((void*)0x10f3050, &CreatChr, reinterpret_cast(&OldCreatChr)); MH_EnableHook((void*)0x10f3050); #endif // CREAT_CHR_UI #ifdef ITEMRARITY //HOOK获取绘制颜色 MH_CreateHook((void*)0x7AB080, &HookItemColor, reinterpret_cast(&OldHookItemColor)); MH_EnableHook((void*)0x7AB080); //HOOK根据品级得到颜色 MH_CreateHook((void*)0x7AAD00, &HookEquNameColor, reinterpret_cast(&OldHookEquNameColor)); MH_EnableHook((void*)0x7AAD00); #endif #ifdef SENDPACKHOOK //HOOK发包类型 MH_CreateHook((void*)0x1127D60, &NewSendPacksType, reinterpret_cast(&_OldSendPackType)); MH_EnableHook((void*)0x1127D60); #endif //HOOK Item绘制 MH_CreateHook((void*)0x7AA800, &newsub7AA800, reinterpret_cast(&sub7AA800)); MH_EnableHook((void*)0x7AA800); //获取坐标 //MH_CreateHook((void*)0x48c690, &NewGetItemPos, reinterpret_cast(&GetItemPos)); //MH_EnableHook((void*)0x48c690); //nut调用绘制技能的函数 //MH_CreateHook((void*)0x5DCDA0, &Newsub_5DCDA0, reinterpret_cast(&sub_5DCDA0)); //MH_EnableHook((void*)0x5DCDA0); //绘制技能图标的函数 //MH_CreateHook((void*)0x5A4BE0, &Newsub_5A4BE0, reinterpret_cast(&sub_5A4BE0)); //MH_EnableHook((void*)0x5A4BE0); //img绘制的函数 //MH_CreateHook((void*)0x11A97E0, &Newsub_11A97E0, reinterpret_cast(&sub_11A97E0)); //MH_EnableHook((void*)0x11A97E0); //大部分IMG数字的调用函数 //MH_CreateHook((void*)0x11B2390, &Newsub_11B2390, reinterpret_cast(&sub_11B2390)); //MH_EnableHook((void*)0x11B2390); //模拟Sqrcall //MH_CreateHook((void*)0x5AACB0, &Newsub_5AADF0, reinterpret_cast(&sub_5AADF0)); //MH_EnableHook((void*)0x5AACB0); //exe字符串索引 //MH_CreateHook((void*)0x1220590, &Newsub1220590, reinterpret_cast(&sub1220590)); //MH_EnableHook((void*)0x1220590); //MH_CreateHook((void*)0x5A4BE0, &Newsub_5A4BE0, reinterpret_cast(&sub_5A4BE0)); //MH_EnableHook((void*)0x5A4BE0); //MH_CreateHook((void*)0x1358A60, &NewSqPushStringFunc, reinterpret_cast(&OldSQPushString)); //MH_EnableHook((void*)0x1358A60); MH_CreateHook((void*)0x11A8F60, &newsub11A8F60, reinterpret_cast(&sub11A8F60)); MH_EnableHook((void*)0x11A8F60); return 0; }