吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 44770|回复: 130
收起左侧

[游戏安全] 红警2共和国之辉开启调试功能(干货)

  [复制链接]
JuncoJet 发表于 2019-5-22 15:09
本帖最后由 JuncoJet 于 2020-7-7 13:09 编辑

学习本章内容前请先掌握上一章节知识(不掌握问题也不是很大,直接拿程序走人)
红警2秒杀原理剖析干货级讲解和专用修改器实现
https://www.52pojie.cn/thread-937873-1-1.html
(出处: 吾爱破解论坛)

前言
不搞前言什么什么的了,直接开始本章内容。
本章内容.gif

正文
也许有部分人有分析过红警2,也许也有人看到下面这种代码,
Image 415.jpg
在OD调试的时候,会有很多字符串的提示,看着对程序的分析很有帮助,跟进CALL里如下图
Image 416.jpg
对,就直接RETN了,什么也没有。这个就是被阉割的调试输出,本章节将围绕开启调试功能进行深入展开。

Image 415_2.jpg
我们以这个CALL为例,可以看到CALL的下面有ADD ESP,0x4之类的,并且CALL之前没有ECX EDX之类的操作,这个就是典型的__cdecl调用约定的特征。
啥是佩奇,不对,啥是__cdecl?__cdecl是一种常见于C语言和C++编写的程序里的调用约定,是种默认的调用约定。他的伪代码如下
[Asm] 纯文本查看 复制代码
fun:
        retn
main:
        push 参数3
        push 参数2
        push 参数1
        call fun
        add esp,4*3
        retn

可以看到,这种调用约定调用者在调用完成后,必须负责恢复栈指针(ESP寄存器)。遵循谁调用谁清理原则,这种调用的优势是什么?
在Windows API中大多数采用__stdcall(后面会介绍),但是少数的也会采用__cdecl约定,例如wsprintf能够支持不固定个数的参数,栈允许的情况下能支持无限多个,这自然需要归功于__cdecl这种调用机制的功劳。除此外,其实还有__stdcall __fastcall __pascal __thiscall等调用约定。
__stdcall比较常见的调用约定,被大多数程序所支持,调用者无需自己清理栈,伪代码如下
[Asm] 纯文本查看 复制代码
fun:
        retn 4*3
main:
        push 参数3
        push 参数2
        push 参数1
        call fun
        retn

__fastcall在Windows中底层会采用此调用约定,因为顾名思义,因为使用ECX和EDX寄存器性能较其使用栈(内存寻址)更快,他的伪代码如下
[Asm] 纯文本查看 复制代码
fun:
        retn 4
main:
        push 参数3
        mov edx,参数2
        mov ecx,参数1
        call fun
        retn

__pascal这个是pascal语言所采用的调用方式,他的调用顺序是从左到右,而__stdcall是从右到左,其他方面并没有任何差别,他的伪代码如下
[Asm] 纯文本查看 复制代码
fun:
        retn 4*3
main:
        push 参数1
        push 参数2
        push 参数3
        call fun
        retn

delphi虽然使用pascal语法,但从本坛的很多逆向资料来看,调用方式接近于__fastcall,把参数会压入EAX和ECX寄存器。
__thiscall是C++ CLASS的调用方式,把*this会放进ECX寄存器,类似于__fastcall的__stdcall调用约定,较高性能的一种调用约定,他的伪代码如下
[Asm] 纯文本查看 复制代码
fun:
        retn 4*2
main:
        push 参数2
        push 参数1
        lea ecx,[this]
        call fun
        retn

那所有的调用约定原理都已经学习过了,我们接下来就做补丁吧,先按照上次课程所学的窗口消息(SetWindowsHookEx)的方式注入游戏。然后用今天我们所学的,__cdecl调用约定来重新实现个调试输出的补丁,并且会使用的上个章节提及但并没有演示的inline hook部分。
Image 417.jpg
代码写完大概就是这个样子
[C] 纯文本查看 复制代码
void dbgOut(DWORD p){//因为C语言里默认的调用方式__cdecl,所以可以不用描述词
        DWORD *d=(DWORD*)((DWORD)&p-4);//指针概念,p是进入的参数,&p是他的参数栈的地址,&p-4就是返回地址
        if(!strstr(d[1],"Theme")){//过滤掉Theme消息,太多了 
                sprintf(&buf[0x200],d[1],d[2],d[3],d[4],d[5],d[6],d[7],d[8],d[9],d[10]);//sprintf也是__cdecl调用约定,所以我输入多少个参数和他这个API无关,始终能保持栈的平衡
                sprintf(buf,"[Ra2DbgOut] %08X %s",d[0],&buf[0x200]);//加一个前缀,显得更酷炫,并且把返回地址显示出来
                OutputDebugString(buf); //输出调试信息,能够在dbgView中进行查看
        }
}

接下来我们来耍一下吧
Image 412.jpg
上图可以看到初始化信息,人和电脑选择的国家
Image 411.jpg
上图可以看到最终的比分,和下面这个图上是一样的
Image 409.jpg

然后我们可以尝试建造,暂停等操作
Image 413.jpg
调试信息中能看到触发事件,并且成功得到目标代码地址,然后一个调试器过去
Image 414.jpg
接下来怎么做大家都懂的,
讲的比较粗,有问题可以在下面留言提问,我不一定会回答

Ra2DbgOut.zip

13.51 KB, 下载次数: 307, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 16威望 +1 吾爱币 +23 热心值 +16 收起 理由
ufoxshang + 1 + 1 好文章,值得学习
金帛 + 1 + 1 好文章!
Sinclair + 1 + 1 谢谢@Thanks!
hcddgjs + 1 + 1 我很赞同!
15699012385 + 1 + 1 热心回复!
Halry + 1 用心讨论,共获提升!
CWJYBB + 1 + 1 热心回复!
叫我大王 + 1 + 1 谢谢@Thanks!
紫枼 + 1 + 1 热心回复!
18252590140 + 1 + 1 感谢楼主教学,就不知道有没有Win10版本能玩的起来的红警版本
4everlove + 1 + 1 谢谢@Thanks!
willJ + 1 + 9 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
海天一色001 + 1 + 1 谢谢@Thanks!
海水很咸 + 1 + 1 我很赞同!
师太请您自重 + 1 + 1 永远的经典!!!
gongcrx5 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

stars时代 发表于 2019-5-22 20:26
不搞前言什么什么的了,直接开始本章内容。
 楼主| JuncoJet 发表于 2019-5-24 09:20
qq274418477 发表于 2019-5-24 09:14
大佬,我昨天把这两个帖子的都下载了。就是没有你说的dbgview。

请去微软官网下载,给你个传送门https://docs.microsoft.com/zh-cn/sysinternals/downloads/debugview
Mc15298399947 发表于 2019-5-22 15:28
shaokui123 发表于 2019-5-22 15:36
想起了H大的那句“都是玩红警,人家随便一玩就是精华”
catboy 发表于 2019-5-22 15:46
这个调试功能有什么用?只是秒杀?
 楼主| JuncoJet 发表于 2019-5-22 15:50
catboy 发表于 2019-5-22 15:46
这个调试功能有什么用?只是秒杀?

显示游戏原始的调试的信息,帮助分析游戏用的
m0216 发表于 2019-5-22 16:23

这个调试功能有什么用?
 楼主| JuncoJet 发表于 2019-5-22 16:27
m0216 发表于 2019-5-22 16:23
这个调试功能有什么用?

很有用的啊,不理解的话就只能坐等我的连载了。
nbk_LXu 发表于 2019-5-22 20:06
共和国之辉...这么怀旧,感觉有些暴露年龄了啊
KaQqi 发表于 2019-5-22 21:30
本帖最后由 KaQqi 于 2019-5-22 21:34 编辑

“调试信息中能看到触发事件,并且成功得到目标代码地址,然后一个调试器过去”

怎么得到的目标代码地址?

我的意思是你的程序是怎么实现获得触发事件地址的

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-19 01:27

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表