功能实现: 找到原程序(带有流氓软件) 去掉程序中的广告 写一个练练看的外挂
已知条件: VC 6.0 程序(MFC程序) 程序特点 1. 多进程 2. 有动态修改代码 3. MFC界面程序
分析思路一: 1. 找到原程序 exe 2. 加壳与脱壳 3. 多进程 4. 使用进程遍历工具分析 5. 调试,CreateprocessA/W下断分析
分析思路二:(一般有以下两种情况) 1. 去广告(对话框,网页) 2. 去广告API,常用的部分API(DialogBoxA/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开始分析了。
逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
发现每次点击练习重新开始游戏的时候,连连看图标都会随机生成图标排列,猜测使用了rand。OD中对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,由此,在内存中的地图下内存写入断点,然后在游戏中消除图案 在下断点的过程中,消除图案但是,发现并没有断下来,可能是由于内存跨页了,而我只设置了某一页的断点,所以我选中所有地图,下内存写入断点
编写辅助 关键代码
逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
逆向分析一个带流氓捆绑的连连看游戏,并提供一个写辅...
|