搞个大的,爆破某外卖平台的x-sign(跟踪加密篇)

1,710 阅读3分钟

回忆下上篇,用动态调试跟踪生成加密的方法this.mUnifiedSign.getSecurityFactors(hashMap3),跟踪到了com.xxx.wireless.security.middletierplugin.d.d.a$a 类中的invoke 方法,同时,根据动态调试的结果,发现这个类是在 libsgmiddletire.so 文件中,本篇就继续跟踪代码,找到最终生成x-sign加密的方法。

查看libsgmiddletire.so

查看so之前先简单了解一下组成apk的主要文件,如下图 image-20230503094645165.png 图中已经简单的标注了一些文件/文件夹的作用,根据图中标注,可以知道前文跟踪的 libsgmiddletire.so 文件,很可能是在lib文件夹下,到文件夹下找找看,没有意外,在lib->armeabi-v7a目录下有这个文件。这个文件虽然是so后缀,但它是一个apk文件,猜测一下这种应该是大厂的插件化,大厂就是牛,来了个狸猫换太子。 打开这个文件,里面有一个dex文件 image-20230503095430316.png 打开看下com.xxx.wireless.security.middletierplugin.d.d.a$a 类中的invoke 方法 image-20230503100248892.png

有两处比较可疑,继续跟踪,看下这两个方法 image-20230503101803999.png 根据返回值判断,这个a方法很可能是我们需要的,大胆猜想,小心验证,下面验证下这个方法生成的x-sign

验证生成x-sign的方法

算法助手 Hook这个方法验证下 image-20230503102325213.png ![](/Users/funaihui/Library/Application Support/typora-user-images/image-20230503102325213.png#id=DruvS&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=) 纳尼,竟然Hook不到,但是,分析的明明是这个方法,一定是哪里不对,再用Hook神器Frida验证下 image-20230503112155856.png 额,竟然抛异常了 image-20230503112247454.png 找不到这个类,这是为什么呢?因为这个类是动态加载的,他的classload是不同的,需要指定classloader来加载这个类。 先利用Frida查看下有哪些classloader, image-20230503112815117.png 结果如下 image-20230503112902017.png 发现有加载 libsgmiddletire.so 文件的classloader,指定这个classloader再试下 image-20230503113431152.png 再跑下,看下Hook结果 image-20230503113522104.png 没问题,就是这个方法生成的x-sign。 可以得出一个结论,如果**算法助手**hook 不到任何内容,可能情况有两种,一种是Hook的方法错误;还有一种就是Hook的方法不是默认的classloader加载的。如果是后者的话,则可以通过Frida指定classloader,再Hook方法就可以了。

查找生成x-sign的JNI方法

再看下com.alibaba.wireless.security.middletierplugin.d.d.a类中的a方法 image-20230503155032226.png

生成x-sign的算法是在doCommand方法中,跟踪过去发现调用的是IRouterComponent接口里面的doCommand方法,我们需要是实现类的方法,可以通过动态调试来找到,这里介绍另外一种方法:特征字符串定位,这种方法可以省略不少中间的分析,直接找到底层的调用方法。 上Frida,特征字符串定位的代码如下,

Interceptor.attach(addrGetStringUTFChars, {
            onEnter: function (args) {},
            onLeave: function (retval) {
                if (retval != null) {
                    var bytes = Memory.readCString(retval);
                    if(bytes != null) {
                        if(bytes.toString().indexOf("x-sign") >= 0 )
						{
                            console.log("[GetStringUTFChars] result:" + bytes);
					        var threadef = Java.use('java.lang.Thread');
					        var threadinstance = threadef.$new();

							var stack = threadinstance.currentThread().getStackTrace();
							console.log("Rc Full call stack:" + Where(stack));
							
							// Native 层 堆栈
					        console.log(Thread.backtrace(this.context, Backtracer.FUZZY)
							.map(DebugSymbol.fromAddress).join("\n"))
							
                        }
                    }

                }
            }
        });

看下定位的结果 image-20230503162745243.png 这种方法这么样?是不是很清晰!是不是一目了然!是不是省了好多分析的步骤,直接到了最后的结果。这样,就知道了,最后是调用JNICLibrary类中的doCommandNative方法得到的x-sign。看下这个方法 image-20230503162852445.png 这个方法是一个JNI方法,最后调用到了so文件里面,这篇就分析到这里,下一篇开始分析这个JNI方法。

总结

本篇学习了通过Frida指定classloaser来Hook方法,也学习了通过特征字符串定位来快速的定位具体的方法。特征字符串定位还是很好用的,可以省略很多分析的步骤,在以后的分析中多多使用这种方法,可以省不少时间。授人以鱼不如授人以渔,我的文章都是讲一些思想和通用的方法,阅读之后可以达到举一反三的效果,希望大家多度练习。

本文的目的只有一个就是学习更多的逆向技巧和思路,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系.

本文涉及到的代码项目可以去 爱码者说 知识星球自取,欢迎加入知识星球一起学习探讨技术。 关注公众号 爱码者说 及时获取最新推送文章。