• 90阅读
  • 0回复

《勇者大冒险》换属性绕VM [复制链接]

上一主题 下一主题
离线任鸟飞
 

微信公众号:任鸟飞逆向

在我们逆向的过程中,遇见VM代码是比较常见的事情,情况也比较多
下面拿比较简单的一种先做讲解:
通过人物血量当突破口找人物信息
来回变化人物血量 用CE进行扫描首先尝试DWORD类型
扫描的结果中有当前血量和最大血量
如图有6个结果  很容易区分当前血和最大血  通过变化血量即可
从扫描出来的结果地址里选择  相邻的最大血和当前血
因为他们应该是相邻的属性,所以我们在不知道具体情况的前提下,应该选择相邻的去追踪
选择好地址以后进入OD追踪来源
对血地址下访问断,操作穿装备变化血量让其断下
0041A230    55              pushebp
0041A231    8BEC            movebp, esp
0041A233    8B45 08         moveax, dword ptr [ebp+8]
0041A236    85C0            testeax, eax
0041A238    78 05           jsshort 0041A23F
0041A23A    83F8 28         cmpeax, 28
0041A23D    7C 25           jlshort 0041A264                   ; 跳转来源
0041A23F    8B4D 0C         movecx, dword ptr [ebp+C]
0041A242    6A 28           push28
0041A244    51              pushecx
0041A245    50              pusheax
0041A246    8D55 08         leaedx, dword ptr [ebp+8]
0041A249    68 B08D9900     push00998DB0                         ; ASCII"297,ERR_CHADATAMNG,CCharacter::SetAtb,,!ISIN_CO(iAtb),%d,%d,%d"
0041A24E    52              pushedx
0041A24F    C745 08 0100000>movdword ptr [ebp+8], 1
0041A256    E8 55444900     call008AE6B0
0041A25B    83C4 14         addesp, 14
0041A25E    32C0            xoral, al
0041A260    5D              popebp
0041A261    C2 0800         retn8                                ; 是返回到不代表不是跳来的但是不是返回到一定是跳来的
0041A264    8B55 0C         movedx, dword ptr [ebp+C]           ;是否是函数头部  断下以后看堆栈第一条是否是返回到
0041A267    399481 A0030000 cmpdword ptr [ecx+eax*4+3A0], edx   ; 人物血量eax==7  ecx+7*4+3A0
0041A26E  ^ 74 EE           jeshort 0041A25E
0041A270    899481 A0030000 movdword ptr [ecx+eax*4+3A0], edx   ; 人物血量   eax==7
0041A277    B0 01           moval, 1
0041A279    5D              popebp
0041A27A    C2 0800         retn8
顺利追到ecx+7*4+3A0(上图备注中  有跳转判断的备注)
返回上一层
再返回继续追
发现被严重VM了
这种情况下
我们可以选择在任意偏移属性上下断,甚至我们都不知道这个属性是什么含义
只要能断下,依然可以追对象来源,因为我们可以手动计算偏移,他们来源于同一个对象,即使不知道属性的含义,但是我们是知道对象的含义的,又有什么不可的呢?
所以不需要非要追4*7+3A0这一条
如下图 任意位置下断
如果我们非要选择有意义的属性
其中  +30+34+38是坐标(连续的3个 4开头DWORD根据浮点数构成也可知道是 3个连续浮点数 而人物属性中有这个特点的无疑就是坐标了)
我们可以从这地方下断追来源
eax来源CALL内
这样很容易追到了
对象偏移表达式
[[00B717D0+88]+1B4]
坐标[[00B717D0+88]+1B4]+30
血量[[00B717D0+88]+1B4]+4*7+3A0

快速回复
限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个