解密所有APP运行过程中的内部逻辑

记一次 APK 逆向动静调试 + so 动态链接库分析 好久没有做过安卓逆向了,最近重新系统地学习了安卓逆向技术。找到了一道较为典型的逆向分析题来练手,以锻炼动静态分析和动态链接库分析的基本能力。在这里记录基本的分析流程手法。通过 APK 逆向和 so 动态链接库分析,了解应用的内部逻辑和行为。静态分析帮助我们初步理解代码结构和关键点,而动态调试则允许我们在运行时获取更详细的信息。两者结合,可以有效地进行应用的逆向工程和安全分析。 阅读详情

0×01前言

这年头,apk全都是加密啊,加壳啊,反调试啊,小伙伴们表示已经不能愉快的玩耍了。静态分析越来越不靠谱了,apktool、ApkIDE、jd GUI、dex2jar等已经无法满足大家的需求了。那么问题就来了,小伙伴们真正需要的是什么?好的,大家一起呐喊出你内心的欲望吧,我们的目标是——“debug apk step by step”。

0×02那些不靠谱的工具

先来说说那些不靠谱的工具,就是今天吭了我小半天的各种工具,看官上坐,待我细细道来。

2.1 IDA pro

IDA pro6.6之后加入了dex动态调试功能,一时间普天同庆、喜大普奔。兴奋之后你才会发现IDA这东西在动态调试方面真的是很挫,就算他是静态反编译之王,我也不得不说他的动态调试功能还非常需要加强。先说说使用ida调试dex的方法。

IDA pro调试dex流程:

1.用apktool反编译apk,添加android:debuggable=”true”,重打包apk并签名
2.从apk文件中扣出class.dex文件,不管你用什么方法,7zip、unzip…whatever
3.用ida打开这个dex文件,直到output window窗口显示“xxxx finished”
4.设置debugger选项,debugger->debugger options->set specific options,按如图1所示进行设置,然后一路确定返回
5.找到要下断点的位置,光标移到要下断点的那一行,按f2下断点
6.手机开启调试选项,链接usb到电脑
7.选中IDA pro窗口,按f9走起,不出意外的话应该会出现如图2的画面,成功啦~

图 1 ida debug配置

图 2 ida动态调试apk

触发断点,在watch view和Locals窗口都能看到内存变量的值,简直就是画美不看啊,是不是有点小兴奋?!我只能说高兴的太早了,小伙伴们还是太天真了,仔细观察下,就算你勾选了“Hex display”,你还是无法以hex格式显示变量的值,就是说不可显示字符你都看不到值是什么,而且我找了很久也没找到类似windbg、od、vc6、gdb、lldb那样以各种姿势或者命令直接查看某内存地址值的功能,然后就出现了如图3的画面……WTF!我特么忙活了半天居然还不如直接logcat来得痛快!

图 3  Locals窗口

2.2 apktool+eclipse

其实小生一直还是很支持eclipse的,毕竟伴我度过了无数不眠之夜和懵懂的年华(当然苍老师和windbg可能占的更多),可是这次我真的有点小失望哈。由于使用apktool+eclipse和apktool+android studio的调试方法跟apktool+idea一样,调试方法后面一起说,这里我就先纯吐槽了。

当小伙伴们成功设置调试选项,带着嗨翻的心情进入调试界面的时候,我们看到了如图4的画面,细细观察和各种尝试之后,我保证你的心里一定有一万头草泥马奔腾而过!!!。

图 4 eclipse单步调试apk

我们都看到了啥:

1.debug窗口表示命中第30行的断点

2.variables窗口没有任何本地变量的值,寄存器的值也没有

3.单步步入、单步步过等调试按钮都是灰色的,快捷键F5678都没反应

我就想知道这你让我怎么debug,难道我要设无限个断点,拼命f9来调试?就算是这样,我该去哪儿看变量的值?

2.3 apktool+android studio

android studio这个东西本来是蛮不错的,就是稍微有点卡,习惯了也还好。其实android studio本身就是用idea改的,但是好像给改挫了。调试方法还是后面再说,直接上成功挂载到调试界面的图,如图5。

图 5 android studio单步调试apk

这次情况是这样的:

1.可以看到现在程序停在哪一行,虽然不明显

2.本地变量能看到,但是寄存器还是木有啊

3.单步按钮还有单步快捷键都能用了,看起来好多了啊

我还是想说,问题是寄存器的值还是没法直观的看到啊,对于有强迫症的我还是无法接受这种设定啊,想当年vc6、od、windbg、gdb、lldb是多么的给力,多么的好用!

0×03 apktool+idea

正菜来了,apktool 2.0bete9版本推出了-d选项,专门用来重打包apk进行单步调试的,给力!apktool+idea无源码debug apkstep by step简直不要太好用,这也是我跟小波请教之后才弄好的,这个选项也是小波等人建议apktool作者这样做的,不禁感叹一句,波神你为何这么屌!

3.1调试基础

本小节内容引用自看雪论坛@火翼[CCG]的文章,原文链接:http://www.kanxue.com/bbs/showthread.php?p=1291716

根据android的官方文档,如果要调试一个apk里面的dex代码,必须满足以下两个条件中的任何一个:

1.apk中的AndroidManifest.xml文件中的Application标签包含属性android:debuggable=”true”
2./default.prop中ro.debuggable的值为1

由于正常的软件发布时都不会把android:debuggable设置为false(当然也不排除某些很2的应用偏偏就是true),所以要达成条件1需要对app进行重新打包,这不仅每次分析一个apk都重复操作,而且很多软件会对自身进行校验,重打包后执行会被检测到,所以想办法满足第2个条件是个一劳永逸的办法。

由于default.prop是保存在boot.img的ramdisk中,这部分每次重新启动都会重新从rom中加载,所以要到目的必须修改boot.img中的ramdisk并重新刷到设备中。修改步骤如下(我没试过,有兴趣的倒腾下):

1.从Google官方网站下载到boot.img
2.使用工具(abootimg,gunzip, cpio)把boot.img完全解开,获取到default.prop
3.修改default.prop
4.把修改后的文件重新打包成boot_new.img
5.使用fastboot工具把boot_new.img刷入设备(fastboot flash boot boot_new.img)

3.2调试方法

这里我们还是用第一种方法来进行测试:

1.下载apktool2.0b9版本,下载地址:http://connortumbleson.com/2014/02/06/apktool-2-0-0-beta-9-released/

2.使用apktool反编译apk:

java -jar apktool_2.0.0b9.jar d -d xxx.apk -o out

加上-d选项之后反编译出的文件后缀为.java,而不是.smali,每个.java文件立马都伪造成了一个类,语句全都是“a=0;”这一句,smali语句成为注释,小伙伴们自己看看打开就知道了,做这些都是为了后面欺骗idea、eclipse、androidstudio这些ide的;

3.加入android:debuggable=”true”选项;

4.重打包apk,一定记得也使用-d选项:

java -jar apktool_2.0.0b9.jar b -d out -o debug.apk

5.对apk进行签名并安装apk到调试设备(这个不用我说怎么操作吧);

6.下载安装并打开idea,新建一个空的java项目,本例中项目名为“DebugOnly”,将apk反编译后的smali目录下的所有文件拷贝到刚才新建的java项目的src/目录下,刷新,如图6;

图 6拷贝文件

7.打开androiddevice monitor(终端下敲命令monitor或者ddms),终端下运行命令:adb shell am start -D -n {Package Name}/.{Activity},运行效果如图7;

图 7命令运行效果

此时在调试设备上会显示等待调试器接入:

图 8调试设备状态

8.从androiddevice monitor上发现需要调试的程序已经显示在列表里面了,记下端口号,本例中为8700;

图 9 android device monitor

9. 新建远程调试:依次点击run->edit configuration->“+”号->Remote,选中第6步中新建的项目,填写第8步中获得的端口号,如图10;

图 10 debug设置

10.找到相应位置设置断点(在想设断点的位置前后多设置几个断点),点击run->debug->unnamed,其中unnamed是第9步中新建的远程调试的名字;

图 11远程调试名字

11.不出意外的话,小伙伴们应该能看到如图12所示的画面,恭喜你,已经成功了!此时此刻兴奋之情简直能以言表哈~good luck! have fun! enjoy~

图 12 idea单步调试apk

0×04后语

另外,阿呆曾经提到一篇文章用jdb远程调试android程序的文章,链接为:http://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications/,我没有尝试过,主要是我比较懒,用apktool+idea已经够用了,就没去倒腾,有兴趣的小伙伴请自行倒腾,别忘了分享!

最后,其实我也不确定ida是不是真的不能以hex格式显示变量值,或许是我不会用ida咧;我也不确定eclipse到底能不能看寄存器的值,单步按钮和快捷键到底能不能用,或许是我eclipse版本的问题咧;我也不确定android studio到底能不能看到寄存器的值,或许是我android studio版本的问题咧,再或者我用的调试设备有问题咧,再或者我的脸有问题咧……以上问题,如果哪位小伙伴知道怎么解,跪求告知!

IDA的详细使用指南以及核心功能讲解 阅读详情

相关推荐

APK调试(三) so调试

    1.调试准备 在IDA目录下的dbgsrv目录下找到android_server。有点类似gdbserver,操作也是类似; adb remount adb push android_server /system/bin adb shell chmod 755 /system/bin/android_server adb shell android_server adb f...

u013077314的博客 1459

解密所有APP运行过程中的内部逻辑(转)

转贴地址:http://www.freebuf.com/tools/54562.html 0×01前言 这年头,apk 全都是加密啊,加壳啊,反调试啊,小伙伴们表示已经不能愉快的玩耍了。静态分析越来越不靠谱了,apktool、ApkIDE、jd GUI、dex2jar等已经无法满足大家的需求了。那么问题就来了,小伙伴们真正需要的是什么?好的,大家一起呐喊出你...

weixin_30702887的博客 436

抖音xlog算法解密过程

前言 抖音,作为一款国民级别的app,甚至在国外的tiktok也火的一塌糊涂,我所在的公司今年也决定做一款互联网应用,在制作应用前,我们通过逆向分析了一下抖音的app,其中,有很多值得学习的地方,抖音中包含的几个算法: 设备注册算法 登录注册算法 xg算法 xlog算法 xlog解密 今天,我们来看下xlog算法,xlog算法是抖音对于风控数据提交的算法,也叫设备解锁算法,我们根据抖音最新的12.0.1版本进行逆向,解密xlog接口的数据后,发现抖音在这方面真的是做到了极致,解密后数据如下: { "

dingmy000的博客 1万+

APK调试

源码的情况下,对APK的动态调试主要分为两种: smali汇编动态调试 arm汇编动态调试 Smali汇编动态调试 对smali汇编的动态调试主要分为两种: 使用ida进行调试 使用IDE + apktool进行调试 Eclipse + apktool Android studio + apktool Idea + apktool … 使用jeb2.2以后版本调试 IDA 调试smali ...

kernweak的博客 6840

逆向实战:手把手教你用Frida Hook某小说App的AES解密过程(附完整脚本)

本文详细介绍了如何使用Frida动态插桩技术逆向分析某小说App的AES解密过程,从环境搭建到关键字符串定位,再到动态Hook解密逻辑,提供了一套完整的实战方案。特别适合对Android逆向和安全分析感兴趣的开发者学习,附有完整的Frida脚本示例。

weixin_42569329的博客 1030

js逆向--webpack解密逻辑分析

webpack对于有研究过的人来说难度并不是很高,但是因为webpack的代码,非常的繁多,一个webpack可能就是几万行代码。在逆向中对于webpack的加解密网站,一般是不建议去扣代码的,大多数解决办法是采用自吐。办法是把这整个js文件copy下来,然后改写一两处地方即可自主调用。这篇文章,我也是用自吐算法来做的。

Harden13_的博客 2524

app包体解密逆向分析

网上很多教程是告诉你,用 jadx 打开 apk,然后全局搜索加密函数,我本人也用过这种方法,但是很容易陷入误区,因为有的 apk 代码做了混淆,所以有时候你全局搜到的看似是加密函数,其实并不是你真正想找的加密点。附上一张图,如下,就是本人最开始陷入的误区,这里并不是包体加密的函数,而是一个获取 UAID 授权 Token 的加密点,所以我就换了一种思路来进行分析。最近也是刚好接到了一次 app 的测试项目,也是遇到了同样的问题,那么,话不多说,开始实战!

zgz67611的博客 2721

Fiddler Everywhere高阶实战:HTTPS解密、断点篡改与Mock数据在APP逆向中的应用

HTTPS解密与中间人攻击是网络安全和软件调试中的基础技术,其原理是通过在客户端与服务器之间插入代理,实现对加密通信的拦截与解密。这项技术的核心价值在于,它让开发者能够透视网络数据流,分析应用与服务器的交互逻辑,为安全审计、协议分析和故障排查提供了关键手段。在移动应用开发、API接口测试和逆向工程等场景中,掌握流量分析工具至关重要。Fiddler Everywhere作为一款现代化的跨平台抓包工具,不仅支持HTTPS解密,更通过断点调试、AutoResponder模拟和FiddlerScript自动化等高级

weixin_42557803的博客 945

移动安全-Burpy自动化加解密APP报文

文章目录前言Burpy实战演示环境插件简介RPC脚本Burpy效果手动加解密自动加解密总结 前言 我在前面一篇博文 移动安全-Brida加解密数据 中介绍了如何使用 Brida 插件对 APP 报文进行自动化加解密,Brida 美中不足的是对报文进行加解密的时候需要手动点击,除非通过新增自定义的 BurpSuite 插件来搭配 Brida,才能实现 repeater 模块中的报文自动化加解密。 后来发现 m0nst3r(个人博客) 大佬在 Github 上开源了一个用于自动化加解密数据的插件 Github:

道阻且长,行则将至 3375

Fiddler实战:APP加密数据抓包与解密全流程解析

在移动应用开发与安全测试中,网络数据加密是保障通信安全的核心技术,通常涉及对称加密(如AES)、非对称加密(如RSA)及哈希算法等基础密码学原理。这些技术通过将明文转化为密文,有效防止数据在传输过程中被窃取或篡改,其价值在于平衡业务功能与安全需求。在实际工程场景中,开发与测试人员常需在合规前提下,对加密流量进行解析以进行调试、性能分析或安全评估。本文聚焦于使用Fiddler、Jadx、Frida等工具链,通过代理捕获、静态分析与动态Hook(挂钩)技术,系统演示如何逆向分析APP的加密机制,并最终实现自动化

weixin_42539414的博客 366

【C++】POCO学习总结(六):线程、线程池、同步

Poco::RunnableAdapter继承自Poco::Runnable,在Poco::RunnableAdapter构造函数中指定了类和方法;Poco::ThreadLocal是线程局部变量,也叫线程局部存储,意思是模版ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。

郭老二 5100

某汽车资讯App 返回数据解密

某汽车资讯App 返回数据解密

Spontaneous_0的博客 385

Dataset - DeepFashion 服装数据集

Dataset - DeepFashion 服装数据集 [Dataset - DeepFashion] [Project - DeepFashion] 1. 服装类别和属性预测集 [Category - Attribute 下载] [百度网盘] 289,222 张服装图片 clothes images; 50 个服装类别 clothing categories 1,000 ...

长风破浪会有时,直挂云帆济沧海 2万+

记一次渗透过程中某APP的逆向分析过程

本次APP逆向过程需要熟练各种工具的使用以及环境的配置,如使用Magisk,而大部分人的手机都没有root,所以得使用虚拟环境,也就是光速虚拟机,还有一些诸如ReqableJEB算法助手。

hot_milk1的博客 2467

百度智能云训练图像分割模型+python调用模型并分割图像

目录 训练模型阶段 发布图像分割API 调用图像分割API 创建应用后显示以下两个代码 在pycharm中可以调用API mask解码 依赖库pycocotools安装步骤: 依赖库urllib2的安装 源码下载: 最近上课听老师介绍了一个训练图像分割模型的网站,把数据集上传之后做图像标注,然后进行训练就能得到准确率等指标。 训练模型阶段 图像分割:https://ai.baidu.com/easydl/vision/ 图像分割-->创建模型-->上传数据--&gt

icecreamdinner的博客 1389

3D打印机之Marlin固件配置

一、Marlin固件必要配置 打开Configuration.h文件,使用VS code的搜索功能来修改下面的参数。 配置波特率 #define BAUDRATE 250000 配置串口波特率,一般不修改。上位机的波特率要和这个一致才能正常通讯。 2. 配置主板类型 第 134 行 #define MOTHERBOARD BOARD_MKS_GEN_L 找到 boards.h 这个文件打开,就可以看到支持的主板类型。3d打印机主控板类型非常多,每个板子硬件连接都可能不同,所以这个参数必须要跟你自己的板子

acktomas的博客 2万+

绕过xx鲸选APP强制更新,及分析加密解密

app是有加固的,使用frida-dexdump脱壳。发现请求参数和结果都是加密的

weixin_41259961的博客 2057

从菜鸟到高手:我的Abaqus壳单元S4R、S3R、S8R选择心路历程

第一次打开Abaqus的单元库时,我被琳琅满目的壳单元类型晃花了眼。S4R、S3R、S8R、STRI65、S9R5...这些看似随意的字母数字组合,背后却隐藏着影响仿真精度的关键密码。作为一名从土木工程转行到汽车结构仿真的工程师,我花了三年时间才真正理解如何根据问题特性精准选择壳单元。这段学习历程充满试错与顿悟,今天就用几个关键案例,分享我的壳单元选择方法论。

weixin_42525637的博客 419

一例APP绕过root检测解密

最近在分析一款app时遇见了root检测,数据包加密,花了时间简单研究了一下,记录下学习的过程。

白帽子佳奇的博客 2688

【 Git学习记录(三)】推荐四款主流的Git代码托管平台 —— GitHub、GitLab、Gitee、Coding

了解过Git之后,作为一个程序猿最基本的,你还需要了解目前主流的在线代码托管平台,并至少选择其中一款在平时开发中使用。这里特别介绍以下四款: 国外平台 GitHub —— 全球最流行的代码托管平台 GitLab —— 基于git的仓库管理程序 国内平台 Gitee —— 开源中国旗下的代码托管平台 Coding —— 支持社交元素的代码托管平台 一. GitHub 链接地址:https://github.com/ GitHub目前是全球最流行的代码托管平台(别称:全球最大的同性交友.

JZevin的博客 6092

提升JVM性能:CMS垃圾回收器的优化分析与案例研究

本文介绍了CMS(Concurrent Mark-Sweep)垃圾回收器的工作原理、优缺点及常见问题,并通过具体案例分析了其优化策略。重点探讨了CMS的各个阶段,包括标记、并发清理和重标记,分析了可能导致性能瓶颈的因素如停顿时间过长和内存碎片化。文章还分享了调整垃圾回收参数、结合其他垃圾回收器以及内存优化等方法,帮助提高CMS的回收效率和性能。最后,文章展望了随着JVM发展,结合新一代垃圾回收器优化的趋势,助力Java应用在高并发环境下的性能提升。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 175万+

FLEX程序初始化及此解密过程

原文地址:http://www.gridlinked.info/how-to-encrypt-flex-rsls/这里截取并尝试翻译了一段FLEX程序初始化及此解密过程.应用启动过程:1. 首先, 为第1帧加载足够的数据.2. Flash Player通过创建SystemManager实例执行加载数据.3. SystemManager命令Flash Player停止在第一帧.4. Syst

jeulivy的专栏 992

使用lighttpd和开发板进行交互

本文介绍了如何在嵌入式开发板上使用Lighttpd Web服务器实现硬件交互功能。主要内容包括:Lighttpd通过CGI程序间接控制硬件的基本原理;lighttpd.conf配置文件的详细解析;开发板文件目录结构设计;用C语言编写控制GPIO的CGI程序示例;网页调用CGI实现按钮触发控制的HTML代码;常见问题调试建议。最后通过效果图展示了网页按钮点击后成功控制LED灯的实际效果,验证了Lighttpd+CGI方案在嵌入式设备Web控制中的可行性。

m0_49476241的博客 1425
上一篇: Android-导航栏特效-新闻类APP(仿iOS版网易新闻今日头条的文字渐变缩放特效)
下一篇: ORM框架简介
Manaasdfasdf
博客等级 码龄11年 131粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值