汽车之家apisign unidbg逆向
逆向
之前分析到了native函数的入口是sub_2D91C
看看sub_2D8C0
看看sub_2CC58
由于if
其他分支都是报Calc Md5 Failure
,所以v13
等于v22
。
在0x2CE56
下断点。
emulator.attach().addBreakPoint(module.base + 0x2CE56);
image-20220109163422806
看看r6
的数据
因此s[11]
等于0x40030019
,所以函数的地址是0x30019
,跳转过去看看
hook验证一下
emulator.attach().addBreakPoint(module.base + 0x30019);
image-20220109170057686
blr
在函数返回处下断点,C
执行到函数返回处,看看原r1
的数据
说明确实是在这里生成的。
image-20220109165759023接下来就是看看a1+48
这个函数的输入,之前通过mr0
可以看到a1+48
是0x400a0ae1
,所以函数地址0xa0ae1
,跳过去看看
发现不是函数,也没办法转成函数,点击CODE32
,alt+G
,将值修改为1
选中按P
修改为函数
看看sub_2EF30
目测MD5,在sub_A0AE0
下个断点看看
emulator.attach().addBreakPoint(module.base + 0xa0ae1);
image-20220109170531677
看看r0
的数据
cyberchef上试试MD5。
image-20220109170801913和unidbg输出一样。更换输入后,发现前后的字符串不变,说明是固定的。
实现
import hashlib
_SALT = '@7U$aPOE@$'
def calc_sign(data):
data = (_SALT + 'apisign' + data + _SALT)
sign = hashlib.md5(data.encode()).hexdigest().upper()
return sign
def test():
data = '2|f17a9663_acd3_42e8_93ef_f93c5fdbcf50|autohomebrush|1641713028'
sign = calc_sign(data)
print(sign)
assert sign == '1C4E5C182F7FFF5C350E1BB1B4C2B50C'
if __name__ == '__main__':
test()
网友评论