还是上个系列
首先用OD打开搜索字符串
找到字符串的位置
发现判断条件,EBX 必须等于 0xAFFCCFFB
[4012D9] 必须等于 EB 26才能破解该软件,所以只需要两个条件
那么BX的值是由谁决定的呢
代码段由谁决定的呢
#bx = 0xfbfc30a3
for i in range(0x0,0x100):
for j in range(0x0,0x100):
s = '0x' + hex(j)[2:] +'0'*(8-len(hex(j)[2:]))
s = int(s,16)
if i^s^0xfbfc30a3 == 0xaffccffb:
print hex(i)+hex(j)
我们现在缕一下思路
1.我们要注册必须跳转到注册成功的语句(机器指令必须是EB 26),跳转的语句由[4012D9]处内存决定。而内存是由下面的代码计算出来的
004012B9 . 03C3 ADD EAX,EBX ; tr(name) + serial
004012BB . 3105 D9124000 XOR DWORD PTR DS:[4012D9],EAX ; 0x00584554 ^ ax
004012C1 . C1E8 10 SHR EAX,10 ; ax >> 10
004012C4 . 66:2905 D9124>SUB WORD PTR DS:[4012D9],AX ; [4012d9] - ax
2.我们要完成下面的匹配及 BX == 0xAFFCFFB,那么BX由谁决定的,由下面的代码决定的(内存4011EC –4012DC异或形成的)。一开始以为这段数据是定值,最后发现有部分位置数据有变那就是[4012D9](也在数据范围内,由上面的代码生成)
004012DD > AD LODS DWORD PTR DS:[ESI] ; [4011ec]
004012DE . |33D8 XOR EBX,EAX ; ax ^ bx
004012E0 . |49 DEC ECX
解题:
我们的突破点在第二个条件。首先计算[4012D9]内的值应为多少现在已经确定了后前个字节(EB 26)首先令前后个字节[4012DB] 、[4012DC]为00 00,然后让程序直接跑到 CMP(注:这里有个大坑,绊了我半天,当设置一般断点时 将会把内存设置为0xCC 所以在数据段中不能设断点,这也太坑了)
然后观察BX的值,可以写脚本了
#爆内存脚本
#bx = 0xfbfccfa3 i = 0x58 j = 0x54
for i in range(0x0,0x100):
for j in range(0x0,0x100):
s = '0x' + hex(j)[2:] +'0'*(8-len(hex(j)[2:]))
s = int(s,16)
if i^s^0xfbfccfa3 == 0xaffccffb:
print hex(i)+hex(j)
所以那两处的内存为0x58 0x54
内存出来了我们就相当于知道了[4011D9]处的内存开始解第一点
他计算内存的算法很简单
直接写注册机,有个地方一直使得答案不正确,那就是(xor&0x0000FFFF) - shr我已开始没有加括号 然而- 的优先级大于&。
直接导致计算错误,也是调了半天
s = raw_input("name:")
name = s+'\x00'*(0x10-len(s))
num = 0x58455443
for i in range(0,len(s)):
temp = int('0x'+'0'*(2-len(hex(ord(name[i+3]))[2:]))+hex(ord(name[i+3]))[2:]+ '0'*(2-len(hex(ord(name[i+2]))[2:]))+hex(ord(name[i+2]))[2:] + '0'*(2-len(hex(ord(name[i+1]))[2:]))+hex(ord(name[i+1]))[2:]+ '0'*(2-len(hex(ord(name[i]))[2:]))+hex(ord(name[i]))[2:],16)
num += temp
while 1:
serial = 1
n = num + serial
n = '0x'+hex(n)[-9:-1]
n = int(n,16)
xor = 0x00584554 ^ n
shr = n>>0x10
if ((xor&0x0000FFFF) - shr) == 0x26EB and hex(xor)[:6] == "0x5854":
print serial
#break
else:
serial += 1
if serial%0x100000 == 0:
print serial
#[0x584554 ^ ax] - ax >> 10 = 0x585426EB
用python跑的很慢,用c比较好。但不影响最后的答案