查看原文
其他

一次去除广告弹窗的经历

2017-12-14 蓝色淡风 看雪学院


帖子写了将近两天,东西比较入门,适合小白,高手可以绕过,下面进入正题



预备知识



  • Kernel32.dll:内存,进程,文件等核心操作

  • User32.dll:用户界面,窗口,消息相关

  • Gdi32.dll:图形显示




所需工具



  • Ollydbg,Spy++



引言



有些软件虽然是免费的,但是很多时候有广告,这不免让人有时候感觉很烦躁, 比如下面的这个Winrar,你双击它,就会有广告出现,如下图:





最近笔者正好正在学习逆向,不如就拿它开刀吧!哈哈,说干就干!



正文



首先用OD加载,然后按CTRL+A进行分析,会直接来到入口点,如下图所示:



好像没有什么特别的,对于刚接触OD的新人有一点需要注意的是上面标题栏中会显示我们当前处于什么模块,这里显示的是我们目前处于主模块,如果不在主模块,我们就没有必要花费太多时间了(之后会继续说明)


一般而言,我们要逆向一个程序,大概有以下几种方法:


  • 自上而下分析方法
    从程序入口点(OEP)开始分析,模拟程序运行的整个流程,对程序进行分析,但是这种方法一般不适用于比较大的程序,(如果一个程序有几十兆,几百兆,乃至更大,按这种方法就不道要到猴年马月才能完成了,呵呵)


  • 自下而上分析
    运行程序,观察其行为特征,找到关键API,栈回溯分析,比如程序弹出了一个对话框,程序就很有可能用了MessageA/W,然后 从弹框栈回溯分析;如果找到窗口回调函数,也可以从窗口回调函数开始分析



  • 字符串分析
    根据弹窗提示的字符串,在调试器中查找,定位关键代码,再分析



这里笔者尝试过两种操作:


1.第一种是在反汇编窗口中:右击->查找->所有字符串文本,但是当程序里面有比较多的字符串的时候,这种方法就会比较麻烦;


2.第二种操作还是在反汇编窗口中进行,如下图所示:
使用智能搜索,它会把比较有"嫌疑"的几个字符串给你罗列到最前面(当然只是针对有明显字符串提示的程序),笔者亲测有效!



  • 源码对比分析
    分析源码特征,然后再调试分析,这种方法就是要求我们平常要不断地积累了.


好,这里我们先用字符串搜索法,得到如下界面:




貌似没有什么特别显眼的,看来是不能偷懒了,呵呵


下面再试试自上而下分析法?望着那一望无际的汇编,貌似对于我们这样的小白选手有点怕怕啊,哈哈


好吧,那我们就试试自下而上的分析方法吧,先观察程序的一些特征, 那行,就先把程序运行起来吧,可是之前已经运行过了,知道有弹窗广告出现,那它肯定用了弹出对话框的API,那是哪个API呢,这里,我们祭出一个武器:Spy++(一般VS的工具里面就有)



为了看得更清晰一点, 将图片放大:



将黑色准心拖动到广告窗口标题栏处,可以获取这个窗口的句柄,标题名(WinRaR),类名(RarReminder),风格,坐标等参数(其实微软已经很贴心地告诉了我们怎么用这个工具,就在Find Window下面),这里我们还需要注意两点:

  • 就是窗口2是在窗口1之后才出现的(两个窗口出现的间隔非常短 ,这就说明了弹出第二个窗口的函数就在窗口1的附近);

  • 在窗口2弹出来之后可以试一试能否在窗口1进行操作,发现是可以的,说明窗口2不是模态对话框;
    接着我们继续,可以先猜一猜它这里是用的CreateWindowA/W这类API(如果实在不行,可以再换),这里有同学可能会问,为什么不猜MessageBox,DialogBox这类Api,因为它们弹出的窗口都是模态对话框!
    按CTRL+G,输入CreateWindow,OD很智能,在下面会出现与你输入相关的函数,双击CreateWindowExA,在
    CreateWindowExA处下断点,同理,在CreateWindowExW处下断点。



然后按F9运行,得到如下界面 :



(突然发现原本在我的笔记里面很清晰的图片发到论坛里面貌似变得模糊了,-_-||,没办法,只得将图片放大再发一次)




在堆栈中发现此时的WindowName为 OldMainThreadWndName,继续运行,直到发现WindowName为:WinRaR, 如下图:


 

但是,貌似程序没有什么反应,继续运行,按 F9,直到出现下面这个界面:




此时我们发现堆栈中貌似有一些比较眼熟的信息WinRaR,RarReminder,它们好像在哪里见过,对了,上面我们在用spy++的时候就出现过,同时发现之前的那个窗口1出现了,好,下面继续运行,但是我们心里有数,广告窗口即将弹出了,果然不出我们所料, 经过几步的 F9,终于出那个广告窗口了,如下图(为了让大家看得清楚一点,没办法,多发了几个图,-_-||,将就看吧,整体局部的都发了):



整体图



局部图1



局部图2


但是奇怪的是,弹出这个广告窗口的函数居然来自于ole32模块,并非我们想要的 WinRaR主模块,继续运行几步,貌似也没有发现WinRaR的踪影,这可怎么办呢,总不能修改那些名字长得很"奇怪"的模块里面的代码吧,说不定就是与系统相关的模块,这肯定会出问题的,而且到现在为止,关键的地方我们肯定已经跳过了,不对,肯定是我们遗漏了什么,突然想起来上面有一个注意点,不知道大家还记得:


. 就是窗口2是在窗口1之后才出现的(两个窗口出现的间隔非常短 ,这就说明了弹出第二个窗口的函数就在窗口1的附近);


好,下面就重新加载一下OD,让我们来到刚弹出第一个窗口的地方:(地址为77CF0E51)

 


按工具栏中的K键,调用堆栈:



双击,我们惊喜地发现我们已经来到了主模块(地址为0013A891)




好,现在我们恢复一下思路,地址为0013A891 处的函数(CreateWindowExW)调用了从开始地址为77CF0E51处的代码,紧接着就出现广告窗口了,可见地址为0013A891 处的函数是一个关键点,是不是不让代码执行这里的函数即可实现去掉广告的想法,下面我们来实验一下:




下面将0013A879处的push 0x0修改为jmp xxxxxxxx(某个地址),这里的地址为0013A879处的指令的下方,但是不能选下面划横线的指令(在OD里面这种指令是属于随机地址,是重定位的,每一次加载的地方可能都不一样),这里我们就选择0013A89E这个地址,如下图:

 


紧接着保存,名为WinRaR1203.exe;




下面我们要验证之前的操作,就双击打开这个软件



我们发现一开始的那个广告确实没有了, 但是又有一个广告出现了,呵呵



好,既然如此,我们就兵来将挡水来土淹!下面我们将继续去除广告,在做下面这个任务之前我们先回顾一下之前去除上面一个广告的思路:

  • 先加载OD运行这个软件,观察其行为特征,发现其弹出的广告框是一个非模态对话框;

  • 再利用spy++找出与弹出的对话框相关的几个参数,接着搜索API,同时在API处下断点;

  • 重新用OD运行这个程序,分析找到关键地址,在关键地址处修改指令,去除广告成功!


下面我们开始继续了,按照之前的逻辑,我们先看一看这个广告对话框是一个什么样的对话框,我们发现其为模态对话框(这与之前的对话框稍微有点不同),



然后将WinRaR1203.exe这个程序直接拖入到OD中,搜索DialogBox相关的函数,在DialogBoxParamW与DialogBoxParamA处下断点,这次我们发现在第一个断点出就弹出了一个对话框。



接着继续查看调用堆栈,返回到主界面,可以推测是WinRaR的主函数调用了user32模块





按照之前的逻辑,可以改变DialogBoxParamW函数上面的代码,使得主模块里面不再执DialogBoxParamW这个函数即可,如上图,我们改变的是PUSh EAX这条指令,将其改为jmp 0146A980,改变之后的效果图如下:



接着我们继续保存文件为WinRaR120321,测试一下效果



很遗憾,显示的是WinRaR压缩文件管理器已经停止工作,咦 ,怎么出现这种状况的呢?原因可能是我们修改的地方出错了,下面我们再次把之前修改之前与修改之后的图拿出来做对比:




从两幅图的对比当中我们很容易就可以看出,指令1"不见了",而指令1恰恰有重定位的代码!


但是这里我还是有点疑惑,为什么我只改了PUSH EAX这一条指令,下面的那条指令为什么也"受到牵连"被改了,我们只得重新加载OD再次到达此处,修改另外一条指令,这次我们选中的是RETN 0x8下面的那条指令TEST AL,AL将其改为jmp 012BA908如下图所示:



再次修改,进行保存,名字命名为WinRaR120322.exe


下面进行测试:



发现这次终于不再弹出广告了,大功告成!!!



结语



最后总结下,对于此类有弹出对话框的小程序,一般性流程应该如下:

  • 先加载OD运行这个软件,观察其行为特征,确认弹出的广告框是何种类型;

  • 再利用spy++找出与弹出的对话框相关的几个参数;

  • 接着搜索API,同时在API处下断点;

  • 重新用OD运行这个程序,结合栈回溯分析找到关键地址,在关键地址处修改指令!
    除此之外,还总结出几点:

  • 要注意细节,稍微有所疏忽,将会导致全盘皆输

  • 心要细,眼力要好,要有耐心,哈哈

  • 心态要好啊,一般程序少则几小时,多则以天,月,甚至以年为计算都是有可能的.

  • 平常多注意积累一些程序的特征



最后以屈原的一句话作为结语:路漫漫其修远兮,吾将上下而求索!
由于本人水平有限难免有不足的地方,还请各位老师与朋友多提指导意见!







本文由看雪论坛 蓝色淡风 原创

转载请注明来自看雪社区



热门阅读


点击阅读原文/read,

更多干货等着你~


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存