查看: 871|回复: 0

[原创图文] 逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

[复制链接]
发表于 2021-1-22 14:42:15 | 显示全部楼层 |阅读模式
功能实现:
找到原程序(带有流氓软件)
去掉程序中的广告
写一个练练看的外挂

已知条件:
VC 6.0 程序(MFC程序)
程序特点
1. 多进程
2. 有动态修改代码
3. MFC界面程序

分析思路一:
1. 找到原程序 exe
2. 加壳与脱壳
3. 多进程
4. 使用进程遍历工具分析
5. 调试,CreateprocessA/W下断分析

分析思路二:(一般有以下两种情况)
1. 去广告(对话框,网页)
2. 去广告API,常用的部分APIDialogBoxA/w(对话框弹出) CreateWindowExA/W(创建窗口) WinExec(启动可执行文件,或者打开一个网址) CreatePorcessA/W(创建进程) ShellExecuteA/W(创建进程))

分析思路三:写一个辅助
功能:一键秒杀
1. 分析+算法+模拟点击
找到连连看数组,使用算法完成自动连接
模拟点击对应位置,实现一键秒杀
2. 利用游戏本身功能函数完成一键秒杀
分析道具,使用指南针完成自动连接
找到消除CALL,实现一键秒杀


需要分析的数据以及代码:
1. 连连看数组
2. 指南针CALL
3. 消除CALL

工具:
OD CE PEID/exeinfo VS 其他

需要使用的技术:
1. MFC DLL
2. SetWindowLong
3. CallWindowProc
4. 多线程

分析测试思路:
搭建程序框架
1. 先去除捆绑广告
2. 分析数据
3. 搭建框架测试
4. 分析道具CALL,测试
5. 分析消除CALL,测试

正常打开游戏会出现很多捆绑广告:       

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

经过几次启动后才可以正常进入游戏

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
提取原程序:
打开游戏,查看一下游戏主体进程。
这个从任务管理器就可以查看的到。进程名:kyodai.exe
尝试单独打开游戏程序主体,是打不开的。

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
想办法提取一下
程序关掉,重新打开一下,观察到底是哪个程序打开的游戏程序主体,这里需要观察游戏进程,可以使用任务管理器,我在这里使用的是 PCHunter 32位的。
现在只有一个游戏进程

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
点击开始游戏,可以看到有两个进程在运行了

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
点击继续进入游戏以后呢,进程变成了这样

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
重新打开游戏,用OD 调试一下,附加到下图进程

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
这个程序之后,应该是创建了一个进程,所以:(动态修改常用的方式,就是创建一个进程,然后挂起,然后修改内存数据,然后再恢复,猜测也是以这个为出发点猜测)

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
创建进程的目的,就是启动游戏主程序,直接启动是启动不了的,猜测应该是用了WriteProcess 写入了一些值,下断点验证一下。

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
写入数据之后呢,唤醒线程

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
这里之后,程序应该就可以正常跑起来了。

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
OD中继续运行一下

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
继续运行,现在断点断到了创建线程这里

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
下面应该观察一下栈了

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
这里就是程序打不开的主要原因了

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
执行完修改内存的操作,就开始唤醒程序了

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
找到了被修改的地址,那么接下来就复原这个值,一个比较简单的方法,计算出该地址的文件偏移,在二进制文件中找到这个被修改的值,这个程序就可以正常启动了。
使用loadPE计算出被修改地址偏移

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
使用 010 Editor 更改一下被修改的值

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
到这里发现,文件只读,改不了。

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
修改成功了,启动试一下

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
可以正常打开了,偶尔打开会崩溃,多打开几次就好了。

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
下面开始分析原程序
回到游戏中重新观察一下
开始使用CE尝试搜索一下游戏数据,搜索不到,只能直接从OD开始分析了。

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
发现每次点击练习重新开始游戏的时候,连连看图标都会随机生成图标排列,猜测使用了randOD中对rand下个断点。
下完断点以后,重新点击练习开始游戏,确实从这里断下来了。
然后找数组的基地,先简单说一下我本人找到这个数组基地址的方法。方法比较魔幻,看一下就好。一路F8,发现在重复调用这个rand,再一路F8,找到了一个MOV单字节赋值的地方。
把这个地址在内存窗口Ctrl+G 搜索一下,找到了一个类似被赋值的地方
学习阶段,进行一下详细分析。重新回到这里,在给两个调用都下一个断点。
第一个调用应该是一个this指针进去看了一下,应该是一个音乐文件的调用,并不是想要的东西。

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
这里是一个关键的地方
走到这里发现有一个赋值的操作,OD 后面还给了注释,是一个memcpy

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
内存窗口搜索一下  0012BB50这个地址,F8走一下,当memcpy执行完的时候,内存窗口会跟着改变一个字节的数据。这里应该就是一个给图标数组赋值的地方了。将循环走完。
进去简单完了两下,发现消除后的图标,再内存中变成了00,可以确定这个数组了。

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
在内存窗口跳转一下,ctrl+g 里面输入 0012BB58,内存中数据与地图对应一下。

地图中的数据与内存中的数据可以对应上了。

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
可以确认EAX就是地图,但是前面还有8个字节的内容不知道是什么,但是不管是随机了多少次,前8个字节都是固定不变的,并且又是以偏移的形式得到的地图,那么前8字节很可能就是地图的基址。基址+偏移得到地图。
继续回到这里,eax 是从edx传过来的。那么edx是从哪里来的。下内存断点看一下。继续运行之后发现又运行回来了,那个应该有一个地图读取的地方。

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
重新点一下练习,发现内存断点处,数值是不变的,所以地图是提前存储了很多地图模板,验证猜想,接着找一下。

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
接下来是程序运行起来以后下内存访问断点的方式,是谁访问了这里,点击指南针道具,应该可以找到指南针道具的函数。
断下来了。

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
K查看一下堆栈调用

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
这里有五个调用,全部下断点。
接着执行,执行多次的猜测不是指南针调用,点击游戏图标断下来的断点,猜测也不是调用指南针的函数。
现在还剩下这两个断点

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
最后通过参数调用,三个参数,确定是断点三这里

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
寻找消除团的函数
知道哪个函数会可以使用指南针功能参数为(this,0,0,F0),调用它即可获取两个形同图案的坐标
我们想更加完善功能:让程序自动调用消除图案的函数,也就是说帮我们自动点击相同的图案,完成自动消除图案。
那么消除图案功能应该也是一个函数的调用,并且需要传递两个相同图案的X和Y坐标,调用之后需要将地图修改为00,由此,在内存中的地图下内存写入断点,然后在游戏中消除图案
在下断点的过程中,消除图案但是,发现并没有断下来,可能是由于内存跨页了,而我只设置了某一页的断点,所以我选中所有地图,下内存写入断点


编写辅助
关键代码

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

主要源码和游戏.rar

4.77 MB, 下载次数: 0, 下载积分: 学币 -3

逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...

温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的最好奖励,还可以获得学币奖励,请尊重作者的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
学逆向论坛-免费的逆向学习论坛
关闭

论坛公告上一条 /1 下一条

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