声明
1. 本人初次写技术类文章,如写的不好请大家见谅,在这里只是想让自己能有一个语言上的沉淀和技术经验上的积累。
2. 由于是逆向分析App中的登陆请求中的密码加密跟一个s值加密的过程,为了不引起不必要的麻烦这里就不公开是什么app了(该文都以某App称呼),只是给大家一个技术上的思路。同时也给那些Java开发或者是Andorid开发等人一个警钟,不要认为什么都是安全的,也不要只顾着写功能,不注重安全问题。
3. 由于初次写技术类文章,如有侵权或者威胁到该App安全问题请及时联系我。作者邮箱[email protected].。
4.版权声明:本文为博主原创文章,未经博主允许不得私自转载。
前言
周六周日闲着蛋疼总是有事没事的找点东西研究下,当我拿起手机不知道研究啥好的时候,手机上一个App引起了我的注意。接下来就开始的了我的逆向分析之路。
准备工具
工欲善其事必先利器,要想做好后边的加密分析那点事,那么工具是不可缺少的,整个过程需要的工具主要有如下。
1.安卓手机一部(已获取ROOT权限的)。
2.抓包神器Fiddler(主要抓取该app的登陆请求数据)。
3.安卓的adb命令工具(主要用操作手机终端)。
4.安卓逆向助手AntiDroid V1.4.3。
5.App反编译工具Android kill。
6.SO调试工具IDA Pro。
7. Java项目开发工具IntelliJ IDEA(主要用作动态调试app和算法的测试)。
对App的登陆接口数据静态分析
如果你要对一个App的某个接口分析,那么首先你不得不先抓取到接口请求的数据,然后在对其请求跟响应数据参数做分析。接下来就是对某App的登陆接口的请求数据进行分析过程。
首先下载某App并安装到手机上,然后设置Fiddler抓包工具(具体如何抓包大家自行百度就行了,注需要配置证书问题,否则或抓不到htpps接口请求的数据),打开某app找到登陆页面随便输入个登陆手机号跟密码点击登陆,然后到Fiddler中会看到如图请求数据。
我们点击WebForms查看提交表单数据会看如下请求数据,这里只对参数p登陆密码,跟一个校验参数s做分析,p参数还好,有经验的程序员都能基本猜到90%就是一个RSA加密只要拿到公钥然后自己写一个RSA加密就可以了,对于参数S就显得有点麻烦,本来我以为就是一个简单的MD5之类的签名然后截取字符串,或者是一个随机值之类的,可事实上并非如此,多换几个账号登录或换密码就会发现S参数值每次随着登录账号跟密码的不同而改变,所以大致能猜到S应该是账号跟密码经过某个算法计算出的加密值,接下来我们就开始去一点点分析这两个参数。
反编译某App获取它的字节码文件
首先打开安卓逆向助手AntiDroid V1.4.3 然后选择 Dex转Jar,之后选择下载的Apk文件,选择jar保存路径最后点击Dex转为Jar等待准换完成,如图所示。
分析参数p的密码加密过程
成功将dex转为jar之后之后到AntiDroid跟目录找到jd-gui 工具如图
打开其应用,将转换成功的jar拖进该工具上,我们就可以看到该apk80%以上的java代码了(因为java代码是逆向过来的,所以会有部分数据损坏),之后我们全文搜索RSA关键字如图所示,并打开这个c文件我们会看到RSA 加密方法。
好了看到这个我们就大概能猜到密码加密是调用了这里,那接下来我们就动态的调试下app在这个了下断点,看看这里是不是密码加密。
首先打开Andorid killer 将apk拖进去反编译拿到该apk的所有smail文件,之后打开IDEA新建java工程,然后将所有的smail文件全部拷贝到IDEA java项目的src目录下然后附加远程调试apk(IDEA如何附加调试Apk大家自行百度下,这里不做详细说明),找到该c文件对应的smail文件打开,在方法开始打上断点,具体如图所示。
之后打开手机app点击登陆会看到程序会断在这个位置我们看下传进来的参数刚好为数据的密码,所有可以断定该app的密码的密码就是用的这个RSA公钥进行加密的,所以我们将该公钥拷贝出来之后就可以自己写这个密码加密的算法了。如图所示。
到此某app的登陆密码加密参数p分析就算到此结束了。
分析某app的加密参数s
接下来就是本文的重点了,分析加密参数s的加密过程,还是一样老套路,我们在jd-gui工具中搜索登陆请求包的一些关键参数如checktoken、device_id、skin等这些参数。我们看到某app的某包下的t.class文件如图所示。
在这里我们可以看到s参数是经过s类的p方法获取的值,之后我们点击s类会发现该s.class并不能打开,那么我们怎么办呢?难道我们就到此放弃了吗?哈哈。当然不能,既然他的s.class文件我们看不到,那我们就看该s.class文件对应的s.smail文件,我们在smail文件中找到p方法,然后在该方法上打下断点,一步步跟进,看看该s值是如何计算的,如图所示。
接下来一样,打开app点击登陆会停在这个位置,我们F8跟进会执行到invoke-virtual {v0, p0}, Lcom/***/***/***Application;->calculateS(Ljava/lang/String;)Ljava/lang/String;
这里,之后我们F7跟进,会进入***Application类的calculateS方法,之后我们打开jd-gui找到***Application类的calculateS方法看看是个什么鬼,如图所示。
我们会看到该方法用native修饰,显然是一个so库中的方法,我们在jd-gui中向上看找到该方法加载了哪个so库,如图所示。
从这段代码我可以知道该类被加载的时候执行静态代码块,然后动态加载utility SO库,之后获取s加密参数时,传进一个字符串参数调用该so库中的calculateS方法获取最终的加密结果。到这里我们知道算法在so库中了,那么我们接下来就是用IDA pro动态的去附加调试app的so代码了。
IDA Pro附加调试SO
附加调试so文件大致流程如下:
1. 首先找一根数据线,然后打开手机的usb开发者调试开关,连接上你的电脑,打开cmd命令窗口执行 adb devices 命令检测设备是否连接,如图所示。
出现如图中的信息则代表手机连接成功。
2.之后找到IDA Pro 跟目录下的 dbgsrv/android_server文件并执行 adb push android_server /data/local/tmp/android_server
命令将该文件上传到手机终端上,如图所示。
3.文件上传成功后执行 adb shell连接手机终端 执行 su命令获取手机root权限,然后进入/data/local/tmp目录下,ls查看android_server 文件是否成功上传。
如果android_server文件上传成功,那么执行 chmod 777 android_server命令,给该文件赋值上最高权限,然后执行该文件,如图所示。
执行成功会出现23946 这个端口信息,之后另外在打开一个cmd窗口,将手机终端的23946端口转发到电脑上,执行命令adb forward tcp:23946 tcp:23946 如图所示
4.打开IDA Pro工具找到菜单栏中的Debugger->Attach->Remote andro/Debugger选项,点击确定,如图所示。
之后出现如图所示的手机进程列表,之后根据某app的包名,找到某App的进程点击OK即可,如图所示。
5.App附加成功,接下来找到我们要找的utility库,在IDA Pro中知道模块列表,并搜索utility库。如图所示。
双击打开,然后找到java中的calculateS方法。如图所示。
双击该方法进入方法位置。
之后我们按F5 转为c语言格式,然后在方法开始打上断点。如图所示。
6.在手机app上输入账号密码,点击登陆会发现该app会端在这个位置,之后我们就开始一步步调试,查看变量值,如图所示。
执行到到这里我们就会发现该app是将登陆用户名加密码加一串固定的字符串拼接在了一起然后取md5的值得到如下结果。
7.拿到MD5值后然后分别按顺序取1 5 2 10 17 9 25 27几位置的数值组成最终的加密结果,最终返回给java代码的中s参数发送出去
到此某app的p参数加密跟s参数的加密分析就到此结束了。
结果测试
我们找到p参数的加密方法,跟s参数的参数加密方法,接着就用java简单的测试下结果
登陆成功ok,大功告成哈哈。
总结
整个逆向过程中遇到的问题有如下:
1.IDA Pro附加调试出现 Bogus or irresponsive remote server 错误,解决方案 在adb shell中执行 setenforce 0 关闭selinux安全机制(需要root权限)