clamav是一个开源的病毒分析工具。这次分析主要是要看一下里面的一个Aspack的脱壳技术。
分析clamav
源码里有aspack.c/.h
文件。定义了一个unaspack
函数。
1 | int unaspack(uint8_t *image, unsigned int size, struct cli_exe_section *sections, uint16_t sectcount, uint32_t ep, uint32_t base, int f, aspack_version_t version); |
不过感觉上去是个内部函数,里面是直接对image进行解包的。
看一下这函数在哪里被调用了。
在pe.c
里面:
1 | CLI_UNPRESULTS("cli_scanpe: Aspack", (unaspack((uint8_t *)src, ssize, peinfo->sections, peinfo->nsections, peinfo->vep - 1, EC32(peinfo->pe_opt.opt32.ImageBase), ndesc, aspack_ver)), 1, (src, 0)); |
这是在一个又臭又长的cli_scanpe
里面实现的。
1 | int cli_scanpe(cli_ctx *ctx) |
在scanners.c
里面:
1 | cl_error_t cli_magic_scan(cli_ctx *ctx, cli_file_t type) { |
clamunpacker
sourceforge.net/projects/clamunpacker/
源码down下来,稍微改一下
首先把pthread.h
的timespec
给注释掉。
然后把snprintf.h
的snprintf
函数给注释掉。
这两个玩意都是重定义了。
真是绝绝子了,不告诉人怎么使用他们的宝贝工具。
测试了一下大概应该这样传参:
1 | ./clamscan.exe filepath dirpath filepath |
添加Aspack高版本支持
首先在aspack.h
里面添加:
1 | #define ASPACK_EP_OFFSET_212 (58 + 0x70e) |
在aspack.c
添加:
1 | #define ASPACK_BLOCKS_OFFSET_212 0x57c |
然后把全新的unpack
函数给加进来(原来只有unpack212
函数)
aspack.h
里面也要加一下函数原型:
1 | int unaspack(uint8_t *image, unsigned int size, struct cli_exe_section *sections, uint16_t sectcount, uint32_t ep, uint32_t base, int f, aspack_version_t version); |
关于epbuff_offset
不同版本下,epbuff_offset都不太一样
比如我的一个例子是:0x417438 - 0x417001 == 0x437
这个还是挺麻烦的。
不过我重新看了一下老师的项目要求,是明确了ASPACK2.12
修改了下others.h
1 | //#define cli_dbgmsg (!UNLIKELY(cli_debug_flag)) ? (void)0 : cli_dbgmsg_internal |
参考
Release ClamAV 1.1.0 · Cisco-Talos/clamav (github.com)
sourceforge.net/projects/clamunpacker/
- 本文作者: Taardis
- 本文链接: https://taardisaa.github.io/2023/06/13/分析clamav/
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!