C语言游戏外挂(五):简单 DLL 劫持

  • A+
所属分类:安全开发

声明:本系列文章由网络转载,

          转载来源未知,

          版权属于原作者,特此声明。

1

C语言游戏外挂(五):简单 DLL 劫持

通过C语言编写一个游戏要加载的系统DLL文件(lpk.dll),其中假DLL包含劫持功能和作弊功能且拥有相同的导出函数,将该假DLL放入游戏相同目录下,游戏打开时会自动加载该假DLL,使游戏直接包含作弊功能。

  • 设计思路分析

  • 对象分析

  • 要用的函数介绍

  • 编写测试效果

  • 总体评价

设计思路分析

  1. 构造一个与系统目录下LPK.DLL一样的导出表

  2. 加载系统目录下的LPK.DLL

  3. 将导出函数转发到系统目录下的LPK.DLL上

  4. 在初始化函数中加入我们要执行的代码

对象分析

C语言游戏外挂(五):简单 DLL 劫持

注:本次游戏对象为Super Mario XP 

没有更新所以可用任意版本 ,

试玩发现人物血量最大为10,心最大为99,命最大为99。

要用的函数介绍

__asm{ } 

执行括号内的汇编代码 

JMP EAX 

将EIP跳转到EAX执行,劫持DLL后要获取真正的原函数地址,使用时要进行跳转

编写测试效果

C语言游戏外挂(五):简单 DLL 劫持

将生成的mylpk和作弊模块放入游戏目录,并改mylpk名为lpk

C语言游戏外挂(五):简单 DLL 劫持

C语言游戏外挂(五):简单 DLL 劫持

打开游戏 

直接打开游戏即可,发现此时游戏已具备作弊效果(锁定血量)

C语言游戏外挂(五):简单 DLL 劫持

工具查看加载模块 

发现cheatDLL模块已加载入游戏,说明lpk劫持成功

C语言游戏外挂(五):简单 DLL 劫持

WIN7下劫持 

在WIN7下要劫持只需稍修改注册表即可

C语言游戏外挂(五):简单 DLL 劫持

  1. //

  2. //  05简单DLL劫持(作弊模块DLL部分)

  3. //  C/C++

  4. //

  5. #include <windows.h>

  6. #define Dllfunciton extern "C" __declspec(dllexport)    //以C方式导出

  7. Dllfunciton void lockdata();

  8. Dllfunciton DWORD WINAPI inject(LPVOID);

  9. void lockdata() {

  10.    while (true) {

  11.        DWORD hp = 10;

  12.        DWORD heart = 99;

  13.        DWORD life = 99;

  14.        DWORD addr = 0x00428282;

  15.        DWORD addr2 = 0x00428292;

  16.        DWORD addr3 = 0x004282a2;

  17.        DWORD res = WriteProcessMemory(INVALID_HANDLE_VALUE, (LPVOID)addr, &hp, 4, 0);  //写入自身修改游戏数据

  18.        DWORD res2 = WriteProcessMemory(INVALID_HANDLE_VALUE, (LPVOID)addr2, &heart, 4, 0);

  19.        DWORD res3 = WriteProcessMemory(INVALID_HANDLE_VALUE, (LPVOID)addr3, &life, 4, 0);

  20.        Sleep(1000);

  21.    }

  22. }

  23. DWORD WINAPI inject(LPVOID) {

  24.    lockdata();

  25.    return true;

  26. }

  27. BOOL APIENTRY DllMain(HMODULE hModule,  DWORD  ul_reason_for_call, LPVOID lpReserved) {

  28.    switch(ul_reason_for_call) {

  29.        case DLL_PROCESS_ATTACH: {

  30.            ::DisableThreadLibraryCalls(hModule);   //创建线程包含死循环,为防卡死必须设置

  31.            CreateThread(NULL, 0, inject, NULL, 0, NULL);

  32.        }

  33.        break;

  34.        case DLL_THREAD_ATTACH:

  35.        case DLL_THREAD_DETACH:

  36.        case DLL_PROCESS_DETACH:

  37.            break;

  38.        default:;

  39.    }

  40.    return true;

  41. }

  1. //

  2. //  05简单DLL劫持(假LPK模块部分)

  3. //  C/C++

  4. //

  5. #include <windows.h>

  6. #include <stdlib.h>

  7. #define Dllfunciton extern "C" __declspec(dllexport)    //以C方式导出

  8. #pragma comment(linker, "/EXPORT:LpkInitialize=_gamehacker_LpkInitialize,@1")    //设置导出表

  9. #pragma comment(linker, "/EXPORT:LpkTabbedTextOut=_gamehacker_LpkTabbedTextOut,@2")

  10. #pragma comment(linker, "/EXPORT:LpkDllInitialize=_gamehacker_LpkDllInitialize,@3")

  11. #pragma comment(linker, "/EXPORT:LpkDrawTextEx=_gamehacker_LpkDrawTextEx,@4")

  12. #pragma comment(linker, "/EXPORT:LpkExtTextOut=_gamehacker_LpkExtTextOut,@6")

  13. #pragma comment(linker, "/EXPORT:LpkGetCharacterPlacement=_gamehacker_LpkGetCharacterPlacement,@7")

  14. #pragma comment(linker, "/EXPORT:LpkGetTextExtentExPoint=_gamehacker_LpkGetTextExtentExPoint,@8")

  15. #pragma comment(linker, "/EXPORT:LpkPSMTextOut=_gamehacker_LpkPSMTextOut,@9")

  16. #pragma comment(linker, "/EXPORT:LpkUseGDIWidthCache=_gamehacker_LpkUseGDIWidthCache,@10")

  17. #pragma comment(linker, "/EXPORT:ftsWordBreak=_gamehacker_ftsWordBreak,@11")

  18. char syslpk[250] = {0};

  19. HMODULE hmodule;

  20. FARPROC funcaddr = NULL;

  21. FARPROC WINAPI GetAddress(PCSTR pszProcName) {    //从真正lpk.dll中找需要调用的真正函数地址

  22.    funcaddr = GetProcAddress(hmodule, pszProcName);  

  23.    return funcaddr;

  24. }

  25. Dllfunciton gamehacker_LpkInitialize() {    //找真正函数地址后跳转

  26.    GetAddress("LpkInitialize");

  27.    __asm JMP EAX;

  28. }

  29. Dllfunciton gamehacker_LpkTabbedTextOut() {

  30.    GetAddress("LpkTabbedTextOut");

  31.    __asm JMP EAX;

  32. }

  33. Dllfunciton gamehacker_LpkDllInitialize() {

  34.    GetAddress("LpkDllInitialize");

  35.    __asm JMP EAX;

  36. }

  37. Dllfunciton gamehacker_LpkDrawTextEx() {

  38.    GetAddress("LpkDrawTextEx");

  39.    __asm JMP EAX;

  40. }

  41. Dllfunciton gamehacker_LpkEditControl() {

  42.    GetAddress("LpkEditControl");

  43.    __asm jmp DWORD ptr [EAX];

  44. }

  45. Dllfunciton gamehacker_LpkExtTextOut() {

  46.    GetAddress("LpkExtTextOut");

  47.    __asm JMP EAX;

  48. }

  49. Dllfunciton gamehacker_LpkGetCharacterPlacement() {

  50.    GetAddress("LpkGetCharacterPlacement");

  51.    __asm JMP EAX;

  52. }

  53. Dllfunciton gamehacker_LpkGetTextExtentExPoint() {

  54.    GetAddress("LpkGetTextExtentExPoint");

  55.    __asm JMP EAX;

  56. }

  57. Dllfunciton gamehacker_LpkPSMTextOut() {

  58.    GetAddress("LpkPSMTextOut");

  59.    __asm JMP EAX;

  60. }

  61. Dllfunciton gamehacker_LpkUseGDIWidthCache() {

  62.    GetAddress("LpkUseGDIWidthCache");

  63.    __asm JMP EAX;

  64. }

  65. Dllfunciton gamehacker_ftsWordBreak() {

  66.    GetAddress("ftsWordBreak");

  67.    __asm JMP EAX;

  68. }

  69. BOOL APIENTRY DllMain(HMODULE hModule,  DWORD  ul_reason_for_call, LPVOID lpReserved) {

  70.    switch(ul_reason_for_call) {

  71.        case DLL_PROCESS_ATTACH: {

  72.            GetSystemDirectory(syslpk, 250);

  73.            strcat(syslpk, "\lpk");

  74.            hmodule = LoadLibrary(syslpk);  //加载真正系统lpk.dll

  75.            ::LoadLibrary("cheatDLL");  //加载作弊模块lpk.dll

  76.        } break;

  77.        case DLL_THREAD_ATTACH:

  78.        case DLL_THREAD_DETACH:

  79.        case DLL_PROCESS_DETACH:

  80.            break;

  81.        default:;

  82.    }

  83.    return true;

  84. }

总体评价

DLL劫持可以在不用手动加载外挂,在运行游戏时自动加载作弊功能。


inn0team  一个正在成长的安全团队
微信号:inn0team
C语言游戏外挂(五):简单 DLL 劫持
长按可关注我们


本文始发于微信公众号(inn0team):C语言游戏外挂(五):简单 DLL 劫持

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: