新样本

或者也叫老样本VirusTotal - File - d95eb625d766c959d7026f3537dc3bf17bb90063cc6480507e6b28bb74a069b6

以及神秘的东方拼音和东方文字。

体验正常安装

反正有快照,作一下

有点看不懂这个软件是干啥的,没有一点提示吗

虽然也有这个程序其实没什么用但是套了个壳子反正都能装一个病毒的想法。

但是病毒究竟是不是这个程序可能还未可知。

也有一种操作是正常安装一个没用的软件,然后真正的病毒悄悄的在其他地方释放。

不管怎么说还是得首先排除这个可能性的

追踪安装

用这个可能很low,不过很管用。

啊?真的假的,这么干净的吗?

注册表写入呢?计划任务呢?

不对,可能是这个工具没办法追踪注册表。

对对对个锤子,这是npcap安装包的对比,刚好手头上有个正常的安装包

这病毒也太友好了吧,那我得秒杀它才行。

分析

CODE:00460C50 调用,zlib解压并输出到temp目录。

疑似头顶是链表,完成个数标记后底下的是数据。

004650EA:刚完成createfileA读取dat文件(先前已经读取过一次,但那是为了显示窗口)并导出文件

确认主要逻辑代码。

对此我只能说,天啊,这也太善良了吧,指针位置都给我标出来了,我只要拿eax返回值就行了。

太有良心了。

(这里当时看到 VT 上那个 Creation Time 1992-06-19 22:22:17,第一反应是「不愧是 1992 年就在流通的老病毒」。这句是误读,得改:Delphi 链接器给它产出的所有二进制都写死这个时间戳,它既不是真实编译时间也不是上传时间,首次入库其实是 2016-05-27。不过这个假日期反过来看正是 Delphi 的指纹——和 PEiD 报的 BobSoft Mini Delphi -> BobSoft、以及后面在 IDA 里撞到的 TMemoryStream / Zlib::TDecompressionStream / Classes::TStream::GetSize,是同一条线索的三种说法。)

sub_460A6C:是否存在下一个文件(while循环条件)

sub_4609C4:读入文件名

sub_460AD4:将文件数据(流)写入到目标文件名中,流到文件名新流。

那么解压缩最有可能发生的地方是:sub_460AD4(参见下图)

不是,全是标准调用?解压缩呢?不会。。。。原样复制吧。

再观察了一遍,不应该,看来是我遗漏了什么,目前最有可能出现问题的是临时流。

没有直接从输入到输出,而是走了一个临时,很有可能这个临时流在输入的时候会自动处理压缩数据。

找到了,临时流竟然是可改的(MemoryStream),在重置的下一个函数。

接下来的步骤是寻找off_45C558是什么初始化参数。

off_45C558并不是一个data数据,是一个指向GetSize的偏移,但对于某些作者而言,指针不在0开始也是有可能的。

翻阅博客:

未见到其需要填入解压的参数,因此off_45C558可能只是编译器结果。

从内存中抓到了压缩的数据和解压后数据,但是这个压缩比有点可疑。

另外注意到71 1B 51开头的数据非常奇怪。

00200200,这是mem_zlib_out2截断的位置,只复制到这个位置。

来源是v10,由sub_419750确定,sub_419750看似是直接从a2读入数据到v10,并且必定读4,但是看流内容又不像,非常奇怪。

开始编写代码

感觉读得差不多了,可以开始了。

首先是dat的获取方法,拉到文件尾部,获取的这个长度是压缩后的数据长度。

跳转到的位置在 数据0x39 处,前四个字节是解压后数据长度,然后紧跟着就是压缩后buf。

那么压缩后buf的长度就是0x0026adcf - 8(减去两个长度值)

上代码:

得到的dat文件通过我写的Dat类进行处理,直接附上代码了,解析在上面分析原样本的时候已经给出了。

截图中没有截取到的右边部分和下面部分不重要,右边的是可以通过上下文推断出来的,下面的是测试用例,不重要。

收尾

代码在 cnb.cool/t1mmoc/tspace/pwngore/h24-installer-dat,样本和中间产物都以 GPG 容器形式放在里面(明文 PE 不发布)。

能落定的只有两件事:compress.dat 的头两字节是 78 da,标准 zlib 流头;解出来的 mem_zlib_out.dat 头两字节是 4d 5a。还有 compress.dat 和 compress-4.dat 之间正好差 4 个字节——就是解析代码里跳过压缩块时那个 -4。

没做完的也留在仓库里:0x67 和 0xC9 只验到「读掉一个字符串能对齐」,0x66 里那四个未知 DWORD 没解,mem_zlib_out2.dat 为什么截断在 00200200、以及 sub_419750 那个「必定读 4 但看流内容又不像」,两个结都没打开。