Frida--調(diào)試分析目標(biāo)APP

同LLDB+Debugserver一樣殉挽,F(xiàn)rida能hook函數(shù)剿牺、修改函數(shù)的傳入?yún)?shù)、修改函數(shù)的返回值等

1. SSH登錄到手機(jī)設(shè)備端颜价,開啟frida-server服務(wù)涯保,我的frida-server是放在手機(jī)根目錄下面的,沒有改名周伦,用的是12.10.4版本:

iPhone-3:/ root# ./frida-server-12.10.4-ios-arm64

2. Mac端調(diào)試:

xxxMacBook-Pro:Downloads xxx$ frida -U -f com.miniclip.8ballpoolmult -l __handlers__/block.js

其中block.js就是借助frida的js文檔編寫的相關(guān)hook測(cè)試代碼夕春。
羅列幾個(gè)關(guān)鍵的使用方法:

利用frida的攔截器Interceptor.replace

2.1 hook形如sub_xxx的函數(shù)
//此函數(shù)在module模塊中尋找地址為offset的sub_xxx
function get_func_addr(module, offset) {
   var base_addr = Module.findBaseAddress(module);
   // console.log("base_addr: " + base_addr);
   // console.log(hexdump(ptr(base_addr), {
   //          length: 16,
   //          header: true,
   //          ansi: true
   //      }))
   var func_addr = base_addr.add(offset);
   if (Process.arch == 'arm')
      return func_addr.add(1);  //如果是32位地址+1
   else
      return func_addr;
}

對(duì)sub_xxx函數(shù)完全替換:【Interceptor.replace】

//替換abcKit.dylib模塊中,hopper中的地址為0xeba6c處的sub_xxx函數(shù)
var func_addr_replace_eba6c = get_func_addr('abcKit.dylib', 0xeba6c);
var add_replace_eba6c = new NativeFunction(func_addr_replace_eba6c, 'void', []);
// 進(jìn)行替換
Interceptor.replace(add_replace_eba6c, new NativeCallback(function() {
    console.log('替換eba6c函數(shù)');
}, 'void', []));

修改sub_xxx函數(shù)的傳入?yún)?shù)或是返回值:【與frida-trace同效】

//對(duì)主程序CrackMe中的0x6684處的sub_xxx函數(shù)
var func_addr = get_func_addr('CrackMe', 0x6684);
Interceptor.attach(ptr(func_addr), {
   onEnter: function(args) {
      console.log("onEnter");
      var num1 = args[0];
      var num2 = args[1];
 
      console.log("num1: " + num1);
      console.log("num2: " + num2);
   },
   onLeave: function(retval) {
      console.log("onLeave");
      retval.replace(3);  //返回值替換成3
   }
});
2.2 攔截系統(tǒng)的函數(shù)专挪,比如 open 及志、exit函數(shù)【Interceptor.replace】
//攔截open函數(shù)
var openPtr = Module.getExportByName(null, 'open');
var open = new NativeFunction(openPtr, 'int', ['pointer', 'int']);
Interceptor.replace(openPtr, new NativeCallback(function (pathPtr, flags) {
  var path = pathPtr.readUtf8String();
  console.log('Opening "' + path + '"');
  var fd = open(pathPtr, flags);
  console.log('Got fd: ' + fd);
  return fd;
}, 'int', ['pointer', 'int']));

//攔截exit函數(shù)
var openPtr = Module.getExportByName(null, 'exit');
  var open = new NativeFunction(openPtr, 'void', ['int']);
  Interceptor.replace(openPtr, new NativeCallback(function (flags) {
    console.log('Got fd: ');
  }, 'void', ['int']));
2.3 攔截Object-C函數(shù)
//完全替換
var method = ObjC.classes.NSURL['+ URLWithString:'];
var origImp = method.implementation; 
method.implementation = ObjC.implement(method, function  (self, sel, url){  

      //console.log("+ [NSURL URLWithString:]");
      var urlString = ObjC.Object(url);
      
      var url = urlString.toString();
      if (url.indexOf("tont") != -1 || url.indexOf("tpan") != -1) {
        console.log("阻止url: " + url);
      }else {
        return origImp(self, sel, url);   //調(diào)用原方法,如果不調(diào)用則原方法得不到執(zhí)行
      }
      

      //替換參數(shù)寨腔,將 URL 替換成 http://www.ioshacker.net
      //var newUrl = ObjC.classes.NSString.stringWithString_("http://www.ioshacker.net");
      //return origImp(self, sel, newUrl);  

}); 

//hook修改
Interceptor.attach(hook.implementation, {
    onLeave: function(retval) {
 
        console.log("[*] Class Name: " + className);
        console.log("[*] Method Name: " + funcName);
        console.log('startWithOptions--111-----');
        console.log("\t[-] Type of return value: " + typeof retval);
        console.log("\t[-] Original Return Value: " + retval.readUtf8String());
        var string = Memory.allocUtf8String("4567fsdfdesdfs89");  //分配內(nèi)存
        retval.replace(string); //替換
        console.log("\t[-] New Return Value: " + retval.readUtf8String());
    },
 
    onEnter: function(args){
        console.log('startWithOptions----enter---');
        var className = ObjC.Object(args[0]);
        var methodName = args[1];
        var urlString = ObjC.Object(args[2]);
 
        console.log("className: " + className.toString());
        console.log("methodName: " + methodName.readUtf8String());
        console.log("urlString: " + urlString.toString());
        console.log("-----------------------------------------");
 
        urlString = ObjC.classes.NSString.stringWithString_("http://www.baidu.com")
        console.log("newUrlString: " + urlString.toString());
        console.log("-----------------------------------------");
 
    }
});

參考:https://bbs.pediy.com/thread-259875.htm
https://bbs.pediy.com/thread-259424.htm

更多參考frida官方文檔:https://frida.re/docs/javascript-api/#objc

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末速侈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子迫卢,更是在濱河造成了極大的恐慌倚搬,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乾蛤,死亡現(xiàn)場(chǎng)離奇詭異每界,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)家卖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門眨层,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人上荡,你說我怎么就攤上這事趴樱。” “怎么了榛臼?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵伊佃,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我沛善,道長(zhǎng)航揉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任金刁,我火速辦了婚禮帅涂,結(jié)果婚禮上议薪,老公的妹妹穿的比我還像新娘。我一直安慰自己媳友,他們只是感情好斯议,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著醇锚,像睡著了一般哼御。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上焊唬,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天恋昼,我揣著相機(jī)與錄音,去河邊找鬼赶促。 笑死液肌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鸥滨。 我是一名探鬼主播嗦哆,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼婿滓!你這毒婦竟也來了老速?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤空幻,失蹤者是張志新(化名)和其女友劉穎烁峭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秕铛,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡约郁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了但两。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鬓梅。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谨湘,靈堂內(nèi)的尸體忽然破棺而出绽快,到底是詐尸還是另有隱情,我是刑警寧澤紧阔,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布坊罢,位于F島的核電站,受9級(jí)特大地震影響擅耽,放射性物質(zhì)發(fā)生泄漏活孩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一乖仇、第九天 我趴在偏房一處隱蔽的房頂上張望憾儒。 院中可真熱鬧询兴,春花似錦、人聲如沸起趾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)训裆。三九已至眶根,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缭保,已是汗流浹背汛闸。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工蝙茶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留艺骂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓隆夯,卻偏偏與公主長(zhǎng)得像钳恕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蹄衷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361