【文章标题】: 去掉O2Mania的广告
【文章作者】: Rex
【作者邮箱】: 744417059@qq.com
【作者主页】: http://hi.baidu.com/elevin
【作者QQ号】: 744417059
【下载地址】: 自己搜索下载
【作者声明】: 只是不喜欢弹窗广告,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  记得读高中的时候比较流行玩劲乐团,班里有一个高手,那手速看的我真是惊叹万分,我都看不清了,他还能稳健的连击。本人那个时候偶尔也玩下,不过水平很菜。
  
  后来因为一些原因很长时间没有去碰它了。去年某个时候,我又想起劲乐团来了,于是去网上搜,可惜啊,舞团还在,乐团却没有了。
  
  无奈找了个单机版的O2Mania,做的一般,凑活着可以玩一下。
  
  最近又把它翻出来了,软件没有更新,广告却一直在更新。本人觉得嵌入的广告无所谓,弹窗总让人有种不安全的感觉,于是决定来修整一下这个东东。
  
  首先PEID查壳,发现是VC7编译的,没有壳。
  
  使用WINHEX修改软件最后一个字节,执行软件,弹窗提示“软件被非法修改”,此时的标题栏为空。
  
  用OD载入,查找字符串,没找到。
  
  估计弹窗用的是MessageBox,于是给所有MessageBox下断点,F9直接到达了目标代码区域。

  首先是一个判定,如果文件自校验失败将继续执行本段代码。

  之后便是解密字符信息并弹出窗口的代码。

004280C1  |. /0F84 88000000 JE o2mania_.0042814F
004280C7  |. |B0 48         MOV AL,48
004280C9  |. |B1 2F         MOV CL,2F
004280CB  |. |884424 3E     MOV BYTE PTR SS:[ESP+3E],AL
004280CF  |. |884424 40     MOV BYTE PTR SS:[ESP+40],AL
004280D3  |. |C64424 38 4C  MOV BYTE PTR SS:[ESP+38],4C
004280D8  |. |C64424 39 33  MOV BYTE PTR SS:[ESP+39],33
004280DD  |. |884C24 3A     MOV BYTE PTR SS:[ESP+3A],CL
004280E1  |. |C64424 3B 0D  MOV BYTE PTR SS:[ESP+3B],0D
004280E6  |. |C64424 3C 4E  MOV BYTE PTR SS:[ESP+3C],4E
004280EB  |. |C64424 3D 44  MOV BYTE PTR SS:[ESP+3D],44
004280F0  |. |C64424 3F 38  MOV BYTE PTR SS:[ESP+3F],38
004280F5  |. |C64424 41 57  MOV BYTE PTR SS:[ESP+41],57
004280FA  |. |884C24 42     MOV BYTE PTR SS:[ESP+42],CL
004280FE  |. |C64424 43 21  MOV BYTE PTR SS:[ESP+43],21
00428103  |. |C64424 44 47  MOV BYTE PTR SS:[ESP+44],47
00428108  |. |C64424 45 3B  MOV BYTE PTR SS:[ESP+45],3B
0042810D  |. |C64424 46 00  MOV BYTE PTR SS:[ESP+46],0
00428112  |. |C64424 47 00  MOV BYTE PTR SS:[ESP+47],0
00428117  |. |33C0          XOR EAX,EAX
00428119  |. |8DA424 000000>LEA ESP,DWORD PTR SS:[ESP]
00428120  |> |8A4C04 38     /MOV CL,BYTE PTR SS:[ESP+EAX+38]
00428124  |. |F6D1          |NOT CL
00428126  |. |884C04 38     |MOV BYTE PTR SS:[ESP+EAX+38],CL
0042812A  |. |40            |INC EAX
0042812B  |. |83F8 0E       |CMP EAX,0E
0042812E  |.^|7C F0         \JL SHORT o2mania_.00428120
00428130  |. |55            PUSH EBP                                 ; /Style
00428131  |. |68 69C74A00   PUSH o2mania_.004AC769                   ; |Title = ""
00428136  |. |8D5424 40     LEA EDX,DWORD PTR SS:[ESP+40]            ; |
0042813A  |. |52            PUSH EDX                                 ; |Text
0042813B  |. |FF15 50C44A00 CALL DWORD PTR DS:[<&USER32.GetActiveWin>; |[GetActiveWindow
00428141  |. |50            PUSH EAX                                 ; |hOwner
00428142  |. |FF15 60C44A00 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
00428148  |. |33C0          XOR EAX,EAX
0042814A  |. |E9 9F010000   JMP o2mania_.004282EE

  观察一下前后的指令,发现作者有意对弹窗的文本进行了隐藏。
  
  隐藏的方法很简单:事先将输出文本求反,申请一段栈空间,然后用mov指令以立即数的方式将求反的数据移动到栈空间,之后循环再将栈空间中数据求一次反即可。
  
  简单的将判断的跳转修改为JMP之后,保存到文件o2mania1.exe,运行没有提示“软件被非法修改”了,不过点击“开始”之后,这个提示又弹出来了。先不管这么多,更正前面修改的最后一个字节,继续破解。
  
  和上面一样,对所有弹窗下断点。F9之后,本人先关掉了弹出的广告,再点开始,结果程序总是报错。本人看到基本的AntiDebug插件是开启,又尝试了一遍,不过这次我没有主动去关掉那个广告,成功断下。看来在调试程序的时候最好不要乱动。
  
  修改和前面一样,直接将条件跳转改成JMP,保存到文件o2mania2.exe。由于代码的基本逻辑和先前的那段差不多,就不再贴上来了。
  
  运行o2mania2.exe,没有发现问题,完整性检查已经被废掉了。
  
  可是奇怪的问题发生了,它不再给我弹广告了……
  
  这回都不好下断点了,因为可能是某种条件判定倒是弹广告的地方没有被执行。这个判定不是因为本人的修改所导致的,因为原版也不弹了。
  
  虽然难度又大了,还是继续。
  
  查找模块中的名称,发现弹窗最有可能用的是ShellExecute,于是全部下断点。看到所有调用比较少,于是逐个看了一下,没有什么可疑的。
  
  此时运行一下原版程序,奇迹般地又开始弹广告了,这真是太好了!
  
  对ShellExecute下断点跑一次,发现竟然没有断下来,看来这广告IE弹窗和其他的所有IE弹窗用的不是一种方式。之后又查了一下CreateThread,发现和IE弹窗还是没有关系。
  
  无奈之下,本人觉得还是认真看下字符串里面有没有什么可疑的地方比较好。
  
  找了一遍,没看到什么可以的文字,倒是有几个空字符引起了我的注意。
  
  凭借直觉,在里面手动跟了几次,越发觉得可疑,但无法下结论,因为字符可能还是隐藏的。直接在CreateWindowEx下断点并F9,解码出来的标题暴露了一个地址,把这个地址在Chrome中打开,发现就是内嵌的那个广告。此时软件的弹窗中的音乐突然响起,一看Chrome右下角,拦截了一弹窗。
  
  此时我的的感觉比较怪异。本来没想搞掉他的内嵌广告,结果反被他的内嵌广告搞了。找了这么久的弹窗,原来是内嵌广告里面弹出来的!
  
  有了这条线索,终结行动开始了。
  
  从CreateWindow一直往前找,找到了这个广告网址生成的地方了。它把这次还原操作由前面的取反改成了减法而已,这对于我们来说没有区别。
  
  之后我们要做的事情就是让广告显示不出来。至于怎么个搞法,我想大家都有自己的方法。我就直接把网址搞成一空字符串,测试显示很好,因为IE可以接受空网址。
  
  至于如何搞成空字符串,最简单的就是在数据源中,有目的的使其解析出来的第一个字符为NULL。
  
  本人由于没多想,直接自己再空白区写了一小段代码实现首字符清零。
  
  首先在广告参数传入之前改掉一个合适的地方,把代码跳转到我们编写的那段。

0043A67A   > \E9 810E0700   JMP o2mania_.004AB500
0043A67F      90            NOP

  这个是我编写的小段代码,将栈中广告链接首双字改0(只要首字节为0就可以),执行完再跳转回去。

004AB500   > \8B4C24 14     MOV ECX,DWORD PTR SS:[ESP+14]
004AB504   .  C74424 48 000>MOV DWORD PTR SS:[ESP+48],0
004AB50C   .  85C9          TEST ECX,ECX
004AB50E   .^ E9 6DF1F8FF   JMP o2mania_.0043A680

  到此为止,广告已经被去掉了,不过在界面显示广告的地方有一个框。使用ResHacker可以对这些资源进行修改。本人把那个显示广告的控件直接删掉然后把其他控件排列一下就OK了。仔细想想,貌似一开始就删掉这个岂不是更好,于是又试了一下,发现不行,虽然嵌入广告没有显示,但是弹窗还是出来了。
  
--------------------------------------------------------------------------------
【经验总结】
  使用内嵌广告进行广告弹窗的确是个有新意的想法。
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2010年02月28日 16:57:20