Loading... # 声明 <div class="tip inlineBlock error"> **由于传播、利用此文所提供的信息而造成的任何直接或间接的后果及损失,均由使用者本人负责,五步十阁及文章作者不为此承担任何责任。五步十阁拥有对此文章的修改和解释权。如欲转载或者传播此文章,须保证此文章的完整性,包括版权声明等全部内容。未经五步十阁允许,不得任意修改或增减此文章内容,不得以任何方式将其用于商业目的。** </div> # 一、与游戏lua交互 ### 1.调用游戏接口调用API 前文已对frame_excuteScripte进行了阐述,这里不再细数。 ### 2.注册自定义函数到游戏lua 通过对比lua源码与游戏反汇编代码,得到其如下结构: ```lua typedef enum luaType { Tnil = 0, Tboolean,// 1 Tlightuserdata,// 2 Tnumber,// 3 Tstring, // 4 Ttable,// 5 Tfunction,// 6 Tuserdata,// 7 Tthread,// 8 }luaType; typedef struct luaValue { DWORD64 value; luaType type; DWORD64 unknow1; DWORD64 unknow2; }luaValue; ``` 以及关键函数原型: ```c/c++ DWORD64 _lua_register_function(DWORD64 funcName, DWORD64 funcPtr); const char* _lua_tolstring(void* L, unsigned int index); luaValue * __fastcall _Lua_index2addr(void* L, unsigned int n); ``` 以及获取堆栈参数个数算法: ```c/c++ (*(uint32_t*)((DWORD64)L + 0x28) - *(uint32_t*)((DWORD64)L + 0x30))/0x18; ``` 实现如下自定义函数,以打通游戏lua与dll的lua返回值传递: ```c/c++ DWORD64 print_getAllParam(void* L) { int n = (*(uint32_t*)((DWORD64)L + 0x28) - *(uint32_t*)((DWORD64)L + 0x30)) / 0x18; g_strResult.clear(); for (int i = 0; i < n; i++) { luaValue* value = reinterpret_cast<luaValue * (__fastcall*)(void* L, unsigned int n)>((DWORD64)g_gameWowHandle + Func_Lua_index2adr)(L, i + 1); if (value && value->type == luaType::Tboolean) { if (value->value && (bool)(value->value & 0x1)) { g_strResult.push_back("true"); } else { g_strResult.push_back("false"); } } else if (value && value->type == luaType::Tnil) { g_strResult.push_back("false"); } else if (value) { auto a = myluatostring(L, i + 1, 0); if (a == nullptr || a[0] == '\0') g_strResult.push_back(""); else { auto tmpUtf = u82mb(a); g_strResult.push_back(tmpUtf); } } else { g_strResult.push_back(""); } } return 0; } ``` # 二、隐藏自身 ### 1.模块隐藏 ```c/c++ tatic bool HideInLoadOrderLinks(unsigned long long dllBase); static bool HideInMemoryOrderLinks(unsigned long long dllBase); static bool HideInInitializationOrderLinks(unsigned long long dllBase); static void HideModule(unsigned long long hModule, bool DeleteAfter); ``` 通过上述函数,实现模块隐藏。 ### 2.PE抹除 ```c/c++ DWORD dwMemPro = NULL; VirtualProtect((void*)&__ImageBase, 0x100, PAGE_EXECUTE_READWRITE, &dwMemPro); memset((void*)&__ImageBase, 0, 0x100); VirtualProtect((void*)&__ImageBase, 0x100, dwMemPro, &dwMemPro); ``` ### 3.线程隐藏 待补充... # 三、功能封装 将具体功能函数封装到自定义lua中,部分如下所示: ```c/c++ void lua_register_all(lua_State *L) { lua_register(L, "player_move", player_move); //移动 lua_register(L, "lua_run", callprint); //lua执行 lua_register(L, "lua_loed", lua_loed); //加载lua文件 lua_register(L, "get_ctmpush", get_ctmpush); // 获取移动状态 lua_register(L, "entry_objmanage", entry_objmanage); lua_register(L, "entry_getobj", entry_getobj); lua_register(L, "entry_player", entry_player); lua_register(L, "obj_type", obj_type); lua_register(L, "obj_next", obj_next); lua_register(L, "player_name", player_name); lua_register(L, "obj_descript", obj_descript); //描述表 lua_register(L, "entry_player_xyz", entry_player_xyz); //自身XYZ lua_register(L, "entry_npc_xyz", entry_npc_xyz); //NPCxyz lua_register(L, "entry_rec_xyz", entry_rec_xyz); //物品XYZ } ``` 至此,整个DLL功能已经完整,后续进行中控与DLL通信和lua脚本开发。 最后修改:2021 年 09 月 22 日 11 : 38 AM © 允许规范转载