当前位置:   article > 正文

63.网游逆向分析与插件开发-游戏增加自动化助手接口-自动化助手UI与游戏菜单的对接_通过逆向工程修改一款windows游戏的ui

通过逆向工程修改一款windows游戏的ui

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

内容来源于:易道云信息技术研究院VIP课

上一个内容:游戏公告类的C++还原-CSDN博客

码云地址(master分支):https://gitee.com/dye_your_fingers/sro_-ex.git

码云版本号:19a2828def451a280ee211c62dcd1074ed422054

代码下载地址,在 SRO_EX 目录下,文件名为:SRO_Ex-自动化助手UI与游戏菜单的对接.zip

链接:https://pan.baidu.com/s/1W-JpUcGOWbSJmMdmtMzYZg

提取码:q9n5

--来自百度网盘超级会员V4的分享

HOOK引擎,文件名为:黑兔sdk.zip

链接:https://pan.baidu.com/s/1IB-Zs6hi3yU8LC2f-8hIEw

提取码:78h8

--来自百度网盘超级会员V4的分享

以 游戏公告类的C++还原-CSDN博客 它的代码为基础进行修改

效果图:可能需要调节一下分辨率才能看到,我们的mfc窗口

游戏失去焦点之后就不会渲染了,然后会导致下图的中的样子发生

htdMfcDll.h文件的修改,新加 ui_helper变量

  1. // htdMfcDll.h: htdMfcDll DLL 的主标头文件
  2. //
  3. #pragma once
  4. #ifndef __AFXWIN_H__
  5. #error "在包含此文件之前包含 'pch.h' 以生成 PCH"
  6. #endif
  7. #include "resource.h" // 主符号
  8. #include "CUI.h"
  9. #include "GameProtect.h"
  10. #include "GameEx.h"
  11. #include "GameBase.h"
  12. // ChtdMfcDllApp
  13. // 有关此类实现的信息,请参阅 htdMfcDll.cpp
  14. //
  15. class ChtdMfcDllApp : public CWinApp
  16. {
  17. public:
  18. ChtdMfcDllApp();
  19. // 重写
  20. public:
  21. virtual BOOL InitInstance();
  22. DECLARE_MESSAGE_MAP()
  23. protected:
  24. GameProtect protect;
  25. GameEx game_ex;
  26. GameBase game_base;
  27. CUI ui_helper;
  28. };

htdMfcDll.cpp文件的修改,删除无用函数,新加 _ui变量、extern_all.h头文件的引入,修改了 InitInstance函数

  1. // htdMfcDll.cpp: 定义 DLL 的初始化例程。
  2. //
  3. #include "pch.h"
  4. #include "framework.h"
  5. #include "htdMfcDll.h"
  6. #include "extern_all.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #endif
  10. // #define WNDHOOK
  11. #ifdef WNDHOOK
  12. typedef struct htdDll
  13. {
  14. HHOOK keyHook;
  15. unsigned KbdProc;
  16. unsigned SetDll;
  17. }*PHtdDll;
  18. void htdSetDll(htdDll hDll);
  19. htdDll mDll;
  20. #endif
  21. #pragma data_seg("_hdata")
  22. int client = 0;
  23. #pragma data_seg()
  24. #pragma comment(linker, "/SECTION:_hdata,RWS")
  25. BEGIN_MESSAGE_MAP(ChtdMfcDllApp, CWinApp)
  26. END_MESSAGE_MAP()
  27. CUI* _ui;
  28. // ChtdMfcDllApp 构造
  29. ChtdMfcDllApp::ChtdMfcDllApp()
  30. {
  31. }
  32. ChtdMfcDllApp theApp;
  33. ChtdMfcDllApp* PtheApp;
  34. HHOOK keyHook;
  35. LRESULT CALLBACK KeyCallBack(int nCode, WPARAM w, LPARAM l);
  36. BOOL ChtdMfcDllApp::InitInstance()
  37. {
  38. CWinApp::InitInstance();
  39. protect.CheckMult();
  40. game_ex.InitInterface();// 初始化游戏扩展接口
  41. client++;
  42. ui_helper.Create(IDD_MAIN);
  43. _ui = &ui_helper;
  44. return TRUE;
  45. }

extern_all.h文件的修改

  1. #pragma once
  2. #include "GameBase.h"
  3. #include "CUI.h"
  4. extern CUI* _ui;
  5. extern GameBase* _pgamebase;

CUI.cpp文件的修改,新加 UIShow函数、ShowUI变量

  1. // CUI.cpp: 实现文件
  2. //
  3. #include "pch.h"
  4. #include "htdMfcDll.h"
  5. #include "CUI.h"
  6. #include "afxdialogex.h"
  7. // CUI 对话框
  8. IMPLEMENT_DYNAMIC(CUI, CDialogEx)
  9. CUI::CUI(CWnd* pParent /*=nullptr*/)
  10. : CDialogEx(IDD_MAIN, pParent)
  11. {
  12. }
  13. CUI::~CUI()
  14. {
  15. }
  16. void CUI::DoDataExchange(CDataExchange* pDX)
  17. {
  18. CDialogEx::DoDataExchange(pDX);
  19. DDX_Control(pDX, IDC_TAB1, mTab);
  20. }
  21. BOOL CUI::OnInitDialog()
  22. {
  23. CDialogEx::OnInitDialog();
  24. InstallPage(new CUIWnd_0(), IDD_PAGE_0, L"信息显示", TRUE);
  25. InstallPage(new CUIWnd_1(), IDD_PAGE_1, L"变态功能");
  26. //PageINJ.Init(wAppPath);
  27. //PageRAN.SetAppPath(wAppPath);
  28. return TRUE;
  29. }
  30. bool CUI::InstallPage(CDialogEx* wnd, int IDD_WND, CString&& _Name, BOOL IsShow)
  31. {
  32. if (CurPage >= MAX_PAGE_MAIN) return false;
  33. Pages[CurPage] = wnd;
  34. Pages[CurPage]->Create(IDD_WND, this);
  35. //Pages[CurPage]->SetParent(this);
  36. Pages[CurPage]->ShowWindow(IsShow);
  37. CRect rect;
  38. mTab.GetClientRect(&rect);
  39. rect.top += 46;
  40. rect.left += 20;
  41. rect.bottom += 5;
  42. rect.right += 5;
  43. Pages[CurPage]->MoveWindow(&rect);
  44. mTab.InsertItem(CurPage, _Name);
  45. CurPage++;
  46. return true;
  47. }
  48. BEGIN_MESSAGE_MAP(CUI, CDialogEx)
  49. ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, &CUI::OnTcnSelchangeTab1)
  50. END_MESSAGE_MAP()
  51. // CUI 消息处理程序
  52. void CUI::OnTcnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
  53. {
  54. // TODO: 在此添加控件通知处理程序代码
  55. *pResult = 0;
  56. int n = mTab.GetCurSel();
  57. for (int i = 0; i < CurPage; i++)
  58. {
  59. Pages[i]->ShowWindow(i == n);
  60. }
  61. }
  62. void CUI::UIShow()
  63. {
  64. auto hwndClient = ::FindWindow(L"CLIENT", L"SRO_CLIENT");
  65. ::SetParent(this->m_hWnd, hwndClient);
  66. this->ShowWindow(ShowUI = !ShowUI);
  67. }

CUI.h文件的修改,新加 UIShow函数、ShowUI变量

  1. #pragma once
  2. #include "afxdialogex.h"
  3. //增加页面头文件
  4. #include "CUIWnd_0.h"
  5. #include "CUIWnd_1.h"
  6. //游戏辅助UI类
  7. // CUI 对话框
  8. #define MAX_PAGE_MAIN 3
  9. class CUI : public CDialogEx
  10. {
  11. DECLARE_DYNAMIC(CUI)
  12. public:
  13. CUI(CWnd* pParent = nullptr); // 标准构造函数
  14. virtual ~CUI();
  15. // 对话框数据
  16. #ifdef AFX_DESIGN_TIME
  17. enum { IDD = IDD_MAIN };
  18. #endif
  19. protected:
  20. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  21. DECLARE_MESSAGE_MAP()
  22. CDialogEx* Pages[MAX_PAGE_MAIN];
  23. short CurPage = 0;
  24. bool ShowUI = false;
  25. public:
  26. CTabCtrl mTab;
  27. virtual BOOL OnInitDialog();
  28. bool InstallPage(CDialogEx* wnd, int IDD_WND, CString&& _Name, BOOL IsShow=FALSE);
  29. afx_msg void OnTcnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult);
  30. void UIShow();
  31. };

GameEx.cpp文件的修改,修改了 ExitGame函数、AutoHelper函数,vip变量位置调节

  1. #include "pch.h"
  2. #include "GameEx.h"
  3. #include "htdHook2.h"
  4. #include "GameProtect.h"
  5. #include "extern_all.h"
  6. extern int client;
  7. extern GameProtect* _protect;
  8. extern unsigned _stdcall GetFunctionAddress(int index);
  9. htd::hook::htdHook2 hooker;
  10. bool vip = true;
  11. SRO_String vip_notice;
  12. bool AutoHelper(HOOKREFS2) {
  13. // 使用通过获取游戏中的sro_string结构
  14. //auto read = _pgamebase->SRO_Res->ReadTitle((wchar_t*)0xEBC968);
  15. // 使用自己创建的sro_string结构
  16. /**
  17. sro_string str;
  18. str.Ptitle = L"您还没有开通VIP服务,只能使用普通药水辅助功能,开通VIP可以使用更高级的自动化助手功能!";
  19. str.lenth = 47;
  20. str.size = 48 * 2 + 1;
  21. auto read = &str;
  22. unsigned* _ecx = (unsigned*)0x1256E3C;
  23. unsigned readEcx = _ecx[0];
  24. unsigned _call = 0x848580;
  25. _asm {
  26. mov ecx, readEcx
  27. push read
  28. call _call
  29. }
  30. */
  31. _pgamebase->Init();
  32. DWORD* desp = (DWORD*)_ESP;
  33. if (vip) {
  34. _ui->UIShow();
  35. return false;
  36. }
  37. else {
  38. if (desp[1] == 1) {
  39. _pgamebase->SRO_Notice->NetNotice(&vip_notice);
  40. _pgamebase->SRO_Notice->ChatNotice(vip_notice.wcstr(), 0xFFFF0000);
  41. _pgamebase->SRO_Notice->NormalNotice(&vip_notice);
  42. }
  43. return true;
  44. }
  45. }
  46. bool ExitGame(HOOKREFS2) {
  47. if (vip) {
  48. _pgamebase->Init();
  49. auto read = _pgamebase->SRO_Res->ReadTitle((wchar_t*)0xEBC968);
  50. *read = L"自动助手 [VIP] (%s)";
  51. }
  52. DWORD* _esp = (DWORD*)_ESP;
  53. DWORD _val = _esp[1];
  54. if (_val == 0x1035D0C) {
  55. // AfxMessageBox(L"游戏退出!");
  56. auto hMuls = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, L"system_seamp");
  57. if (hMuls) ReleaseSemaphore(hMuls, 1, 0);
  58. client--;
  59. ExitProcess(0);
  60. }
  61. return true;
  62. }
  63. GameEx::GameEx()
  64. {
  65. vip_notice = L"(自动化助手公告)您还没有海通VIP服务,只能使用普通的药水设定功能,开通VIP后可以享受全自动辅助功能!";
  66. // AfxMessageBox(L"注册hook!");
  67. // auto h = GetModuleHandle(NULL);
  68. // DWORD address = (DWORD)h;
  69. // DWORD* addRExit = (DWORD*)(address + 0x88C77E);
  70. /**addRExit = 0;*/
  71. // CString txt;
  72. // txt.Format(L"addRExit[0]D:%d,addRExit[0]X:%X,addRExit:%X", addRExit[0], addRExit[0], addRExit);
  73. // AfxMessageBox(txt);
  74. // hooker.SetHook((LPVOID)addRExit, 3, ExitGame);
  75. //AddVectoredExceptionHandler(1, 异常回调);
  76. //设置线程的dr寄存器(GetCurrentThread());
  77. }
  78. void GameEx::InitInterface()
  79. {
  80. unsigned addr_cps = GetFunctionAddress(0);
  81. hooker.SetHook((LPVOID)(addr_cps + 0x30 - 2), 0x3, ExitGame);
  82. hooker.SetHook((LPVOID)(addr_cps + 0x51 - 2), 0x3, ExitGame);
  83. unsigned addr_autohelper = GetFunctionAddress(1);
  84. hooker.SetHook((LPVOID)(addr_autohelper), 0x03, AutoHelper, (LPVOID)(addr_autohelper + 0x90));
  85. }
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号