内容简介:通过C语言编写一个游戏要加载的系统DLL文件(lpk.dll),其中假DLL包含劫持功能和作弊功能且拥有相同的导出函数,将该假DLL放入游戏相同目录下,游戏打开时会自动加载该假DLL,使游戏直接包含作弊功能##设计思路分析 1、构造一个与系统目录下LPK.DLL一样的导出表2、加载系统目录下的LPK.DLL
通过 C语言 编写一个游戏要加载的系统DLL文件(lpk.dll),其中假DLL包含劫持功能和作弊功能且拥有相同的导出函数,将该假DLL放入游戏相同目录下,游戏打开时会自动加载该假DLL,使游戏直接包含作弊功能
##设计思路分析 1、构造一个与系统目录下LPK.DLL一样的导出表
2、加载系统目录下的LPK.DLL
3、将导出函数转发到系统目录下的LPK.DLL上
4、在初始化函数中加入我们要执行的代码
对象分析
本次游戏对象为Super Mario XP
没有更新所以可用任意版本
试玩发现人物血量最大为10,心最大为99,命最大为99
要用的函数介绍
__asm{ }
执行括号内的汇编代码
JMP EAX
将EIP跳转到EAX执行,劫持DLL后要获取真正的原函数地址,使用时要进行跳转
编写测试效果
将生成的mylpk和作弊模块放入游戏目录,并改mylpk名为lpk
打开游戏
直接打开游戏即可,发现此时游戏已具备作弊效果(锁定血量)
工具查看加载模块
发现cheatDLL模块已加载入游戏,说明lpk劫持成功
WIN7下劫持
在WIN7下要劫持只需稍修改注册表即可
// // 05简单DLL劫持(作弊模块DLL部分) // C/C++ // // Created by luguanxing. // Copyright @2016 LGX. All rights reserved. // #include <windows.h> #define Dllfunciton extern "C" __declspec(dllexport) //以C方式导出 Dllfunciton void lockdata(); Dllfunciton DWORD WINAPI inject(LPVOID); void lockdata() { while (true) { DWORD hp = 10; DWORD heart = 99; DWORD life = 99; DWORD addr = 0x00428282; DWORD addr2 = 0x00428292; DWORD addr3 = 0x004282a2; DWORD res = WriteProcessMemory(INVALID_HANDLE_VALUE, (LPVOID)addr, &hp, 4, 0); //写入自身修改游戏数据 DWORD res2 = WriteProcessMemory(INVALID_HANDLE_VALUE, (LPVOID)addr2, &heart, 4, 0); DWORD res3 = WriteProcessMemory(INVALID_HANDLE_VALUE, (LPVOID)addr3, &life, 4, 0); Sleep(1000); } } DWORD WINAPI inject(LPVOID) { lockdata(); return true; } BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: { ::DisableThreadLibraryCalls(hModule); //创建线程包含死循环,为防卡死必须设置 CreateThread(NULL, 0, inject, NULL, 0, NULL); } break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; default:; } return true; }
// // 05简单DLL劫持(假LPK模块部分) // C/C++ // // Created by luguanxing. // Copyright @2016 LGX. All rights reserved. // #include <windows.h> #include <stdlib.h> #define Dllfunciton extern "C" __declspec(dllexport) //以C方式导出 #pragma comment(linker, "/EXPORT:LpkInitialize=_gamehacker_LpkInitialize,@1") //设置导出表 #pragma comment(linker, "/EXPORT:LpkTabbedTextOut=_gamehacker_LpkTabbedTextOut,@2") #pragma comment(linker, "/EXPORT:LpkDllInitialize=_gamehacker_LpkDllInitialize,@3") #pragma comment(linker, "/EXPORT:LpkDrawTextEx=_gamehacker_LpkDrawTextEx,@4") #pragma comment(linker, "/EXPORT:LpkExtTextOut=_gamehacker_LpkExtTextOut,@6") #pragma comment(linker, "/EXPORT:LpkGetCharacterPlacement=_gamehacker_LpkGetCharacterPlacement,@7") #pragma comment(linker, "/EXPORT:LpkGetTextExtentExPoint=_gamehacker_LpkGetTextExtentExPoint,@8") #pragma comment(linker, "/EXPORT:LpkPSMTextOut=_gamehacker_LpkPSMTextOut,@9") #pragma comment(linker, "/EXPORT:LpkUseGDIWidthCache=_gamehacker_LpkUseGDIWidthCache,@10") #pragma comment(linker, "/EXPORT:ftsWordBreak=_gamehacker_ftsWordBreak,@11") char syslpk[250] = {0}; HMODULE hmodule; FARPROC funcaddr = NULL; FARPROC WINAPI GetAddress(PCSTR pszProcName) { //从真正lpk.dll中找需要调用的真正函数地址 funcaddr = GetProcAddress(hmodule, pszProcName); return funcaddr; } Dllfunciton gamehacker_LpkInitialize() { //找真正函数地址后跳转 GetAddress("LpkInitialize"); __asm JMP EAX; } Dllfunciton gamehacker_LpkTabbedTextOut() { GetAddress("LpkTabbedTextOut"); __asm JMP EAX; } Dllfunciton gamehacker_LpkDllInitialize() { GetAddress("LpkDllInitialize"); __asm JMP EAX; } Dllfunciton gamehacker_LpkDrawTextEx() { GetAddress("LpkDrawTextEx"); __asm JMP EAX; } Dllfunciton gamehacker_LpkEditControl() { GetAddress("LpkEditControl"); __asm jmp DWORD ptr [EAX]; } Dllfunciton gamehacker_LpkExtTextOut() { GetAddress("LpkExtTextOut"); __asm JMP EAX; } Dllfunciton gamehacker_LpkGetCharacterPlacement() { GetAddress("LpkGetCharacterPlacement"); __asm JMP EAX; } Dllfunciton gamehacker_LpkGetTextExtentExPoint() { GetAddress("LpkGetTextExtentExPoint"); __asm JMP EAX; } Dllfunciton gamehacker_LpkPSMTextOut() { GetAddress("LpkPSMTextOut"); __asm JMP EAX; } Dllfunciton gamehacker_LpkUseGDIWidthCache() { GetAddress("LpkUseGDIWidthCache"); __asm JMP EAX; } Dllfunciton gamehacker_ftsWordBreak() { GetAddress("ftsWordBreak"); __asm JMP EAX; } BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: { GetSystemDirectory(syslpk, 250); strcat(syslpk, "\\lpk"); hmodule = LoadLibrary(syslpk); //加载真正系统lpk.dll ::LoadLibrary("cheatDLL"); //加载作弊模块lpk.dll } break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; default:; } return true; }
总体评价
DLL劫持可以在不用手动加载外挂,在运行游戏时自动加载作弊功能
以上所述就是小编给大家介绍的《05简单DLL劫持》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
从Paxos到Zookeeper
倪超 / 电子工业出版社 / 2015-2-1 / 75.00元
《Paxos到Zookeeper:分布式一致性原理与实践》从分布式一致性的理论出发,向读者简要介绍几种典型的分布式一致性协议,以及解决分布式一致性问题的思路,其中重点讲解了Paxos和ZAB协议。同时,本书深入介绍了分布式一致性问题的工业解决方案——ZooKeeper,并着重向读者展示这一分布式协调框架的使用方法、内部实现及运维技巧,旨在帮助读者全面了解ZooKeeper,并更好地使用和运维Zoo......一起来看看 《从Paxos到Zookeeper》 这本书的介绍吧!