首页
论坛
课程
招聘
关于unicorn去搞VMP的iat那点事
2021-12-27 11:00 12178

关于unicorn去搞VMP的iat那点事

2021-12-27 11:00
12178

关于unicorn去搞VMP的那点事

首先感谢!浩哥!龟哥!二木哥!小路哥哥!黎叔!存哥!曾哥!荣神!醒哥!砍老板!震哥!2st师傅!枪手师傅!hook师傅!VF师傅!彭指导!等等大师傅们的教导!!!!

 

其实看了很多帖子,关于unicorn去搞vmp的事情,最开始来源于 大表哥的github项目 unicorn_pe,于是自己也研究了一下unicorn和capstone的东西感觉很好用!于是乎准备写一下,一起来学!呜呜呜,本人技术比较垃圾,写的可能大师傅们几乎都会,所以不喜勿喷,留情!

VMP寻找OEP

其实关于vmp去找OEP的这一步我觉得是很关键的,因为在最开始加完vmp后,可以发现对应的text段,data段都是空的

 

image-20211227101512991

 

image-20211227101529683

 

可以看到是没有数据的,vmp在运行后,会动态的解密,这样text段就会有数据了

 

一般我们写代码都会用到像编译器这种东西,用什么vs呀,易语言呀,vc++ 6.0呀 等等等的,他们这些东西编译出来的都会有一点框架,所以我们一般对相应的遇见的第一个api下段就可以找到入口点,一般的api也就是GetVersion,GetSystemTimeAsFileTime,如果下段后的栈回溯在text段内,那么我们继续回溯即可

 

可以看到相应的可以对上了,我们直接溯到call jmp的位置进行dump即可

 

image-20211227102849337

VMP寻找iat

我们先分析没有加壳的代码

 

image-20211223104539097

 

可以发现call 为 FF 15 call (当然还有 FF 25) (mov reg,iat call reg / jmp reg)

 

这里以 FF 15 call 为例子,这里面都变成了 E8 call,因为要保持原来的6个字节的问题 所以一般 都是 push reg call xxxx / call xxxx ret

 

image-20211223104817486

 

以第一个 push eax call sub_4FBE6B 为例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.vmp00:004FBE6B 90                                      nop                     ; No Operation
.vmp00:004FBE6C 9F                                      lahf                    ; Load Flags into AH Register
.vmp00:004FBE6D 98                                      cwde                    ; AX -> EAX (with sign)
.vmp00:004FBE6E 58                                      pop     eax
.vmp00:004FBE6F E9 62 5A EC FF                          jmp     loc_3C18D6
.vmp00:003C18D6 87 04 24                                xchg    eax, [esp-4+arg_0] ; Exchange Register/Memory with Register
.vmp00:003C18D9 E9 F5 D8 F2 FF                          jmp     loc_2EF1D3      ; Jump
.vmp00:002EF1D3 50                                      push    eax
.vmp00:002EF1D4 B8 3F 15 28 00                          mov     eax, 28153Fh
.vmp00:002EF1D9 E9 2F 45 16 00                          jmp     loc_45370D      ; Jump
.vmp00:0045370D 8B 80 51 E1 00 00                       mov     eax, [eax+0E151h]
.vmp00:00453713 8D 80 CD 4A 08 4C                       lea     eax, [eax+4C084ACDh] ; Load Effective Address
.vmp00:00453719 87 04 24                                xchg    eax, [esp+0]    ; Exchange Register/Memory with Register
.vmp00:0045371C E9 8C 35 E4 FF                          jmp     nullsub_32      ; Jump
.vmp00:00296CAD C3                                      retn                    ; Return Near from Procedure

可以看到上面的流程最后一个retn 又因为xchg交换了 eax和esp的内存,所以可以判定出 iat的地址有关系的几句汇编是

1
2
3
4
mov     eax, 28153Fh
mov     eax, [eax+0E151h]
lea     eax, [eax+4C084ACDh]
xchg    eax, [esp+0]

iat = [28153F+0E151]+4C084ACD

 

image-20211223105335161

 

可以看到表示的没有问题

iat脚本

这里我使用的是unicorn来获取到对应的api,因为在恶意样本的操作的时候,一定会用到api做一些恶意的功能,也会对分析来说多了一点帮助

 

使用方法:

 

用x64dbg转到对应的段的内存布局进行文件dump

 

讲文件放在项目的目录下,以及将当前环境的reg的值填入(这里我延用了周壑老师的代码,进行了修改)

 

image-20211223105529537

 

因为周壑老师说的是抛异常的形式,那么我就按照异常的形式来捕获iat,因为对于api的这些内存的位置,我是没有map到内存中的,所以遇到iat就会出现异常

 

因为我看了很多地方都是E8 call,而且在text段中 call的位置为vmp段,所以直接暴搜E8 call即可,把这些位置记录下来然后遍历即可,根据ldr以及pe的解析就可以搞出来iat啦!

 

效果:

 

image-20211223105749933


【公告】看雪团队招聘安全工程师,将兴趣和工作融合在一起!看雪20年安全圈的口碑,助你快速成长!

收藏
点赞8
打赏
分享
最新回复 (17)
雪    币: 4891
活跃值: 活跃值 (688)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
如斯咩咩咩 活跃值 2021-12-27 11:09
2
0
源神!
雪    币: 2654
活跃值: 活跃值 (992)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
木志本柯 活跃值 2021-12-27 11:38
3
0
vmp是如何计算出将要执行的下一条指令的 它是从哪知道的   这些基础门槛我都分析过 但关于vmp是如何计算出下一条该要执行的指令我没分析过 
雪    币: 2654
活跃值: 活跃值 (992)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
木志本柯 活跃值 2021-12-27 11:55
4
0
003310D4    c0c4 52         rol ah,0x52
003310D7    D2C8            ror al,cl
003310D9    c0dc 57         rcr ah,0x57
003310DC    8D92 81D982CC   lea edx,dword ptr ds:[edx-0x337D267F]
003310E2    c1e0 26         shl eax,0x26
003310E5    66:0FBDC7       bsr ax,di
003310E9    3BEA            cmp ebp,edx
003310EB    F7D2            not edx
003310ED    8D92 FB71961D   lea edx,dword ptr ds:[edx+0x1D9671FB]
003310F3    33DA            xor ebx,edx
003310F5    81EE 04000000   sub esi,0x4
003310FB    0facc0 c5       shrd eax,eax,0xc5
003310FF    F8              clc
00331100    8916            mov dword ptr ds:[esi],edx
00331102    66:c1e8 c2      shr ax,0xc2
00331106    0FBAF0 C0       btr eax,0xC0
0033110A    8B07            mov eax,dword ptr ds:[edi]
0033110C    66:81FC 4444    cmp sp,0x4444

像这样lea edx,dword ptr ds:[edx-0x337D267F]的它是怎么知道要去这个偏移的地址处取数据的

雪    币: 2654
活跃值: 活跃值 (992)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
木志本柯 活跃值 2021-12-27 11:56
5
0
edx-0x337D267F 这些偏移每次重新运行程序貌似还都会变化
雪    币: 218
活跃值: 活跃值 (772)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kakasasa 活跃值 2021-12-27 12:53
6
0
mark一下
雪    币: 6082
活跃值: 活跃值 (1948)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
v0id_ 活跃值 2021-12-27 15:53
7
0
源神!
雪    币: 2330
活跃值: 活跃值 (2039)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
Jev0n 活跃值 2021-12-27 15:54
8
0
源神!
雪    币: 2473
活跃值: 活跃值 (3726)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
舒默哦 活跃值 1 2021-12-27 16:50
9
0
源神!
雪    币: 56
活跃值: 活跃值 (267)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fatcateatrat 活跃值 2021-12-27 16:56
10
0
木志本柯 vmp是如何计算出将要执行的下一条指令的 它是从哪知道的 这些基础门槛我都分析过 但关于vmp是如何计算出下一条该要执行的指令我没分析过
看看这个是不是:https://blog.csdn.net/pureman_mega/article/details/121750280
雪    币: 1949
活跃值: 活跃值 (3156)
能力值: ( LV7,RANK:118 )
在线值:
发帖
回帖
粉丝
tutuj 活跃值 2021-12-27 17:28
11
0
源神牛逼
雪    币: 1949
活跃值: 活跃值 (3156)
能力值: ( LV7,RANK:118 )
在线值:
发帖
回帖
粉丝
tutuj 活跃值 2021-12-27 17:30
12
0
快进到源vmp unpacker 
雪    币: 888
活跃值: 活跃值 (3427)
能力值: ( LV12,RANK:223 )
在线值:
发帖
回帖
粉丝
零加一 活跃值 2 2021-12-27 17:33
13
0
源神牛逼!!!!!!
雪    币: 1132
活跃值: 活跃值 (859)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
wuxiwudi 活跃值 2021-12-27 17:53
14
0
源神源神
雪    币: 4266
活跃值: 活跃值 (711)
能力值: ( LV4,RANK:42 )
在线值:
发帖
回帖
粉丝
蜜蜂啊 活跃值 2021-12-27 20:51
15
0
源神!
雪    币: 3875
活跃值: 活跃值 (1650)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
mudebug 活跃值 2021-12-28 03:37
16
0
牛逼
雪    币: 364
活跃值: 活跃值 (1771)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
ookkaa 活跃值 2021-12-28 11:47
17
0
IAT没用,不管是内核还是应用层,都是采用动态获取函数地址调用的,IAT中能看到的都是让你看到的
雪    币: 171
活跃值: 活跃值 (710)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
hackbs 活跃值 6天前
18
0
源神果然秀
游客
登录 | 注册 方可回帖
返回