> 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码, 原文地址 [mp.weixin.qq.com](https://mp.weixin.qq.com/s/B88IzfNm3Blf-KLiH1oxSw)
亲爱的, 关注我吧
10/13
文章共计 1549 个词
预计阅读 8 分钟
来和我一起阅读吧
相关阅读:
本次是实现一个木马下载器(Trojan Downloader),从某个指定的 URL 中下载一个文件,并将其在后台偷偷运行起来。主要使用的 API 函数是 URLDownloadToFile 和 WinExec。
这次分两步开发,第一步开发一个复制自身到 C 盘 windows 目录的程序,然后再开发一个木马下载器,同时进行逆向分析。
1
开发复制自身的程序
VC6.0 默认情况下代码高亮效果不好,安装 VC++6.0 助手后效果会变好很多,当然也可以使用 visual studio。这个看个人喜好。
这段代码首先定义了一个 copyself 的函数,在 copyself 函数中首先定义了三个变量,其中前两个变量的数组长度为 MAX_PATH,它是一个宏定义,大小为 260。之后调用 GetModuleFileName 这个 API 函数,将当前运行程序的文件路径存入之前定义好的 szSelfFileName 变量,同理获得 windows 的路径。之后使用 strcat 函数将 windows 路径与 “\\backdoor.exe” 拼接,之后使用 CopyFile 将自身复制到 C:\windows\backdoor.exe。
运行效果:
查看运行前后的 C 盘 windows 内容:
运行后发现多了一个 backdoor.exe。
2
逆向分析复制自身的程序
使用 ida 打开,发现会弹出该对话框:
这是 pdb 调试文件,这是开发的时候发布的为 debug 版。如果修改为 release 版就没有 pdb 文件了:
这个 pdb 文件通常有时可以作为一个特征来筛选一个恶意软件,有时还会被设置 IOC 情报。所以有时需要关注 pdb 的相关信息。
main 函数:
双击进入第一个 call,这个 call 对应的就是 copyself 函数:
由于汇编语言太长,这里用 VC6.0 调试界面来展示:
直接看 0040103E 处开始的汇编语言,乍一看很复杂,看不懂。其中 rep stos 指令是 repeat 和 store string 的缩写,它循环执行 stos 指令,循环次数由 ecx 控制。stos 的作用是将 eax 中的值复制到 es:edi 指向的地址。再看 0040103E 处的汇编语言就清晰易懂了,先给 ebp-104h 赋值 0,给 ecx 赋值 40h(十进制的 64),然后 eax 清零,之后 edi 设置为 ebp-103h,使用 rep stos 指令循环 64 次将 eax 赋值给 edi 指向的地址,由于是以 dword 进行循环,所以一共 64*4=256 个字节,再加上 0040103E 处的 1 个字节,加上 0040105 和 00401056 处,1+256+2+1=260 个字节,刚好等于 MAX_PATH。
之后查看 GetModuleFileName 对应的汇编语言:
三个参数从右往左,第一个参数 104h 为十进制的 260,第二个参数 eax 为初始化的变量 ebp-104h,对应的是 szSelfFileName,第三个参数为 0,之后调用 GetModuleFileName API 函数。
使用 VC6.0 和使用 ida 的结果进行对比,虽然看起来不是很一样,但本质都是一样的。同理接下来调用 GetWindowsDirectory,strcat 和 CopyFileA。对应的汇编基本上都相对容易看懂,此处就不再过多赘述了。之后就是 if 和 else 为一个分支判断:
最终结束运行。
3
开发木马下载器
C 语言代码如下:
由于 URLDownloadToFile 需要 Urlmon.lib,所以需要使用 #pragma comment (lib,"urlmon")。URLDownloadToFile 关键参数有两个,一个是要访问的 URL,一个是要保存的文件路径。之后使用 winexec 函数运行下载后的程序,代码的实现很简单,主要就是两个 api 的调用。
使用另外一个机子,作为服务器,它的 IP 也就是 URLDownloadToFile 中的 URL,我们将第一步开发的程序改名为 test2.jpg,上传到该服务器上,然后使用如下命令开启 web 服务:
然后执行编译后的程序:
下载成功,并且会将其复制到 c 盘 windows 目录下。这里需要注意的是,需要先删除第一步复制自身到 windows 目录的程序执行后生成的 backdoor.exe,否则会报错,错误码为 80,使用 VC6.0 的工具查询:
4
逆向分析木马下载器
与之前类似,使用 rep movs 指令对一个数组循环赋值:之所以将 ecx 赋值为 7,是因为我这里整个 URL 为 28 个字符。然后对剩余的全部赋值为 0。
再调用 URLDownloadToFile,然后使用 cmp 对比返回结果与 800C0008h:
那么为什么要与 800C0008h 这个常量对比呢?按照我们开发时是 INET_E_DOWNLOAD_FAILURE,当 URLDownloadToFile 返回结果为它时表示下载失败:
使用 ida 可以将其转换回来,操作步骤如下:选中这个常量,然后右键:
然后便弹出这个:
选中合适的符号命名常量,然后点击 OK 即可:
然后执行 WinExec:
其中 push 5 为 WinExec 的第二个参数,使用同样的方法将其转换为常量:
转换后为 SW_SHOW,与我们开发的一样。
5
总结
这次实现了木马下载器,思路和实现很简单,主要就是调用 URLDownloadToFile 和 WinExec 函数。被下载的木马主要是调用了 GetModuleFileName 和 CopyFile 等函数将自身复制到 windows 目录。目前市面上的杀软应该都会对 URLDownloadToFile 这些敏感的函数进行查杀,所以本次案例仅供学习逆向分析使用。
6
相关实验
IDA 逆向分析实例
https://www.hetianlab.com/expc.do?ec=ECID321a-87b0-45bf-a21b-a2c8ca7d1b00
本实验首先通过一个简单的破解实验和大家一起熟悉逆向工具的使用,接着借助一道 0Ctf 中的逆向题目和大家一起对一个二进制程序进行逆向分析
10/13
欢迎投稿至邮箱:[email protected]
有才能的你快来投稿吧!
戳 “阅读原文” 我们一起进步