为了练练手,增长逆向分析的知识,本次博客打算分析一下某酒店APP的登陆请求。
这次的逆向分析还是以网络请求为例,通过分析其登陆请求数据的加解密原理,将请求数据从密文转换成明文,顺便把返回的结果也转成明文。
好了,既然明确了需求,那么准备开始分析了,分析的步骤还是很简单:反编译-->找关键代码-->分析请求代码加解密原理-->验证密文到明文准确性。
第一步,反编译:
这一步中,一般来说我们可以结合smali文件和jd-gui查看器来分析,所以APKTool和dex2jar都可以用上。
因为APKTool和dex2jar的反编译都有在前面的博客里介绍过,所以在此就不详细说明了,不明的可以回去看。
第二步,找关键代码:
找关键代码的方法有很多,我主要用到两种方法,一是,利用wireshark抓包的关键字符串,结合sublime text工具在smali文件夹中使用“find in folder”功能找到关键字符串所在位置,然后再顺藤摸瓜;二是直接通过jd-gui查看其代码,并找到登陆界面的点击事件,并定位到其关键代码。
首先讲第一种方法:
先抓包(打开wireshark监控,然后按下登陆按钮进行登陆),并查看其TCP流,找出其关键字符串
可以看到图中红色方框中的关键词"APPSIGN","sign","data"等,其中data的数据是我们想要知道的,但现在是密文。
接下来,我们利用找到的关键词,利用sublime text工具的find in folder功能在smali文件夹中查找该关键词出现的地方。
通过关键词可以找到了一个HttpUtils的类,再看看其smali里的表达式,可以看到com/loopj/android/http包,该包实际上就是第三方框架AsyncHttpClient的东西。
到这,我们基本上就可以定位到关键代码位置了。
那么,第二种方法又是怎样的呢?
实际上第二种方法并不建议,这种方法就是直接找,因为fragment,Activity这些类是无法被混淆的,所以我们可以直接在jd-gui上浏览一下目录,找到其关键的地方,比如我们现在找登陆界面,那么可以根据登陆的英文login去找,如下图
可以看到在com.htinns.UI.fragment.My包下可以找到了LoginFragment,没错,这就是登陆页面,在文件数量很大的情况不建议用这种方法,费时。
在LoginFragment的代码中可以看到有多个HttpUtils类的静态方法被调用,基本上已经确定HttpUtils确实是登陆请求的一个工具类了。
第三步,分析加解密原理,实际上这跟第二步是紧密联系的,因为要一边顺藤摸瓜,一边推断其加解密的原理,一步步地接近真相~
根据上面找到的关键代码,我们可以在HttpUtils中找到一个静态方法a(Context, RequestInfo),该方法中的参数RequestInfo实例是包含了账号密码的,就是该实例的字段c,所以我们可以根据RequestInfo.c这个内容去顺藤摸瓜,找到其加密的位置。
可以看到,图中红色方框中的分别是加密的key和调用加密函数的入口a函数,那么我们继续顺着这个a函数找:
public static k a(Context paramContext, JSONObject paramJSONObject, String paramString)
{
k localk = new k();
if (paramJSONObject == null);
try
{
paramJSONOb