zoukankan      html  css  js  c++  java
  • frida-ida hook操作

    hook app 酷安app

    fiddler抓取app时,发现有个参数 x-app-token一直在变化

    于是我们用jadx打开

     我们使用jadx打开该app,搜索x-app-token

     我们打开as函数,找到该相关的函数

    发现token是藏在一个叫做native-lib的so文件里里

    我们用apktool编译此app

    现在我们使用ida静态打开libnative-lib.so文件

    在里面搜索getAS.发现没找到,此时我们正常情况下需要动态调试JNI_ONload函数里面RegisterNatives的信息,来发现该函数执行的实际名称

    1 使用frida-hook技术去hook RegisterNatives函数,打印出和RegisterNatives相关的信息;操作方式https://www.cnblogs.com/wuxianyu/p/14518414.html

    2 取巧的方式 静态打开JNI_ONLoad 找到RegisterNatives 一般里面的第三个参数是常量,我们点进去,找到里面有关于xxx+1的,这个大概率就是注册的函数

    还有一种很多命名都是以规则是 sub_+内存地址的方式命名的

      

     

    此时也可以用半猜测的方法,去猜测该函数的可能性。我们发现有个getAuthSRtring函数

    仔细找找

     发现里面有个return。

    再有个signature 我们判断v17可能是token

    正常token的组成=时间戳+固定的字符串+device_id

    现在我们通过token来反推

    现在把v17重命名成token

    在反推里的时候,你反推到哪一步,就双击该程序运行的函数,最好多双击双击里面的函数,比如md5加密啊,base64编码啊,这种的,ida会随着点击进行自动更改伪代码,多点点之后会发现函数的代码有所改变,变得更容易看懂

     

     从现在可推断出token是v55赋值的 

    我们可以拿出个笔记本进行笔记

    token=v55

    v55=v81

    v81=v61

    v61=

    v61有点麻烦 我们先看v43 

    v43=v57

    v57=a4

    a4是最上方int a5传过来的 

    由于jadx分析

    getAs传递了两个参数,第一个是appcontent。第二个是device_id

    而a4的类型又为int。判断a4为device_id我们将v43改为deviceid

    我们再来看v85

    v85是v40的十六进制输出 %x代表16进制

    bin():十进制转二进制
    oct():十进制转八进制
    int():十进制转十进制
    hex():十进制转十六进制

    sprintf代表格式化输出字符串

    而v40=又是个时间戳

    我们现在吧v85改成timestamp

    现在也就判断出

    v81=v61+deviceid+'0x'+timestamp

    现在我们在看这个md5加密 

    意思是说把v58的值进行md5加密。v61就是实际v58加密后的16进制输出

    我们现在在看v58

     v58的初始值为0,那中间肯定有赋值的操作

    可以看到将v52赋值给v58.   v53是赋值的长度

    v52又是v51赋值  

    v51是一串base64加密

    再往上上看分析就比较麻烦。我们现在对这串base54进行frida hook操作,来打印该加密字符串,先找到该base64的偏移量,双击此函数,点进去为0002E884

    现在我们通过hook操作,我们知道 ,so文件的基地址+函数的偏移量=函数实际在内存中的地址

    现在我们可以先获取getAuthstring的实际内存地址,再减去getAuthstring偏移量的。得到so文件的基地址

    然后那so文件的基地址加上base64函数的偏移量,就得到来base64函数的实际内存地址

    然后在对base64函数进行打印操作,就能打印出该函数运行的值

    代码如下(注:frida最好安装12.10.8 的 frida-tools安装6.0.1。frida-server安装12.8.10)

    import frida
    import sys

    def on_message(message, data):
    if message['type'] == 'send':
    print("[*] {0}".format(message['payload']))
    else:
    print(message)


    hook_lib_native = """
    //获得 getAuthstring的绝对地址
    var getAuthString_absulate_add = Module.getExportByName('libnative-lib.so', 'getAuthString');

    //获得 native so文件的 基础地址
    var native_lib_base_add = parseInt(getAuthString_absulate_add) - parseInt('0x66500');

    send('native_lib_base_addr:'+ptr(native_lib_base_add));

    //b64_encode address
    //base64的内存地址==so文件的基地址+base64的偏移量//0002E884
    //
    //注:如果hook过程中b64没输出。说明可能app运行没调用到该函数,建议更换其他b64的偏移量进行尝试
    //像这下面的0x31DB8 正常情况下是0002E84但是输入0002E84并没有反应,猜测应该是没有调用到该函数,于是使用其他的b64encode偏移量进行尝试,
    //你会发现ida里面 的都是000但是实际上写的话都是0x,正宗写法,我也不知道为啥,反正以后偏移量的是啥000开头的 一律写0x就完事了

    var b64_encode_add = ptr(native_lib_base_add + parseInt('0x31DB8'));
    send('b64_encode_addr:'+b64_encode_add);
    //对b64_encode_add进行打印操作
    Interceptor.attach(b64_encode_add,
    {
    onEnter: function(args) {
    send("b64_encode ori:"+Memory.readCString(args[0]));
    },
    onLeave:function(retval){
    //send("retval:"+retval);
    }
    }
    );
    """

    process = frida.get_usb_device().attach('com.coolapk.market')
    script = process.create_script(hook_lib_native)
    script.on('message', on_message)
    print('[*] Running CTF')
    script.load()
    sys.stdin.read()

     打印出来的base64加密如图所示

    token://com.coolapk.market/c67ef5943784d09750dcfbb31020f0ab?1c12ffd15fb3467d73afe9d28c0712f3 $ 3b943bad-3b28-3e38-9f59-fec57db00094 &com.coolapk.market

    现在我们来分析此段加密的字符串的组成

     看这段

    v49=v62

    v62=v65+v45+$+deviceid+&+v47

    通过前面的我们知道 v49=token://com.coolapk.market/c67ef5943784d09750dcfbb31020f0ab?1c12ffd15fb3467d73afe9d28c0712f3 $ 3b943bad-3b28-3e38-9f59-fec57db00094 &com.coolapk.market

    通过多次打印v49输出,发现前面的这段token://com.coolapk.market/c67ef5943784d09750dcfbb31020f0ab?是不变的。也就是v65是不变的

    我们现在进行拆分 得出 v45=1c12ffd15fb3467d73afe9d28c0712f3

    有可能是时间戳

    deviceid=3b943bad-3b28-3e38-9f59-fec57db00094(每个人的设备不同,这里仅代表我的设备id)

    v47=com.coolapk.market

    现在我们在分析v45

    v45=v68

    v68=md5(v65)

    v65=&s

    &s=十进制输出的v40

    v40=timestamp

    现在退出了v45是个十进制输出后加密成md5的时间戳

    现在我们理清了

    v49=v65+v45+$+deviceid+&+v47=token://com.coolapk.market/c67ef5943784d09750dcfbb31020f0ab?+timestamp.int+$+ 3b943bad-3b28-3e38-9f59-fec57db00094+&+com.coolapk.market

    v81=v61+deviceid+'0x'+timestamp.hex

    也就是tooken=v61+deviceid+'0x'+timestamp.hex

    我们再把之前的关系里一遍

    v61=  md5(v58)

    v58=v52

    v52=v51

    v51=base64(v49)

    也就是说先对v49进行b64转码

    转码后的v58进行md5加密就是61

    tooken=md5(base64(token://com.coolapk.market/c67ef5943784d09750dcfbb31020f0ab?+timestamp.int+$+ 3b943bad-3b28-3e38-9f59-fec57db00094+&+com.coolapk.market))+token://com.coolapk.market/c67ef5943784d09750dcfbb31020f0ab?+timestamp.int+$+ 3b943bad-3b28-3e38-9f59-fec57db00094+&+com.coolapk.market+'0x'+timestamp.hex

    检验正确

    很绕,多实践

    学习自猿人学

  • 相关阅读:
    输出重定向
    echo带颜色输出
    shell学习视频目录
    css盒模型
    jQuery表格模糊搜索
    mysql基础语法3
    mysql基础语法2
    mysql基础语法1
    pyspider框架的使用
    quill富文本框图片上传重写
  • 原文地址:https://www.cnblogs.com/wuxianyu/p/14332956.html
Copyright © 2011-2022 走看看