破解经常需要改跳转,跳到指定地点.
000000010036d5f5 je sub_10036c970+3211. 指令代码: 0F 84 00 00 00 00
这句话的含义是: je 0x10036d5fb 如果相等就是跳到下一行
如果我想将其修改到sub_10036d6d3地址怎么做呢?
我所记得的是je指令编码是74。 jne指令是75.
而上面的指令编码是 :0F 84 00 00 00 00 很奇怪?跳到下一行的指令应该是 74 00才对
000000010036d809 je loc_10036d97d (分析: 10036d97d - 10036d809 = 0x174(包含指令长度6))
指令代码: 0F 84 6E 01 00 00
000000010036d811 je loc_10036d829。(分析: 10036d829 - 10036d811 = 0x18 (包含指令长度2)).
指令代码: 74 16
=========
总结一点:
sub_xxxxx 的地址位置以函数起始地址开始计算. loc_xxxxx的地址以当前指令位置开始计算
0F 84 6E 01 00 00 因为要跳的距离大于1个字节(FF)所以用 0F 84表示 je.
6E 01 00 00 表示以当前指令地址的结尾处开始算起第016e处就是他的地址,
也就是: 10036d809+6(指令长度) + 016e = 0x10036d97d. 刚好吻合.
归纳:
je 长跳: 0F 84 + 4字节数据
jne长跳: 0F 85 + 4字节数据
je短跳: 74 + 1字节数据
jne短跳: 75 + 1字节数据
=============================
回到之前的问题:
je 0x10036d5fb 编码: :0F 84 00 00 00 00
改为: je sub_10036d6d3
编码应该是:
0x10036d5f5 + 6 + x = 0x10036d6d3
x = 0x10036d6d3 -6 - 0x10036d5f5
x = 0xd8
结果:0F 84 D8 00 00 00
完美改造.
说明:这是我在破解010Editor编辑器里的一个点,改完跳转指令,运行结果:
还没有完全破解, 以后有时间继续吧.
冷静分析: 导出为pdf 从失败地方开始向上走, 总有一个分支,是区别成功和失败的.
破解成功: