Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->编程语言 ->Delphi ->正文

为OICQ添加显示IP和端口功能

来源:Linuxdby.com 作者:Webmaster 时间:2007-06-05 点击: [收藏] [投稿]
特别申明:本文所述的内容只用于研究交流之用,如用作非法用途或修改不当,一 切后果自负!


我们的目标是去掉广告显示,并且在广告的位置上显示目标对象的IP地址和端口 号。我们应该怎么下手呢,好的,慢慢跟我来!


经过对Oicq目录结构的分析,发现目录AD和广告有关。其一是广告的英文简写就 是AD,其二是其中的图片文件就是我们在广告中看到的。试着删除该目录之后,呵 呵,广告消逝了。但是下次进入Oicq之后,程序会自动新建这个目录,并且重新下 载广告文件。既然程序读取不到广告文件广告就会消失,那么就人工让它读不到咯 。用Soft-ice把断点设置在CreateFileA上,这个API调用一般是用来打开一个文件 或者设备的。在Sice截到断点后,查看是即将打开的那些文件,从而判断是否是我 们要修改的地方。具体修改方法详见"打开广告文件的程序段"


广告是去掉了,但是在广告区域上点击鼠标,浏览器仍然会打开广告链接,看来 我们还需要对程序作更完善的修改。好了,既然点击广告会出现浏览器,那一定是 运行了一个程序。一般打开运行浏览器程序的有两种方法,一是调用COM接口,二 是调用普通的运行程序的API函数。第一种方法技术难度较高,一般程序很少采用 。所以直接用Sice把断点设置在几个和运行程序有关的API函数上,比如 ShellExecuteA,WinExec等等。好了,程序在ShellExecuteA处中断,也就是只要 避过这个API函数就行咯。呵呵,顺着程序往上找合适的修改位置,会发现 USER32.PtInRect函数的调用,经过分析,发现它是用作判断鼠标点击是否在特定 区域内的。搞定,只要使它判断总是在区域外,就不会执行到ShellExecuteA那儿 去了。发送消息窗口和恢复窗口的广告点击的程序在不同的位置,也就说在两个地 方,这两个地方都要修改,原理也都是一样。具体修改方法详见"发送消息窗口点 击广告的程序段"和"回复消息窗口点击广告的程序段"。(我们为了实现在点击鼠 标后出现IP地址和端口号,在发送消息窗口添加了一个有关显示的程序入口,我将 在后面讲解)


这下广告真的是去除了,既不能看到,也不能点进去了。呵呵,开始我们的下一步 目标,显示IP地址和端口号!!!


过去要想知道Oicq上朋友的IP地址只有借助民间的一些小工具程序或者采用包监听 程序,后者专业要求比较高,而且辨别率低,也不方便。一些小程序的确很管用, 但是毕竟没有把这个功能直接做到Oicq程序上方便和可靠,利用Oicq内部的很多数 据和结构能获得很多我们平常不容易获得的信息。但是毕竟只有二进制汇编代码, 没有源程序,程序的分析难度和工作量可想而知。经过令人难以想象多次数的死机 和重起,以及极其艰辛的设置断点跟踪调试分析工作……(以下省略5201314字) ,终于粗略的获得了我们感兴趣的数据结构指针以及它相关调用的位置。这段时间 是我最郁闷的时候,想起那段毫无人性的工作,就像已经过上幸福生活的老同志回 忆起49年以前悲惨生活般的胆战心惊且心有余悸……(以下省略520字)。还好我 挺过来了,终于在0042513D处找到了需要的指针地址。只要利用这个指针就能获得 目标对象的IP地址以及端口号。我们需要做的就是把这些信息显示在以前的广告位 置。


又是一项艰巨的任务放在我的面前,还好我有坚定的信念、丰富的临床经验以及对 成功喜悦的企盼,还有对聊天MM住址的渴望,我一定会珍惜,不能像周星星一样期 望再来一次……(再次省略若干,以免挨鸡蛋)。 言归正传,既然获得了关键的数据指针,那可以说我们已经成功了90%了,接下来 的就是显示出来而已。但这也需要反复的试验和修改。让我们好好来回味一下这一 过程:


首先,要实现新的功能毫无疑问需要添加代码和数据,以及执行一定的API函数, 所以需要找到适当的方法添加代码到原程序之中。完美的方法就是作一个外壳添加 程序,在原程序中添加所需要的段(数据段,程序段),以及添加Import表表项, 以用于新的API函数的地址定位,还要修改PE文件头中的各项相关信息,这就是病 毒的做法。这无疑非常的复杂和繁琐,有兴趣的同学可以参见我以前的文章"关于 95下可执行文件的加密研究"。其实我们的要添加的程序量并不大,充其量也就零 零星星的几百个字节,而且用到的API函数也不多。所以我们采取了手动修改添加 的方法,但也需要必要的条件和方法。看我以下的分析和方法:


PE可执行文件的逻辑结构是段,比如代码段".text"、数据段".data"、资源段". rscs"等等。这些段大小都是按文件对齐,也就是说段大小至少会按10h对齐,一般 是1000h(4096字节),这由文件头中指定(链接的时候确定)。但是代码也好数 据也好,不可能做到长度刚好是对齐的。也就是说,段的大小是大于段中代码或数 据实际大小的。他们之间的差值就是该段冗余的空间,这个空间被称为"空隙"。有 一些简单的PE文件减肥软件就是去掉"空隙"的方法来减肥的。这个"空隙"可以被我 们用来放置代码、数据以及堆栈。我常用的分析PE文件文件头的工具软件是 Borland 以前在C++系列软件中带的"Tdump.exe"。让我们看看实际分析的结果:


Object table:

# Name VirtSize RVA PhysSize Phys off Flags

-- -------- -------- -------- -------- -------- --------

01 .text 000D0637 00001000 000D1000 00001000 60000020 [CER]

02 .rdata 000320E8 000D2000 00033000 000D2000 40000040 [IR]

03 .data 00039848 00105000 00012000 00105000 C0000040 [IRW]

04 .rsrc 0003E4C0 0013F000 0003F000 00117000 40000040 [IR]


以上是用看到的Oicq.exe的段信息(它的Oject就是我们所说的段)。我们肯定是 首选.text段进行观察(.text是代码段,Flag为CER,意思就是包含代码、可执行 、可读的意思(Contains code, Execute,Readable))。可以看到,.text段代码 实际长度D0637h,物理长度D1000,文件偏移位置为1000h处。OK,这个段有 D1000h-D0637h=C9Ch的"空隙"。这个长度完全可以满足我们的需要了,而且代码 数据堆栈都可以放在这个区域内。众所周知,要作为数据段使用,段的属性( Flags)需要可写。好了,只需要改写".text"的属性即可,可写属性的值是 80000000h,然后加上原来的60000020h后,就是C0000020h了,也就是变成了CERW 属性(具体修改方法详见"代码段段属性修改")。看看我们更改后的用Tdump分析 的结果。

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:Delphi下常用转换(一)   下一篇:公历到农历的转换法

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号