菜鸟初次逆向某App SO层算法

声明

   1. 本人初次写技术类文章,如写的不好请大家见谅,在这里只是想让自己能有一个语言上的沉淀和技术经验上的积累。

    2. 由于是逆向分析App中的登陆请求中的密码加密跟一个s值加密的过程,为了不引起不必要的麻烦这里就不公开是什么app了(该文都以某App称呼),只是给大家一个技术上的思路。同时也给那些Java开发或者是Andorid开发等人一个警钟,不要认为什么都是安全的,也不要只顾着写功能,不注重安全问题。

     3. 由于初次写技术类文章,如有侵权或者威胁到该App安全问题请及时联系我。作者邮箱itdreamlmc@163.com.。

    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权限)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,389评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 22年12月更新:个人网站关停,如果仍旧对旧教程有兴趣参考 Github 的markdown内容[https://...
    tangyefei阅读 35,159评论 22 257
  • 年复一年的过,都麻木了。2015即在眼前,如何过,和2014一样过吗?当然2014和2013,2013和2012好...
    asker阅读 228评论 0 2
  • 4月24日第三次更新 主要更新了sublime安装、激活、安装插件的教程,另外把第二次更新的添加图片的文章中的图片...
    Icestains阅读 581评论 0 0