(逆向)一个比较难找加密位置的app

597 阅读3分钟

太难了太难了,正向开发的大佬们给点活路吧

本篇文章仅供交流学习,侵权删(满满的求生欲)

本次app样本:54ix5a6J5ZCJdjMwMDAuMS45

小结论:目前找到在so的哪个方法里面

java层

入手抓包,postern

image.png

加密参数只有一个md5的sign,看着好像很简单啊。

直接使用java层的通杀脚本测试一下,然后搜一下抓到的包的加密参数,发现没有,那就是在so层了啊,先找一下位置吧。

如果你搜请求头中的任何一个值,估计都是找不到位置的

我在全局搜了几个参数后,发现没有一个像的地方,这个时候就祭出神器吧。

肉丝姐的r0capture,git地址:github.com/r0ysue/r0ca…

原理就是hook了okhttp等常规网络请求框架的最底层方法。简单来说就是通过跟踪堆栈,找到在java层和so层的底层方法,然后编写一个通用脚本

搜一下请求的url,搜到了,并且堆栈也打印

image.png

但是其实这个堆栈后面是没有什么价值的,只有最开头的也就是最底层的那条堆栈才是有用的,为什么这么说呢,配合下面这段代码说明一下这个逆向跟踪堆栈的思路

def b():
    # 加密逻辑
    return sign
def c(sign):
    # 根据加密参数返回数据,包含发起请求
    return data
def a():
    sign = b()
    return c(sign)
   
a()

好,比如上面这段代码,如果你hook okhttp的最底层,那么打印出来的堆栈就应该是 c,a 而不会打印b,但是其实加密是在b里面,只不过是主流程调用了加密方法,相当于加密只是主流程的一个分支,如果你按照这个堆栈去hook,那么你永远也找不到加密的位置。

那么要怎么找呢,只能hook 目前堆栈的最下面,然后再去看本次hook的方法堆栈,并且配合java代码,去看下一个要hook的方法,可能这么说不是很清楚。

比如我们跟到了堆栈第三条 at dc.squareup.okio.AsyncTimeout$1.write(SourceFile:21),发现这个方法的入参有我们需要的参数,那么我们去看这个方法的堆栈,凑巧和图上的堆栈一样,也是at dc.squareup.okio.RealBufferedSink.flush(SourceFile:3) 调用了这个方法,那么我们看一下这个方法。

image.png

我们发现这个方法没有参数,而我们需要的加密参数是由this.buffer赋值的,所以这里如果你还按照之前的堆栈去找,那你永远也找不到加密参数生成的位置,我们现在要做的就是去找这个this.buffer在哪里被赋值的。

在这个类下面有好几个地方都有赋值,这个时候就要尝试了

image.png

最终发现是从这来的,然后再去跟这个方法的堆栈,一步一步找到最终位置

image.png

好吧,看来是进so了,上下找了找,也没找到在哪个so里面

=============================================================

遇到的一些问题

  1. 在跟踪堆栈的时候有时候会发现在jadx没有这个类,可以使用apktool解包,在下图文件夹内会有很多smail文件,用jadx打开可以找到jadx找不到的类(jeb等工具没怎么用过,不知道能不能找到)

image.png

  1. 有时候attach hook不到东西,不一定是你找错地方了,试试spawn模式

  2. 本例 hook hashmap也可跟到加密位置

=============================================================

so层

未完待续