代码保护软件VMProtect学习笔记——反汇编引擎学习(中)

VMProtect是一种很可靠的工具,可以保护应用程序代码免受分析和破解,但只有在应用程序内保护机制正确构建且没有可能破坏整个保护的严重错误的情况下,才能实现最好的效果。

【下载VMProtect最新试用版】

Decode_SetReg函数分析

代码保护软件VMProtect学习笔记——反汇编引擎学习

一共有3组,每组0x17个字节,包含结尾表示0xFFFFFFFF,这些都是保存目标操作数或则源操作数信息的

代码保护软件VMProtect学习笔记——反汇编引擎学习

v6 = (v9 >> 3) & 7;首先v9=0x74,继续我们的查表

转换成二进制如下:0x74=01 110 100/span>

代码保护软件VMProtect学习笔记——反汇编引擎学习

很明显v6=ModRM.reg(Esi)/span>

代码保护软件VMProtect学习笔记——反汇编引擎学习

分析Decode_ModRM结构

首先解析ModRm判断寻址模式/span>

代码保护软件VMProtect学习笔记——反汇编引擎学习

首先先将ModRM转换下/span>

代码保护软件VMProtect学习笔记——反汇编引擎学习

转换成二进制如下:0x74=01 110 100

代码保护软件VMProtect学习笔记——反汇编引擎学习

0x40=01,0×80=10,0xC0=11以此类推

判断是否需要SIB寻址方式

代码保护软件VMProtect学习笔记——反汇编引擎学习

R/M==8(100),只有ModRM.mod寻址模式是11(寄存器是不带SIB的).第一种这里是ModRM.mod 提供寻址模式: 11 = register(寄存器)。直接保存ModRM.r/m

代码保护软件VMProtect学习笔记——反汇编引擎学习

第二种情况存在SIB寻址方式。根据上文找到的地址发现是[–][–]”,表示有SIB表。SIB结构如下:

代码保护软件VMProtect学习笔记——反汇编引擎学习

转换成2进制如下:0x24=0101100/span>

代码保护软件VMProtect学习笔记——反汇编引擎学习
  1. 读取SIB字节
  2. ((unsigned __int8)v10 >> 3) & 7; // SIB.index 提供 index 寄存器寻址
  3. v9->SIB_base = SIB & 7; // SIB.base 提供 base 寄存器寻址
  4. if ( v9->ModRM_Reg_Or_SIB_index_Or_ModRM_rm == 4 )// SIB.index 提供 index 寄存器寻址是否是none 4 = (100)
  5. 假设index寄存器!=4就保存SIB.scale 提供 index 寄存器乘数因子 scale
  6. 判断SIB.base 提供 base 寄存器寻址是否是[*] 5 = (101)

代码保护软件VMProtect学习笔记——反汇编引擎学习 代码保护软件VMProtect学习笔记——反汇编引擎学习

最后读取Displacement_Immediate/span>

代码保护软件VMProtect学习笔记——反汇编引擎学习

还有一些Opcode需要ModRM进行补充的。单纯的一个FF无法表达它到底是CALL、INC、jmp、push需要ModRm辅助的,具体看ModRm.Reg

代码保护软件VMProtect学习笔记——反汇编引擎学习

Vmp_Disassembly使用的结构体如下,所有解析后的数据都保存在struc_SaveAllDisasmFunData结构里面

代码保护软件VMProtect学习笔记——反汇编引擎学习

代码保护软件VMProtect学习笔记——反汇编引擎学习

代码保护软件VMProtect学习笔记——反汇编引擎学习

代码保护软件VMProtect学习笔记——反汇编引擎学习

—  未完待续  —


VMProtect正版授权专享在线订购特享超低价格!还不赶紧加入你的订购清单/span>>>更多详情可点击咨询购买

标签:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年1月7日
下一篇 2020年1月7日

相关推荐

发表回复

登录后才能评论