恶意代码为感染型病毒,母体病毒通过将正常的PE文件进行加密,然后每个受感染的文件又可以进行全盘传播,通过连接国外IP服务器发送上线报文。
1)样本的网络行为、文件行为
2)感染传播的方式
通过母体文件,或被母体文件感染过的文件感染。
运行后会将恶意代码以及模块注入explorer.exe\Conhost.exe\winlogo.exe\dwm.exe等进程。
1)加密处理:病毒代码处理经过多层的解密指令,运行过程中对后续代码进行解密,解密代码会变形。例如原反汇编指令代码如下:
执行完【0042477D sbb byte ptr ss:[ebp-0x223],dh】这条语句后,机器码为C3的改成了E8,ret就变成了call。修改后的代码如下:
图:指令被修改
2)花指令:代码会在指令中增加00,在鼠标滑动时指令发生变化。
图:花指令
图:修改其程序内存
(2)API行为监控:
图:API行为监控
(3)感染文件变化:
图:源文件与感染文件对比
通过Malware Defender对被感染的文件进行监控,发现每个被感染的文件自成母体病毒文件向当前的系统进程dwm.exe进行了修改。通过dwm.exe文件访问国外IP。
图:注入进程,进程访问网络
病毒运行后会访问国外IP:148.81.111.121,通过VT查询该IP与多个恶意代码HASH绑定,Wireshark抓包后的数据包:
图:访问IP
通过Windows系统自带的DNS记录跟踪大量域名后,通过系统命令确定病毒感染后访问的国外IP绑定的域名为ant.trenz.pl。
图:Windwos自带DNS记录访问的域名
图:系统命令关联域名的IP地址
病毒代码执行前,首先获取kernel32.dll入口循环遍历代码所需函数,通过IDA静态可查看代码运行的结构是在不断进行循环。
图:OD-kernel32入口地址
图:IDA-kernel32函数地址遍历
当面对这类感染类病毒,很多使用寄存器进行传值的指令是无法用IDA轻轻松松F5查看源码的。
所以分析过程中我采用通过行为监控+动态调试的思路分析!打开Malware Defender,借助吾爱破解OD进行F8单层步过直到程序结束。当Malware Defender出现关键行为时,对走过的call进行记录,然后深入这个call再逐层分析。
跟踪到第6个函数时,程序出现了修改其他进程内存、其他进程中创建线程的行为。
图:第6个call为重点分析函数
通过反复还原虚拟机快照对比,发现该病毒在感染后 [cmp al,bl]执行的分支是不一样的,如果没有被感染的系统JNZ不跳转程序继续向下执行,否则JNZ则跳转到下一个分支处。对比值是eax与ebx的寄存器的低位值。此时的AL与BL的值分别为:Al=B7,Bl=00。
为了验证这个【B7】的值是否为随机值,切换到另外一台虚拟机再次单步跟踪有操作EAX的的位置,发现在00424A38地址处执行完【mov eax,dword ptr ds:[eax+0x34];】,B7的值就没有发生过改变,由此得出B7这个值就是病毒判断系统有没有被感染的标识,对比反汇编代码如下:
所有寄存器当前的值如下:
当前已知关键感染代码都在00424A65地址的call内,那么按照原有思路继续根据行为找关键call,F8单步跟踪所有的call后借助监控行为软件的结果细化分析各层call内的反汇编指令。
病毒代码处理存在两种方式,一种是对后续代码进行解密,解密代码会变形。另一种是后续代码是明文未加密直接调用明文。例如原反汇编指令代码如下:
执行完【0042477D sbb byte ptr ss:[ebp-0x223],dh】这条语句后,机器码为C3的改成了E8,ret就变成了call。修改后的代码如下:
图:指令被修改
在跟随中遇到获取kernel32.dll解密代码的算法。反汇编代码如下:
图:OD-反汇编代码
指令块通过jmp连接,跳转后有指令变形的红色提示。
图:通过JMP连接
进入代码变形后的指令继续跟踪,发现挂钩了底层API函数。对应的七个函数分别为ZwCreateFile、ZwOpenFile、ZwCreateProcess、ZwCreateProcessEx、ZwCreateUserProcess、ZwQueryInformationProcess、ZwDeviceIoControlFile;反汇编指令如下:
图:OD-挂钩七个底层API函数
第三层数第3个call后。F8跟踪过程中有一个底层API函数,ZwMapViewOfSection作用为创建内存将自身映射到进程中:
图:OD-调用ZwMapViewOfSection
第三层第4个call中还在进行多个循环进行判断解密长度、解密数据,当这个call运行完毕,指令块发生改变。
图:OD-Loop循环结束,指令块发生改变
跟进001F0796这个call内,病毒在此处进行了遍历进程的操作,但在此之前调用了FreeLibrary、CloseHandle可见已经进行了加载某个模块的操作。通过CreateToolhelp32Snapshot通过获取进程信息、进程使用的堆[HEAP]、模块[MODULE]、线程建立一个快照,然后跳过前4个进程后程序继续向下执行,反汇编代码如下:
图:OD-遍历进程
前四个进程遍历后使用OpenProcess做打开操作, CreateRemoteThread创建远程线程,反汇编如下:
图:OD-创建远程线程注入
单步跟踪发现每次经过001F0810地址的call便会出现修改其他进程内存的操作, 深入分析,发现这个call内会挂钩其七个api函数,挂钩的已知Api函数名为:ZwOpenSection、ZwMapViewOfSection、ZwDeviceIoControlFile、ZwCreateFile、ZwOpenFile、ZwCreateProcess、ZwCreateProcessEx、ZwCreateUserProcess、ZwQueryInformationProcess,反汇编如下:
图:OD-挂钩底层API函数
在远程线程注入执行后,在winlogon.exe进程出现了联网行为。再此之前的单步跟踪则是dwm.exe进行联网访问,推测病毒是将联网执行的恶意代码注入到某个进程后,将联网操作交给了被注入的进程中。且联网的进程是存在随机性的。
图:联网行为监控
运行后会访问国外IP:148.81.111.121,通过VT查询该IP与多个恶意代码HASH绑定,Wireshark抓包后的数据包:
图:访问IP
通过Windows系统自带的DNS记录跟踪大量域名后,用系统命令确定病毒感染后访问的国外IP绑定的域名为ant.trenz.pl。
图:Windwos自带DNS记录访问的域名
图:系统命令关联域名的IP地址
PChunter查看winlogon已经被注入了3个线程。
跟到最后的几个call,已经是运行原先程序的代码。因为我用母体感染的是我自己写的程序。printf(“11111111”)就是。。。
这个病毒分析起来还是有意思的,没有办法像某些常见病毒一样可以IDA F5大法轻松查看伪C代码。C和汇编的基础需要提升的前提下,也引发了一些思考。
virut详细分析 - 米哈伊尔 - 博客园
http://www.cnblogs.com/Mikhail/p/5615286.html
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)