• app从java到so加密逆向分析过程(一)


    一、抓包分析

    二、用jadx-gui打开

    打开某观察app

    搜索关键字sign

    加密参数在so层 wtf文件中

    结合抓包数据,以及分析sign的前后代码发现:参数str 为空,参数token为空,参数3为时间戳。

    下面开始so的分析,看看so中进行了哪些加密操作。

    首先解压apk,拖出wtf.so

    将so文件拖入IDA,第一步既是查看Exports,由于JNI是静态注册的,所以很容易就定位到了加密函数:


    F5转换为伪C代码,整理好代码,进行so文件的初步静态分析。由于代码还算清晰,比较容易定位到了加密函数,初步判断是一个MD5

    一路跟下去,发现此函数具有典型的MD5加密特征

    加密特征方法:https://www.52pojie.cn/thread-937282-1-1.html


    到这里基本明白,传入的数据在SO中进行了MD5加密。所以接下来动态调试看看此加密函数的三个参数分别是什么。
    一定要 新开启一个 IDA

    为嘛要新开启一个IDA呢,因为动态调试状态下,IDA会简化很多解析,让代码看起来更加难懂。比较方便的是一个IDA做静态分析,一个IDA做动态调试,可以互相参考。

    开启IDA的debugger,选择安卓远程调试 Attach(debugger——>Attach——>Remote ARMLinux/Android debugger)将host设置为本地,端口默认

    再次点击OK后等待附加进程完毕。进程附加完毕后,F9让程序继续运行起来,处于Debugger状态

    接下来查康Module选项卡,找到要分析的so文件


    双击跟入,一直到要调试的函数汇编代码处。F5转换成伪C代码,

    这里可以看出来动态调试的时候,和静态分析时看到的代码差别很大。IDA在动态调试状态下不会将所有东西解析出来

    结合另外一个IDA进行的静态分析,确定需要在哪个BLX下断点.双击进入后,按C,将代码解析成汇编代码。

    可以看到被识别出来的函数名。(静态分析的时候能识别出来的就能显示出来)将函数名重命名,方便后继使用

    依据静态分析得知,我们需要得到此函数的三个参数,所以分别是R0,R1,R2寄存器的值。

    查看寄存器的值,分别得出了参数1,参数2的值。

    R1(即参数2)的值:2D ,(十六进制)转换成十进制为45,与参数1长度相符

    接下去分析r0值的构成:

    由于在java层静态分析中得知,传入so层加密的三个参数中,前两个参数是空,只有第三个参数有值,是时间戳。

    而so层的加密函数中,r0的值却是一串字符串+传进来的时间戳组成,必须找到这个字符串的来源。

    加密函数中这个getAppSign很可疑。这是通过回调java层函数获得appsign,初步猜测,由于我们并没有修改过app,所以这个函数获得的appsign基本可以确定是正确的,而也是固定的

    可以直接hook (shut)方法

    三、返回结果

    import hashlib
    s= "0093CB6721DAF15D31CFBC9BBE3A2B79"+timestamp
    m = hashlib.md5(s.encode())
    sign = (m.hexdigest()).upper()
    print(sign)
    
  • 相关阅读:
    经典测试工程师面试题(一)
    python面试题2
    python面试题1
    软件测试面试题2
    软件测试面试题1
    python读写csv文件
    死亡还是合并?和李开复聊聊走投无路创业公司(转)
    项目如何开始:怎样和客户谈需求(转)
    [转载]给IT人员支招:如何跟业务部门谈需求分析?
    VS2013的一些常用快捷键
  • 原文地址:https://www.cnblogs.com/gqv2009/p/14442651.html
Copyright © 2020-2023  润新知