游戏窗口化助手

需求:
在游戏窗口化时,能够在游戏之外弹出一个窗口,可以隐藏或者显示游戏窗口,显示游戏人物的基本状态,以及其他重要的信息

  1. 游戏窗口句柄的获取
  2. 游戏窗口坐标的获取
  3. 游戏移动事件的HOOK
  4. 人物所在地图数据的逆向分析
  5. 人物升级所需经验数据的逆向分析

UI绘制略...

分析升级经验值:
直接搜数字

改一个 发现变了,那就是这个了。

然后看什么访问这个数据,因为肯定是用某种算法求出这个然后显示到了这个地方,就看看怎么得出这个

 

eax刚好是等级

call后刚好就是要的结果 。

还原:

老套路了。。

typedef struct LvData
{
	int un[2];
	unsigned Exp;
	int un1;
}*PlvData;

typedef class Core
{
	typedef PlvData(Core::* PROC_D)(unsigned);
public:
	static PROC_D _GetLvMaxExp;

	PlvData GetLvMaxExp(unsigned lv);
#include "Core.h"

Core::PROC_D Core::_GetLvMaxExp{};

PlvData Core::GetLvMaxExp(unsigned lv)
{
	return (this->*_GetLvMaxExp)(lv);
}
	SRO_Core = (PCore)0x1036590;
	InitClassProc(&Core::_GetLvMaxExp, 0xA21F20);

 地图数据获取的逆向分析

 直接先搜字符串

 

发现用的是第四个数据 

直接看是什么访问

 x32打开直接下条件断点eax==141d5f38

走一步就断下、

 栈里还能看到长安的字符串

就一直往前

 到这儿就没有了

 

所以就是调用了这个函数,走一步断下,然后看看是从哪儿开始出现的“长安”

 

 上面这个函数里,长安出现了

这个函数刚好是之前封装过得函数,传入的是wchar_t 的字符串

传入一个25000字符串就返回的长安

再往上看

这个函数过后 就出现了25000  这个函数来得到25000

进去看看 4 个参数  传入61A8返回的25000

改一下61A9发现是25001,多试几次,发现这个函数就是16进制转十进制,就不需要调用这个函数了

61A8是来自EBP

 发现直接得出来的就是61A8

eax来自1037D3C     1037D3C是玩家指针

    CString tmp;
    tmp.Format(L"%d", _pgamebase->SRO_Player->MapId);
    AfxMessageBox(tmp);

    CString city;
    city.Format(L"%s", _pgamebase->SRO_Res->ReadTitle(tmp.GetBuffer())->wcstr());

    AfxMessageBox(city);

直接调用试试

发现弹出了 长安

来UI实现

void CHelperUI::Show()
{
	MoveHelper();
	this->ShowWindow(TRUE);
}
void CHelperUI::Init()
{
	if (hwndGame)return;
	wchar_t buff[0xFF]{};
	HWND _hwnd = ::GetActiveWindow();
	::GetWindowText(_hwnd, buff, 0xFF);
	CString _title = buff;
	if (_title == L"SRO_CLIENT") {
		hwndGame = _hwnd;
		CRect rect_me;
		GetWindowRect(&rect_me);
		helper_Width = rect_me.Width();
	}
}

void CHelperUI::MoveHelper()
{
	if (hwndGame)
	{
		CRect rect;
		::GetWindowRect(hwndGame, &rect);
		int helper_left = rect.left - helper_Width;
		if (helper_left < 0)helper_left = rect.left;
		::MoveWindow(this->m_hWnd, helper_left, rect.top, helper_Width, rect.Height(), TRUE);

	}
}


void CHelperUI::OnBnClickedOk2()//隐藏
{
	if (hwndGame)
	{
		::ShowWindow(hwndGame, GameShow=!GameShow);

	}
}


void CHelperUI::OnClose()
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if (hwndGame)
	{
		::ShowWindow(hwndGame, GameShow = true);
		ShowWindow(FALSE);

	}
	//CDialogEx::OnClose();
}

发现这个小窗口不会随着客户端的移动而移动,在没有游戏源代码情况下,最好的方法就是设置一个钩子

实现:

hookGameWnd = SetWindowsHook(WH_CALLWNDPROC, CallWndProc);//钩子



LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)//回调
{
	if (nCode == 0)
	{
		PCWPSTRUCT tmp = (PCWPSTRUCT)lParam;
		if (tmp->hwnd == _ui_helper->hwndGame)//当窗口句柄是游戏的时候
		{
			if (tmp->message == WM_MOVE)
			{
				_ui_helper->MoveHelper();
			}
			if (tmp->message == WM_CLOSE)
			{
				_ui_helper->HideGame();
			}
		}
	}
	return CallNextHookEx(_ui_helper->hookGameWnd, nCode, wParam, lParam);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用Java的图形库来实现小游戏窗口化。Java提供了AWT(Abstract Window Toolkit)和Swing两种图形库,可以用来创建窗口、绘制图形和处理用户输入。 下面是一个简单的示例代码,演示了如何使用Swing库创建一个简单的小游戏窗口: ```java import javax.swing.JFrame; import javax.swing.JPanel; public class GameWindow extends JFrame { private JPanel gamePanel; public GameWindow() { setTitle("小游戏窗口"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); gamePanel = new JPanel(); getContentPane().add(gamePanel); setSize(400, 300); setLocationRelativeTo(null); // 居中显示窗口 setResizable(false); // 禁止调整窗口大小 setVisible(true); } // 游戏逻辑更新方法 public void update() { // 在这里实现游戏的逻辑更新 } // 渲染游戏界面方法 public void render() { // 在这里实现游戏界面的渲染 } public static void main(String[] args) { GameWindow gameWindow = new GameWindow(); while (true) { gameWindow.update(); gameWindow.render(); try { Thread.sleep(16); // 控制游戏更新频率,约60帧每秒 } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` 这个示例创建了一个继承自JFrame的GameWindow类,通过JPanel来承载游戏界面。在`update()`方法中可以实现游戏逻辑的更新,在`render()`方法中实现游戏界面的渲染。在`main()`方法中,我们创建了一个GameWindow对象,并使用一个无限循环来不断更新和渲染游戏。 你可以根据自己的需求在`update()`和`render()`方法中实现具体的游戏逻辑和界面渲染。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

#A#

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值