汽車(chē)之家apisign unidbg逆向
逆向
之前分析到了native函數(shù)的入口是sub_2D91C
看看sub_2D8C0
看看sub_2CC58
由于if
其他分支都是報(bào)Calc Md5 Failure
威创,所以v13
等于v22
锯厢。
在0x2CE56
下斷點(diǎn)片择。
emulator.attach().addBreakPoint(module.base + 0x2CE56);
看看r6
的數(shù)據(jù)
因此s[11]
等于0x40030019
馍悟,所以函數(shù)的地址是0x30019
牌借,跳轉(zhuǎn)過(guò)去看看
hook驗(yàn)證一下
emulator.attach().addBreakPoint(module.base + 0x30019);
blr
在函數(shù)返回處下斷點(diǎn)陡厘,C
執(zhí)行到函數(shù)返回處导披,看看原r1
的數(shù)據(jù)
說(shuō)明確實(shí)是在這里生成的舵鳞。
接下來(lái)就是看看a1+48
這個(gè)函數(shù)的輸入探入,之前通過(guò)mr0
可以看到a1+48
是0x400a0ae1
狡孔,所以函數(shù)地址0xa0ae1
,跳過(guò)去看看
發(fā)現(xiàn)不是函數(shù)蜂嗽,也沒(méi)辦法轉(zhuǎn)成函數(shù)苗膝,點(diǎn)擊CODE32
,alt+G
植旧,將值修改為1
選中按P
修改為函數(shù)
看看sub_2EF30
目測(cè)MD5辱揭,在sub_A0AE0
下個(gè)斷點(diǎn)看看
emulator.attach().addBreakPoint(module.base + 0xa0ae1);
看看r0
的數(shù)據(jù)
cyberchef上試試MD5。
和unidbg輸出一樣病附。更換輸入后问窃,發(fā)現(xiàn)前后的字符串不變,說(shuō)明是固定的完沪。
實(shí)現(xiàn)
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()