以下数据来自
版本: svk-protector v1.43
样本: xp下的notepad, 默认参数加壳
svkp特点:
1: 大量花指令
2: 调试器检测
3: 抽入口
4: 抽api
5: 驱动
6: 大量自修改SMC, 分快解密.
7: 大量构造运行栈. 运行栈指令
8: 异常处理
9:
9: 一些小技巧.
整体流程
附加SFX节中:
1: SMC几次后, 建栈指令, 栈中得到kernel.dll的imagebase, 出指令栈
2: SMC几次后, 建立kernel中的关键api, 如loadlibrary, virtualalloc等, 加密之
3: 分配内存块0, 内存快1, 内存快2, 自解密 (内存快1貌似没使用)
把fake_api_call的代码拷贝到内存快1, 其他代码数据拷贝到内存快2.
跑到内存快2继续执行.
内存快2中:
4: 建栈指令, 栈中分配内存快3, 内存快4, 拷贝自己代码到内存快3和4中.
5: 在内存快3和4中分别建立SEH, 解密内存快4, 产生c0000005异常.
6: 在4的SEH中解密内存快3, SEH_CONTINUE_SEARCH到内存快3
7: 在3的SEH中解密内存快2, 设置eip为内存快2解密后的代码,跑过去
8: 建栈指令, 栈中取消3,4中的SEH, 通过便例kernel32.dll中的export table
中的name table, hash一把name, 查一张hash表, 来判断这个api是否壳
自己需要用, 如果需要, 则去找symbol_addr, 然后加密后写另外张地址表
9: 接密数据得到user32.dll, 加载后, 用8同样的方法得到壳需要使用的api
10:释放内存快1,3,4, 分配内存快5, 解码自己的其他数据到内存快5中.
跑到内存快5继续执行.
内存快5中:
11:建栈指令, 栈中建立3个SEH连, 解码最后一个seh的handle代码.产生c00000005异常
12:seh解密数据, 跑到解密数据处继续执行.
13:建栈指令, 栈中分配内存快6, 把内存快1拷贝到6中, 取代原来的fake_api_call,释放快1
14:产生异常 c000008c(array_bound_exceeded), 等待seh处理
15:seh一直提交到第一个seh处理,解密数据, 跑到解密数据处继续执行.
16:再次解密数据, 产生c0000005异常, 是通过INT 1指令(异常会判断)产生的, 等待SEH处理
17:seh一直提交到第一个seh处理,设置新的eip, 跑到这个eip执行.
18:取消3个seh连. 接密数据得到advapi32.dll, 加载后, 用8同样的方法得到壳需要使用的api
19:打开驱动 GetSystemDirectoryA\svkp.sys 没有则生成改文件,驱动不存在则打开.
20:依次发送IoControlCode为222000,222004,222014,22200c的代码,判断返回值.
21:建栈指令, 栈中根据记录信息循环解密节数据, 资源和普通数据分开对待.
22:重建立IAT, SPECIAL.DLL这个sdk的dll另外处理.(抽api代码, 需要还原,很简单)
23:运行抽去的oep, 然后跑到原始oep+抽过的地方. (可还原,不过复杂)
至于具体步骤的详细流程, 一会会详细解释.
to be continued.
[课程]FART 脱壳王!加量不加价!FART作者讲授!