汽车之家apisign unidbg逆向
逆向
之前分析到了native函数的入口是sub_2D91C

image-20220109162920590
看看sub_2D8C0

image-20220109162941845
看看sub_2CC58

image-20220109163054159
由于if其他分支都是报Calc Md5 Failure,所以v13等于v22。

image-20220109163317941
在0x2CE56下断点。
emulator.attach().addBreakPoint(module.base + 0x2CE56);

image-20220109163422806
看看r6的数据

image-20220109163459846
因此s[11]等于0x40030019,所以函数的地址是0x30019,跳转过去看看

image-20220109163706823
hook验证一下
emulator.attach().addBreakPoint(module.base + 0x30019);

image-20220109170057686
blr在函数返回处下断点,C执行到函数返回处,看看原r1的数据

image-20220109165910021
说明确实是在这里生成的。

image-20220109165759023
接下来就是看看a1+48这个函数的输入,之前通过mr0可以看到a1+48是0x400a0ae1,所以函数地址0xa0ae1,跳过去看看

image-20220109170320953
发现不是函数,也没办法转成函数,点击CODE32,alt+G,将值修改为1

image-20220110094315392

image-20220110094416810
选中按P修改为函数

image-20220110094501331

image-20220110094525126
看看sub_2EF30

image-20220110094735152
目测MD5,在sub_A0AE0下个断点看看
emulator.attach().addBreakPoint(module.base + 0xa0ae1);

image-20220109170531677
看看r0的数据

image-20220109170605047
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()