易游网-易游模拟器

 找回密码
 立即注册
查看: 2790|回复: 0

[破解逆向] frida objc常用脚本

[复制链接]

3382

主题

3401

帖子

38

积分

超级版主

Rank: 8Rank: 8

积分
38

技术达人

发表于 2021-1-29 14:21:57 | 显示全部楼层 |阅读模式
1、打印调用栈
在hook到的函数中加入以下代码:
console.log('tBacktrace:nt' + Thread.backtrace(this.context,Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join('nt'));

2、调用native函数
var address = Module.findExportByName('libsqlite3.dylib', 'sqlite3_sql');
var sql = new NativeFunction(address, 'char', ['pointer']);
sql(statement);

3、数据类型和转换
如果对一个变量的类型不确定,可以使用如下代码确定其类型:
console.log("Type of args[2] -> " + new ObjC.Object(args[2]).$className)
一些常用的数据类型转换:

【1】NSData转String
var data = new ObjC.Object(args[2]);
Memory.readUtf8String(data.bytes(), data.length());
如果为null的不需要第二个参数

【2】NSData转二进制数据
var data = new ObjC.Object(args[2]);
Memory.readByteArray(data.bytes(), data.length());

【3】遍历NSArray
var array = new ObjC.Object(args[2]);
/*
* Be sure to use valueOf() as NSUInteger is a Number in
* 32-bit processes, and UInt64 in 64-bit processes. This
* coerces it into a Number in the latter case.
*/
var count = array.count().valueOf();
for (var i = 0; i !== count; i++) {
  var element = array.objectAtIndex_(i);
}
【4】遍历NSDictionary
var dict = new ObjC.Object(args[2]);
var enumerator = dict.keyEnumerator();
var key;
while ((key = enumerator.nextObject()) !== null) {
  var value = dict.objectForKey_(key);
}
【5】NSKeyedArchiver
var parsedValue = ObjC.classes.NSKeyedUnarchiver.unarchiveObjectWithData_(value);

【6】读一个结构体
Memory.readU32(args[0].add(4));

【7】枚举所有的类
for (var className in ObjC.classes)
    {
        if (ObjC.classes.hasOwnProperty(className))
        {
            send(className);
        }
}

【8】枚举一个类的所有method
if (ObjC.available)
{
    try
    {
        var className = "NSURL";
        var methods = eval('ObjC.classes.' + className + '.$methods');
        for (var i = 0; i < methods.length; i++)
        {
            try
            {
                if (methods[i].indexOf("fileURLWithPath") > -1)
                console.log("[-] "+methods[i]);
            }
            catch(err)
            {
                console.log("[!] Exception1: " + err.message);
            }
        }
    }
    catch(err)
    {
        console.log("[!] Exception2: " + err.message);
    }
}
【9】Hook一个method
打印参数时需要注意:
args[0]:self
args[1]:The selector (openURL
args[2]:The first param
if (ObjC.available)
{
    try
    {
        var className = "JailbreakDetectionVC";
        var funcName = "- isJailbroken";
        var hook = eval('ObjC.classes.' + className + '["' + funcName + '"]');
        console.log("[*] Class Name: " + className);
        console.log("[*] Method Name: " + funcName);
        Interceptor.attach(hook.implementation, {
          onEnter: function(args) {
            console.log("aaaa");
            console.log("param:"+args[2]+" type:"+typeof args[2]);
          },
          onLeave: function(retval) {
            console.log("Return value-> (type:"+typeof retval+",value:"+retval+")");
            newretval = ptr("0x0")
            retval.replace(newretval)
          }
        });
    }
    catch(err)
    {
        console.log("[!] Exception2: " + err.message);
    }
}

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|易游网-易游模拟器 Copyright @2015-2021 ( 浙ICP备15028007号-1 )

GMT+8, 2024-11-27 09:44 , Processed in 0.031666 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表