分析VB样本的时候发现有几种混淆方式,记录下。
替换函数指针
样本shah:a66f989e58ada2eff729ac2032ff71a159c521e7372373f4a1c1cf13f8ae2f0c
载入vb.idc脚本,脚本分析完后,查看event handle函数,
1 | .text:00463E14 _O_Pub_Obj_Inf1_Ctl_Inf0x3_0x7_lpForm_Load dd offset Hdr_Jmp_Addr_0x46549A ; Ptr to Form Load Event Code. |
_O_Pub_Obj_Inf1_Event0x2
就是处理Form_load的函数,一般malicious code都是在这里实现。
接着往下看。
这里计算处shellcode的地址。0x43AF4B=1526C77h/(sqr(25.0))
1 | .text:00465D83 mov [ebp+var_50], 1526C77h |
在 [eax+0x6f8]
这个函数将shellcode地址替换,arg_0为Form_load的第一个参数,也就是Form类。
1 | .text:00465DA8 mov eax, [ebp+arg_0] |
[eax]中存放的是地址虚表,[eax+6f8h]地址正好是_O_Pub_Obj_Inf1_Method0x1方法,
1 |
|
替换指针,进入shellcode执行代码
1 | .text:00464434 add eax, 2B0h |
在shellcode中并没有使用常规的方式获取api地址,而是先找到msvbvm60模块的地址,再通过到处函数DllFunction来获得对应API的地址。
中间穿插了大量的花指令。
1 | .text:0043B10F get_api_address proc near ; CODE XREF: sub_43AF88:loc_43AF89↑p |
通过get_api_address函数获得shellNoitdyIconW函数。并调用两次。
第一次调用的时候dwMessage参数为NIM_ADD,打开控制面板\所有控制面板项\通知区域图标
会发现下面有一个空白的
这是因为PNOTIFYICONDATA被垃圾数据填充了。第二次传入NIM_DELETE删除托盘图标。
1 | .text:0043AF89 call get_api_address |
使用ZwSetInformationProcess绕过DEP保护的原理如下
1 | ULONG ExecuteFlags = MEM_EXECUTE_OPTION_ENABLE; |
关闭DEP以避免在栈上执行代码出现异常等问题。
1 | .text:0043B1FF push 'ssf' |
反调试
这里使用三处反调试,
- PEB.BeingDebugged
- PEB.NtGlobalFlag
1 | Stack[00000B48]:0012D7A8 push ebp |
接着往下走,还有一处反调试
1 | Stack[00000B48]:0012D94B loc_12D94B: ; CODE XREF: Stack[00000B48]:0012D965↓j |
最后更新: 2023年02月04日 21:42:44
本文链接: http://shxi.cc/post/a35e2cf4.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可,转载请注明出处!