一、目標(biāo)
現(xiàn)在內(nèi)容電商膏秫,社交電商右遭,直播電商等等概念多的眼花繚亂,終極目的就一條缤削,賣貨給你窘哈。
正如我們分析他的sign簽名一樣,套路就一條亭敢, jadx + frida
這個(gè)sign數(shù)了數(shù)滚婉,正好32位,難道是 md5 帅刀?
二让腹、步驟
上jadx
先搜索下 "sign" 記得帶上引號(hào)。
結(jié)果只有40多個(gè)劝篷,而且第二個(gè)開上去就有眼緣哨鸭,點(diǎn)進(jìn)去看看
String a = m7166a(b, map);
if (TextUtils.isEmpty(a)) {
return null;
}
map.put("sign", a);
return map;
這個(gè) m7166a 應(yīng)該就是我們的目標(biāo)。
上Frida
先hook m7166a 試試
var dispatchECls = Java.use('anet.channel.strategy.dispatch.e');
dispatchECls.a.overload('anet.channel.strategy.dispatch.IAmdcSign', 'java.util.Map').implementation = function (a,b) {
var retval = this.a(a,b);
console.log(">>> sign inMap = " + b.entrySet().toArray());
console.log(" >>> sign rc= " + retval);
return retval;
}
跑一下……
沒反應(yīng)娇妓,難道frida壞了像鸡? 還是找錯(cuò)了地方?
祭出javax_crypto大法
用排除法試試,咱們把 javax.crypto.Mac只估、java.security.MessageDigest志群、javax.crypto.spec.IvParameterSpec等等一堆java的密碼學(xué)算法統(tǒng)統(tǒng)hook一遍,期望它用的是標(biāo)準(zhǔn)的java的密碼學(xué)算法蛔钙。
運(yùn)氣真不錯(cuò)锌云,逮住了。順利的把堆棧打出來吁脱。赤果果的md5桑涎。
全hook打出來的信息太雜亂了,我們關(guān)掉這一堆hook兼贡,只單獨(dú)hook 堆棧中找到的這個(gè)函數(shù)攻冷。
var md5UseCls = Java.use('com.sxxdx.client.base.utils.Na');
md5UseCls.a.overload('java.lang.String').implementation = function(a){
var retval = this.a(a);
console.log(">>> md5 inStr = " + a);
console.log(" >>> md5 rc= " + retval);
return retval;
}
這下的結(jié)果漂亮多了。
沒有思路的時(shí)候,找找log
這次咱們運(yùn)氣不錯(cuò)遍希,定位到了關(guān)鍵的地方等曼。如果下次沒有這么運(yùn)氣好怎么辦?
一個(gè)負(fù)責(zé)任的Android程序一定會(huì)打log凿蒜,所以如果找不到思路的時(shí)候禁谦,可以把程序的所有l(wèi)og打出來。
一個(gè)負(fù)責(zé)任的Android程序在發(fā)布的時(shí)候一定會(huì)關(guān)掉Debug的log開關(guān)废封。
所以我們找到log類的時(shí)候州泊,可以先用 objection 批量搞搞,看看是哪個(gè)函數(shù)會(huì)被調(diào)用虱饿。
這里我們發(fā)現(xiàn) anet.channel.util.ALog 類就是我們要找的目標(biāo)
objection -g com.sxxdx.client.android explore
android hooking watch class 'anet.channel.util.ALog'
和我們預(yù)料的一樣拥诡,他并沒有傻乎乎的去打日志,而是判斷了是否打日志的開關(guān)氮发。
com.sxxdx.client.android on (google: 10) [usb] # (agent) [657071] Called anet.channel.util.ALog.isPrintLog(int)
(agent) [657071] Called anet.channel.util.ALog.isPrintLog(int)
(agent) [657071] Called anet.channel.util.ALog.isPrintLog(int)
(agent) [657071] Called anet.channel.util.ALog.isPrintLog(int)
(agent) [657071] Called anet.channel.util.ALog.isPrintLog(int)
(agent) [657071] Called anet.channel.util.ALog.isPrintLog(int)
只好暴力上了,把 anet.channel.util.ALog 類的所有函數(shù)都hook一遍冗懦,入?yún)⒍即蛴√幚怼?再細(xì)細(xì)分析了爽冕。
三、總結(jié)
貌似運(yùn)氣比技術(shù)重要披蕉,會(huì)寫js的的人運(yùn)氣都不會(huì)太壞颈畸。
系統(tǒng)庫函數(shù)、常用密碼學(xué)處理函數(shù)要熟悉没讲,大家都是站在一個(gè)起跑線上眯娱,軟件工程教我們要復(fù)用,模塊爬凑。 逆向工程教我們要多處復(fù)制徙缴,不要把關(guān)鍵點(diǎn)都寫在一處。
失敗并不可怕嘁信,可怕的是你還相信這句話于样。