• 标 题:豪杰菜单处理函数分析和研究
  • 作 者:蓝星
  • 时 间:2004年4月05日 12:24
  • 链 接:http://bbs.pediy.com

豪杰菜单处理函数分析和研究

作者:nbw[NE365]
QQ : 343538175

http://nboy.cnwlt.com    很希望和Pe Diy爱好者交流或合作

 

       今天主要介绍如何寻找菜单消息处理的地方,和上两篇一样,我们依然拿豪杰解霸2003英雄版开刀。首先考虑最方便的方法吧,用w32dasm反编译,找到“文件”/“打开单个文件”菜单,其ID为: 9c41H。好了搜索9c41H,看看那里有没有类似sub  eax,  9c41  ;  jnz  ……的代码,如果有的话就中断到那里看看。结果没有(当然没有,要不我今天也不用在此长篇大论)。

       那就从 “打开单个文件”菜单的功能入手,这个菜单调用了通用打开对话框让用户选择视频文件,于是乎,调出TRW2000:

1、bpx getopenfilenamea    选中:"打开单个文件" 菜单,被TRE中断,下命令F12,弹出打开文件对话框,点取消,再次回到TRW,停留在一个ret处,击F10进一步,在上面的地址0167:0041ddd6处下中断命令,也就是这个call调用了刚才的getopenfilenamea函数。退出TRW;

2、取消中断bpx getopenfilenamea,只保留0167:0041ddd6的中断,并打开此中断,在豪杰中选中“打开多个文件”菜单,未被TRW拦截,说明我们刚才下中断的Call和“打开多个菜单”选项无关;

3、再次选中“打开单个文件”菜单,很明显,被TRW拦截,再次下F12命令,和第一步一样,取消弹出的打开文件对话框,TRW又停留在一个ret命令上,F10前进一步,向上面看是:0167:0041e116处,说明我们刚刚从这个call跳出来,清空以前的中断,在这里(0167:0041e116)下中断;

4、重复执行第二步的操作,也就是看我们的中断是否可以拦截到“打开多个菜单”选项,如果拦不到,再往外面的call跳,直到找到一个call,既可以拦截到“打开单个文件”也可以拦截到“打开多个文件”,这个Call就是0167:0041f0d1

 

现在看来:

:0041F0CF 50                      push eax  ;eax-->菜单句柄       

:0041F0D0 57                      push edi

:0041F0D1 E82A080000              call 0041F900

就是处理菜单选项的入口点。

现在我们再次选中“打开单个文件”追进这个Call,我们直到,这个菜单选项的ID是9c41H,注意观察,不出几步就到了下面的菜单ID处理部分,如下:

:0041F93A 8D86BF63FFFF            lea eax, dword ptr [esi+FFFF63BF] ;esi--->菜单ID,由此确定eax

:0041F940 3D88010000              cmp eax, 00000188                     

:0041F945 0F8715150000            ja 00420E60                       ;判断菜单时候都不跳    

:0041F94B 33C9                    xor ecx, ecx

:0041F94D 8A88E4124200            mov cl, byte ptr [eax+004212E4] ;根据上面查出的eax来确定cl

:0041F953 FF248D00114200          jmp dword ptr [4*ecx+00421100] ;根据ecx(其实是cl)确定要跳转的方向

最后的dword ptr [4*ecx+00421100]就是消息对应的函数。

由此可见,豪杰在对菜单的处理采用了数组方式,通过2次对数组的查找来完成最终的转向,相比对各个菜单ID直接比较,本方法更为高效,值得学习。

       上面我介绍的4步方法,其实是暴力破解中比较常用的方法,说白了就是,一个地方找不到切入点,我们就跳出去,到“外层”空间进行查找。一部分人对暴破不屑一顾,事实上每种方法都有它值得学习的地方!

       事情到此并未结束,我们看到:0041F0D1   call 0041F900是菜单的消息处理函数,现在仍然用TRW对这个call下中断,试验一下点击主界面上的按钮,比如说进度跳上面的那个讨厌的“播放影碟”按钮,看看发现了什么?

       噢,被TRW中断了。事实证明,我们刚才找到的Call是豪杰解霸的主消息处理函数。豪杰主窗口的大部分按钮和菜单的消息由他来接收。这样一来,我们对豪杰的DIY便大大方便了。

       既然发现了这个函数,我们就要对他改造一番,也显得咱“到此一游”。具体留下什么记号呢?就把进度条和“文件”菜单中间的那个按钮的功能改成“打开单个文件”吧。

       下命令bpx  0041F953(看看上面这个地址的作用),在F10 ,发现跳往0167:41F96E,也就是说从0167:41F96E开始就进入到了“打开打个文件”的功能。那么我们要修改的按钮呢?点击那个按钮,再次中断,看看往哪里跳?晕倒,竟然就是下一条命令0167: 41F95A。那么,我们就NOP大法,把从0167: 41F95A开始到0167:41F96E全部NOP掉。这样随便nop这么多指令,会不会由副作用呢?靠!我才不管那么多,要是不行的话再SMC嘛。调出Hiew,。。。。。。。。修改完毕,打开豪杰,点一下那个打开影碟的按钮,靠!?

       一切良好,咱们下节课再见!