文章总结: 本文以Windows扫雷为例入门游戏安全,利用CheatEngine和x32dbg逆向分析内存,定位关键地址与函数。通过远程线程注入编写DLL,实现了时间暂停、透视及一键扫雷功能。文章涵盖动态调试、内存修改及注入流程,适合初学者学习逆向工程与Windows安全机制。 综合评分: 87 文章分类: 逆向分析,二进制安全,实战经验


然后我们需要在**资源窗体**,新建一个**Dialog**,简单包装一个界面

这样我们在加载窗体的时候需要创建一个窗体类对象用它的`DoModal`方法去显示,用线程回调的方式加载并且初始化`InitInstance`
</code></pre>
<p>cpp
DWORD WINAPI DlgThreadCallBack(LPVOID lp) {
MineDlg* Dlg;
Dlg = new MineDlg();
Dlg->DoModal();
delete Dlg;
FreeLibraryAndExitThread(theApp.m_hInstance, 1);
return 0;
}
// CMineApp 初始化
BOOL CMineApp::InitInstance()
{
CWinApp::InitInstance();
::CreateThread(NULL, NULL, DlgThreadCallBack, NULL, NULL, NULL);
return TRUE;
}</p>
<pre><code>### 时间暂停
上面我们找到了它控制时间增加的指令,我们把它们全部 NOP 掉,就可以实现时间暂停 写两个按钮,创建下面的事件实现时间暂停开关。
</code></pre>
<p>DWORD GetBaseAddr() {
HMODULE hMode =GetModuleHandle(nullptr);
//LPWSTR s = (LPWSTR)malloc(0x100);
//wsprintf(s, L”基址:%p”, hMode);
//AfxMessageBox(s);
return(DWORD)hMode;
}</p>
<p>void MineDlg::OnBnClickedButton1() // 时间暂停
{
// TODO: 在此添加控件通知处理程序代码
autoBaseAddr=GetBaseAddr();
DWORD TimeOffset=0x579C;
DWORD TimeInsOffset=0x2FF5;
DWORD InsLen=6;
DWORD old;
VirtualProtect((void<em>)(BaseAddr+TimeInsOffset),InsLen, PAGE<em>EXECUTE</em>READWRITE,&old);
BYTE INS[]={0x90,0x90,0x90,0x90,0x90,0x90};
memcpy((void</em>)(BaseAddr+TimeInsOffset), INS,InsLen);
VirtualProtect((void*)(BaseAddr+TimeInsOffset),InsLen, old,&old);
}</p>
<p>void MineDlg::OnBnClickedButton2() // 恢复字节即可取消时间暂停
{
// TODO: 在此添加控件通知处理程序代码
autoBaseAddr=GetBaseAddr();
DWORD TimeOffset=0x579C;
DWORD TimeInsOffset=0x2FF5;
DWORD InsLen=6;
DWORD old;
VirtualProtect((void<em>)(BaseAddr+TimeInsOffset),InsLen, PAGE<em>EXECUTE</em>READWRITE,&old);
BYTE INS[]={0xFF,0x05,0x9C,0x57,0x00,0x01};
memcpy((void</em>)(BaseAddr+TimeInsOffset), INS,6);
VirtualProtect((void*)(BaseAddr+TimeInsOffset),InsLen, old,&old);
}</p>
<pre><code>测试
### 透视
经过上面动态调试我们得出结论:0x2F80函数是踩雷函数。 我们如果调用这个函数,是不是就能够实现透视了呢? 我们依旧采取线程回调的方式
</code></pre>
<p>void MineDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
DWORD ESPOffset=0x2f80;
DWORD FuncAddr=GetBaseAddr()+ESPOffset;
// 创建不带参数的线程
CreateThread(NULL,0,(LPTHREAD<em>START</em>ROUTINE)FuncAddr,NULL,0,NULL);
}</p>
<pre><code>测试
### 一键扫雷
跟透视差不多,只不过创建带参数的线程回调
</code></pre>
<p>void MineDlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码
DWORD ESPOffset=0x347C;
DWORD FuncAddr=GetBaseAddr()+ESPOffset;
//创建带参数的线程
struct{int a;} s ={0};
CreateThread(NULL,NULL,(LPTHREAD<em>START</em>ROUTINE)FuncAddr,&s,NULL,NULL);</p>
<p>}
“`</p>
<p> 测试<img decoding=)
总结
通过这个小项目,对WIN游戏安全有初步的认识,并且加强对软件的逆向思维,增强动态调试的能力,找到软件关键的基地址,通过CE修改器,初步pojie软件,了解软件的状态,修改时间(时间暂停等等),理解几个重要的API,FindWindow获取句柄,WriteProcessMemory写入内存信息,LoadLibraryA加载指定 DLL 并返回模块句柄,GetProcAddress,获取指定 dll 的导出函数的地址,CreateThread 线程回调函数等等。多写,多做,多调,多实验,加油,互勉。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:蚁景网络安全 IX221 IX221《游戏安全入门-扫雷分析&远程线程注入》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论