逆向理论知识1

逆向思路:先进行思路的设计,然后再动手分析
实战:修改游戏分辨率640×480变成1920×1080

一. 分析思路

  1. 游戏显示→用到了分辨率这个数据→跟踪到数据源头→修改数据
    游戏显示用到什么技术呢?答:绘图技术
	GDI/GDI+:
	openGl:Linux下用的比较多
	Direct:
	
	这款游戏用到的显示技术,一定会有某种特征存在。我们可以用CE去找到这个特征,从而得知游戏用到了什么技术!

经过CE实证得出游戏绘图技术是Direct技术

  1. 通过在msdn的查找和对技术的猜测,游戏加载对应的模块以后一定会执行DirectDrawCreateEx 或DirectDrawCreate
    实证:在DirectDrawCreate,DirectDrawCreateEx下断点,通过逆向分析和Ctrl+F9,F7,把调用DirectDrawCreate的函数框架描绘出来

在这里插入图片描述

  1. 最后分析到了使用到屏幕分辨率的地址,然后通过修改栈上的数据(1920×1080),运行,验证了自己的猜想是正确的。

    在这里插入图片描述
    提出问题:为什么我们在x96dbg跳转到SetDisplayMode函数,跳转不过去呢?

二.确定虚函数的地址

理论知识:这个函数是DLL里面的函数,我们可以利用Window的Dll的一个特性:系统xxxx.dll在每个进程中的基址相同
	LPVOID lDx{};
	DirectDrawCreateEx(NULL, &lDx, IID_IDirectDraw7, NULL);
	if (lDx) {
		LPDIRECTDRAW7 lDx7 = (LPDIRECTDRAW7)lDx;
		lDx7->SetDisplayMode(1, 2, 3, 4, 5);
	}
实证:在测试进程中得到SetDisplayMode的地址,然后下断点,运行游戏。

在这里插入图片描述

总结:通过确定虚函数地址,我们也可以把调用函数的框架描绘出来。

三.制作补丁

  1. 通过对SetDisplayMode函数的逆向分析
int global_43d740 = 1;
int global_4391F8 = 0x10;//bpp
int global_43d75C = 0x698880;//Direct指针
int global_4391F0 = 0x1E0;//height
int global_4391EC = 0x280;//width
void SetDisplayMode() {
	int num1 = 0;
	int num2 = 0;
	int width = 0x280;
	int height = 0x1E0;
	if (global_43d740) {
		setDisplay(,,,)
	}
}

发现规律:我们可以通过去改变全局变量宽度和高度数值,达到改变游戏的分辨率;

  1. 在游戏的exe入口点下断点,然后通过CE查看存储游戏屏幕宽度和高度的值,发现程序一启动这两个值就有了

    猜测:(1)在TLS段被修改的 (2)天然的就是这个数字
    实证: 修改这个这两个值为1920×1080,运行游戏,发现数据被改了回来

    在这里插入图片描述

  2. 顺藤摸瓜,通过在OD设置内存写入断点,定位到了改变数据的函数
    在这里插入图片描述

  3. 实证:修改屏幕分辨率(1920×1080),保存所有修改到可执行文件,运行游戏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值