声明:本教程用于学习交流,如有侵权联系本人删除!

点击上方“逆向小白”,选择“加为星标”

第一时间关注逆向技术干货!

使用fiddler抓取某app登录接口的时候,没有看到任何相关的数据包,猜测app做了防抓包或者不走http协议,尝试proxyDroid、小黄鸟还是不行,最后使用Packet Capture成功抓到数据。看了下登陆接口提交的参数,不知道sign值是怎么来的,所以目标很明确,就是需要逆向分析sign的生成算法。

将apk文件拖到jadx中进行反编译,ctrl+shift+f 搜索关键词sign出来很多信息但没找到有用的,试试搜索"sign",仔细查看发现图示可疑位置,点进去看看。

看到图示内容,可以确定找对了地方,sign值是getSign方法执行后的结果,getSign方法中调用了SignManager类getSign方法,传入了三个参数,第一个参数不确定其值,第二个参数是token值,前面抓包发现这个值是空的,第三个值是时间戳,右击getSign跳到方法声明的地方。

加载so、通过native关键字定义了需要调用的方法getSign,也就是说,它这里调用的是so层的加密算法,so是什么?简单来说,它是c/c++编译后的产物。既然目标app能调用,那我们也可以。在搞之前,还有个参数不确定。这里就用jeb调试一下看看。

将apk拖到jeb中进行反编译,dex反编译成smali,我们可以调试这个smali代码, ctrl+f 搜索"sign", 找到getSign方法,ctrl+b下断点。

确保手机已root并且可调试,如果没有开启调试,到网上去下载相应的mprop,  使用adb推送到手机里,通过如下方法可以临时设置调试状态,这个方法是修改内存中的值,重启手机后恢复不可调试状态。如果你想要永久设置,到网上找相应的教程。然后可以通过adb连接手机,确保jeb可以识别到手机。

点击附加调试,选择需要调试的进程包名附加进程。

手机上输入账号密码点击登陆触发断点

上面分析过,断点处的getSign传入了四个参数,而真正用到的是后面三个,这三个参数值分别放在寄存器v1、v2、 v3中,将int修改为string, 可以看到,v1中的值是空的,v2中的值是空的,v3中的值应该是时间戳,如果你不放心可以多次尝试。

三个参数值确定了,下面要做的工作就是调用so层的加密算法获取sign值,关于so调用,可以去学学逆向大佬花哥的教程,通过压缩软件打开apk,因为我手机的cpu类型是arm64-v8a, 是向下兼容的,选择使用armeabi-v7a中的so文件是可以的。

将so文件复制到安卓项目的libs->armeabi-v7a下面,并且在app->build.gradle中限制支持的平台,不加这个我这是报错的,加上限制条件,app也不会显得那么臃肿。

在src->main->java下新建一个包名为com.sichuanol.cbgc.util的包,在包下面创建一个名叫SignManager的类,复制源码过来就行。

然后在控制器中调用getSign方法,运行项目安装到手机上,启动服务。

浏览器访问服务接口,返回的是so文件名,竟然翻车了!!!

看了下日志信息,缺少了某个类,尝试复制对应的文件过来,但还是报错缺各种东西,猜测是不是有签名校验,那么调用so的方案就失败了?问题总得解决,换另一个方案,用IDA逆向分析so。跟着大佬学习一下IDA的调试过程,做一个简单的记录。

将so文件拖到IDA中,Exports->**getSign,双击点进去。

这是so反编译出来的汇编代码,看不懂啊,像我这种菜鸡还是去看看伪c代码吧,按F5或者Tab。

**getSign函数中五个参数,第一个参数是JNIEnv类型指针,它指向java环境,通过这个指针就可以对java的代码进行操作,第二个参数是java传递过来的类/类实例,后面参数就是我们上面分析的那三个,有人说,这里的参数类型明明都是int,而且看代码似c不c,其实是这样的,ida反编译so不可能百分之百还原c/c++代码,  而且这里还用到jni函数,jni又是什么?简单的说,有了jni可以实现java代码和c/c++代码的互调。

这些强制类型转换看着太不舒服了,右击hide casts把它们隐藏。

看到一些*v5加上数字这又是什么操作,上面分析过,第一个参数a1是JNIEnv指针,赋值给v5, 那么这一些操作好像是指针偏移,可能是取了jni的函数或者变量。

为了让人能看懂这些jni函数,我们需要导入jni.h头文件,然后改第一个参数为JNIEnv类型指针。

选中第一个参数a1, 右击选择convert to struct*, 选_JNIEnv, 然后再更改指针名为env。

我们将v5的名字也改一下,改成env_,改完之后你会发现,这才是人能看懂的代码啊。

GetStaticMethodID获取java静态方法ID, "getAppSign"为方法名,如果没有取到方法ID就会进行一系列操作。好吧,这就解释了为啥我们调用so报错了。

用jadx搜一下getAppSign方法,我们看到,方法所在的类就是之前报错缺失的,getAppSign方法取了签名值,如果异常返回一个空字符串。要知道,你不改动apk文件的情况下,这个app签名值是固定不变的。看c代码中没有涉及到其他java自写方法,那我们只要拿到这个签名值,so调用的方案不就简单了吗?

编写一个xposed模块进行hook操作,不会的请参考上一篇教程 xposed模块编写实战

把取签名方法所在的类文件复制到so调用的项目里,放在同样的包名下,把多余的方法删掉,getAppSign方法只需要返回这个固定字符串就可以了。

运行项目安装apk开启服务,我们拿教程第一张图中的时间戳进行验证,浏览器访问这个接口发现拿到数据了,这个结果跟抓包的结果是一样的。那么简单的so调用就这么搞定了。那么我们是否可以用IDA调试继续来搞呢?

回到伪c代码,大概看看代码你应该知道,取了签名值之后,又有字符串拼接等操作,后面执行MD5Digest函数传入了三个参数,第一个是字符串,第二个是字符串的长度,第三个用于存放运行结果,我们只需要最终需要加密的字符串就好办了,看伪c代码是看不出来的,顶多可以猜一下。

调试状态下为了效率问题并不会完全解析代码,就会有个问题,我们不好找下断点的地方,因为函数名变成我们不认识的,那么我们需要另一种方法,从函数开始的位置往下数,看MD5Digest位于第几个BLX, 记住这个位置。

到网上下载相应的android_server,用adb将其推送到手机里,具体参考网上教程,然后把名称和端口号最好改一下,有的app会根据这个名称和端口号进行反调试,但是本教程案例没有反调试,默认也可以,然后开启服务,进行端口转发。

重新打开IDA, 远程附加进程。

慢慢等待,出来下图所示的界面点击左上角的启动按钮,让app在调试状态下运行,然后找到Modules, ctrl+f 搜索你需要调试的so, 点进去找到需要调试的函数

一般情况下,当某个函数被调用的时候,R0, R1, R2, R3寄存器存放函数的参数值,因为MD5Digest函数,传入了三个值,所以我们后面调试的时候,只需要关注R0、R1、R2寄存器就可以了,接下来,我们需要找到下断点的位置。

找到前面记住的BLX位置,如果你不确定这个位置是否正确,可以点进去,然后按c键,可以看到这个地方就是我们需要下断点的位置,把方法函数名改一下,方便查看。

按F2添加断点,手机输入账号密码点击登陆触发断点。到Hex View-1右击同步R0寄存器

根据R0寄存器的地址找到存放的数据,可以看到该值是一个字符串,字符串前一部分就是我们上面取到的签名值,后面一部分是时间戳,把这个字符串复制一下以遍后面验证使用

R1寄存器中存放的值是16进制数值2D, 转换为十进制为45,正好是R0寄存器存放的字符串的长度。

同步R2寄存器,因为MD5Digest函数还没有执行,所以这里的值不是最终的结果,我们按F8继续执行

下图标出来的就是计算后的结果,那么这个MD5Digest和python的md5计算结果是否一样呢?

经过验证,发现结果是一样的。本教程案例没有遇到反调试,app加固等情况,加密函数的逻辑比较简单容易处理,即使这样,搞起来还是很费劲的,app逆向需要掌握很多知识,只能慢慢啃,急不得。

如果觉得教程不错,帮忙分享转发,谢谢!

喜欢文章,点个在看  

逆向so_安卓逆向 | 分析调试与so调用实战相关推荐

  1. Web逆向、软件逆向、安卓逆向、APP逆向,关于网络安全这些你必须懂

    逆向工程是网络安全行业里面一项很重要的技术. 先解释下逆向工程是什么. 逆向是一个相对正向而言的解释,相对正向来说,对一个程序来讲,正向就是开发的过程,从0到1. 就是在一个软件诞生的整个生命周期中的 ...

  2. js逆向、安卓逆向教程

    JS基础 提示信息 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn 安卓逆向 1.模拟器环境搭建 Magisk 是一套用于定制 Android 的开源软件,支 ...

  3. 安卓怎么调用系统的ui_安卓逆向 | 为了反射调用我们怎么能拿到被HOOK函数的实例...

    先打一拳,打的时候再把问题问遍. 蔚 前言当我们在xposed进行反射调用的时候,很多时候被HOOK函数并不是static函数,但是我们在调用的时候需要传入该函数的类的实例,那实例我们怎么拿到呢,今天 ...

  4. 安卓逆向学习笔记:native层开发、分析和调试基础

    安卓逆向学习笔记:native层开发.分析和调试基础 本笔记主要是自己看,所以如果有看不懂的地方也请多多包涵,这一篇的笔记主要是<Android应用安全防护和逆向分析>的部分内容. 一 A ...

  5. 安卓逆向分析中常用动态调试方法总结

    安卓逆向之----常用动态调试方法 一. 前言 逆向分析中常用的分析方法有:静态分析.动态调试.HOOK等.动态调试的好处是:1)可以在调试的过程中知道参数或者局部变量的值以及变化过程,2)可以快速履 ...

  6. 安卓逆向_21 --- Java层和so层的反调试( IDA 动态调试 JNI_OnLoad、init_array下断)

    1. 安卓程序动态调试条件 安卓程序动态调试条件 ( 2个满足1个即可 ): 1. 在 AndroidMainfest.xml ---> application 标签下,设置或者添加属性 and ...

  7. 安卓逆向之基于Xposed-ZjDroid脱壳 逆向分析(脱壳)

    安卓逆向--某力播逆向分析(脱壳) 一.环境 这一步真的头疼,环境很重要,各种测试,一下是我测试的环境,由于没有真机,就拿虚拟机做测试 1.  Xposed       2. FDex2        ...

  8. 跟我一起从零学习安卓逆向分析

    随着国家对信息安全的重视,兴起了各大CTF的赛事,其中逆向板块的安卓平台题目不断涌现.在这个互联网+的时代,移动互联网的APP犹如滚雪球一般的增长,随之而来的则是移动业务安全如风险控制.反外挂.安全合 ...

  9. native层 安卓_安卓逆向——拼xx协议java层分析

    制丨阿星 整理丨阿星 老铁们大家好,今天小编给大家带来很实用的技巧叫拼xx协议java层分析,有啥不足的地方望大家指点指点! 首先抓包  反编译 这个时间段我们方法剖析一下 找到onclick 看他的 ...

最新文章

  1. D3js(二): d3js基础
  2. 华为手机如何升级鸿蒙系统_华为官方正式公告!鸿蒙手机系统下周发布:普通花粉何时能升级?...
  3. ConcurrentHashMap中的2的n次方幂上舍入方法
  4. Request中的方法调用
  5. API 接口设计中 Token 类型的分类与设计
  6. pthread_cond_timedwait方法Linux时间编程
  7. 阿里云-CentOS7安装Vsftpd
  8. 深入浅出Hadoop: 高效处理大数据
  9. 倍福plc的型号_倍福plc编程软件下载-倍福plc软件(beckhoff twincat plc)下载v3.1 最新版-当易网...
  10. 机器视觉检测:电阻电容的二次筛选提高效率及达成环保目的
  11. Zune vs iPod
  12. 60天使用百词斩背单词的感想
  13. APIO2019 打铁记
  14. 台式计算机usb口不识别鼠标,如何解决插入鼠标提示无法识别USB设备的问题
  15. 计算机到点就有音乐怎么清除缓存垃圾,如何自动清理网易音乐的缓存
  16. 解决 win10 商店无法登录, win10 账号问题
  17. 网页中播放RTSP(5) WebSocket播放视频
  18. 3.1 项目经理的角色习题集
  19. 科普 | 区块链概念最全解析:区块链的下一个十年什么样?
  20. 网站分析11——成本控制类指标

热门文章

  1. pytorch的backward参数
  2. 卷积神经网络(CNN:Convolutional Neural Network)
  3. Jupyter 安装使用
  4. Python 爬虫学习 系列教程
  5. itext实现HTML转换为PDF
  6. Redis系列六、redis的五种数据结构和相关指令之Sorted Set
  7. sakura计算机谱子,【14.08.13自拟】SAKURA急求生物股长的简谱
  8. cuda tensorflow版本对应_Windows10下安装tensorflow-gpu(2.2.0)安装教程(避坑+保姆式教学)...
  9. 奇妙的安全旅行之加密算法概述
  10. 计算机应用基础教材6,全国2013年自考《计算机应用基础》教材大纲第六章