改造你的FOXMAIL

 

前言

这不是一篇技术文章,因为事情是在一周前做的,现在我已经忘得差不多了,并且我也在一点也不想打开调试器,看着满屏的汇编代码,时间长了就觉得特别累——因为看不懂 :(

现在只大概讲一下思路和修改过程——跟别人讲自己的收获总是心情很好——让我们先看一幅图:

如果你用惯了FOXMAIL,马上就发现不同的地方,就是选项菜单下多了3个TOP x,这就是我改出来的。

可能你不屑一顾:这有什么难的,用ResHacker一分钟搞定!

你说对了,我就是用ResHacker改的,不过这不是关键,因为ResHacker改的只是资源,这些菜单怎么去响应事件才是我们要面对的难题!

我先来说说为什么要加这几个TOP x。

我自己没装杀毒软件,我用的FOXMAIL4.2也没有过滤垃圾邮件的功能,所以收邮件之前我要先打开远程管理,看信头,人工确认是不是垃圾信(我才不相信机器过滤呢)。FOXMAIL的默认值是1,即只能看邮件头一行,我曾经改为5过,不过这是静态的,就是固定死了,如果能从菜单里选择就“自由”多了,这是我开始之前的想法。

改这个我花了两天多时间,其中菜单花了一天多,改完后还想再加一个功能:突破帐号密码限制。做这件事件花了将近一天。改造后的FOXMAIL如果账号加了锁,如果忘了密码输入我的手机号也能打开,我的手机号是多少?嘿嘿。还是改菜单麻烦,因为这要响应事件。

 

工具

没有源码啊,有源码只用DELPHI就行了:)

调试器少不了的啦,我用:

OllyDgb

静态反汇编,没办法汇编看不懂啊,要汇编+注释才勉强能看懂,所以要用:

DEDE

此外还用到了LordPE,用来改区段属性为可写。用Topo增加区段(LordPE也能加,不过我不会用)。还有16位编辑器UltraEdit32。我后来发现用OD就能直接改,这些工具真是越用越有收获啊~~

 

思路

如果你写过POP3的程序,一定知道查看邮件头用的是TOP XXX,XX命令,第1 个参数是邮件ID,第2个就是行数,我们要改的就是第2个参数。整个命令是一个字符串,FOXMAIL把它发到POP3服务器,服务器就把信件内容发回来。

这个值在程序中是固定的,我们只要在菜单事件里改这个值就可以了。另外菜单点击之后要打上勾。如果程序是DELPHI 7写的,这个事件很好办,改资源就可以了,D7的菜单项设了单选和AutoCheck之后自己会改变打勾项。FOXMAIL是用D5写的,这件事件只能自己来做了。

 

过程

思路好简单呀,关键是怎么做,对不对?

很抱歉,我不打算把代码都贴出来,因为我不想再重复这一过程,凭记忆说一下——

添加菜单事件

DELPHI的事件如果是由编辑器生成的,直接找xxxClick这些字符串就能找到,同样的添加了新菜单,把它指到新事件,这些新事件这样命名就可以了。菜单和事件的关联在DELPHI生成的EXE里是放在一个事件地址表里,不过这个表通常排得满满的,插不进新的事件,所以要把它移到别的地址空间。

怎么移?

这里有一篇文章,专门讲这个,我参考了这篇文章:

http://bbs.pediy.com/showthread.php?s=&threadid=1872&highlight=Delphi

把原来的事件表移到新的位置后更改事件表项数,在原来的数值上加3——也就是新增的TOP 1,TOP5, TOP 10这3个项,在表最后加上3个事件,它们指针指到一个新的代码空间。

(很抱歉这里讲得很笼统)

定位TOP值

处理菜单事件的关联以后接下来要写事件处理的代码,也就是改那个TOP命令的值,TOP1改为1,TOP5 改为5……如何得到TOP值?

比较“正规”的方法是用调试器跟踪得到,简单一点是在OD里搜索字符串“TOP ”。记得TOP后面有个空格,如果没有的话你就惨啦,TOP是DELPHI可视控件的保留字,有得你仔细分辨的了。

找到TOP后往下看几行,很快就能看到字符的“1”,得到这个字符的地址后就可以很方便的用MOV命令改成别的值。

插入代码

如果空间不够那就要增加区段,并且设为可读写,可执行。这方面的知识请看有关PEDIY的文章。
代码大致如此吧:

xxxxxx1x mov byte ptr[xxxx], 31         //字符1,TOP1的事件指向这里
xxxxxxxx mov byte ptr[xxxx + 1], 20     //后面放空格
xxxxxxxx ret                            //先不考虑改变菜单打勾的问题,所以先返回
xxxxxx2x mov byte ptr[xxxx], 35         //字符5,TOP5的事件指向这里
xxxxxxxx mov byte ptr[xxxx + 1], 20    
xxxxxxxx ret                           
xxxxxx3x mov byte ptr[xxxx], 31         //字符1,TOP10的事件指向这里
xxxxxxxx mov byte ptr[xxxx + 1], 30     //字符0,
xxxxxxxx ret                           


给菜单打勾

写好上面的代码,菜单的功能其实已经有了,但了点了菜单之后还是不会打上勾,这样看起来很不舒服呀。
先用ResHacker把这3个菜单项设为同一组并且是单选类型,最后我们的代码只要设某一个为Checked,其它两个就自动把勾去掉。
关键还是代码,我们说代码吧。

如果是在DELPHI里写的话我们把3个事件指向同一个函数,然后一条语句就可以了,如:
procedure Top1Click(Sender: TObject);
begin
  (Sender as TMenuItem).Checked := True;
end;

在汇编里可以用这个思路,但是代码怎么写呢?Sender好象很好得到,EAX还是ECX就是,as TMenuItem这个却是很麻烦,我的做法是用D7写一个简单的PROJECT,后反汇编得到调这个函数的地址,打开后得到这个函数的代码,但是D7和D5的汇编码有点不同,所以要取特征码,拿这个特征码去FOXMAIL里边搜,搜到之后好象还要反朔3次才能拿到真正的入口地址,这样就可以用汇编写出上面的功能来了。


改写EXE

在OD调试,如果代码有错可能导致程序终止,所以记得先把代码COPY下来,一旦需要重启,恢复也是很容易的。
调试后好就把改变的地方写到EXE文件里,我第一次的时候是记下机器码,复制到记事本,然后用UE打开EXE,一个个输入。真痛苦啊,还报错!后来我看到OD直接就有COPY TO EXECUTE FILE的功能。在代码区右键菜单能够找到。


后记

到这里就算写完了,不过感觉根本没有讲清楚。算了,还是看我改过的EXE吧:
http://bbs.pediy.com/upload/files/Foxmail.part1.rar_31574.rar
http://bbs.pediy.com/upload/files/Foxmail.part2.rar_31619.rar
这不是完整的软件包,可以直接运行,不过看到的界面是英文的.
我用的是4.2版,直接替换应该没有问题,如果你用的是高版本最好先做备份.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值