Android逆向入门7——Smali语法学习(1)
这一节我们一起探讨smali语法和smali在Android逆向中的应用,它是Android逆向世界中不可或缺的一部分。
简单的来说,Dex反编译的结果就是Smali,Smali和dex之间的关系,我们常常称为转化(convert);Dex是晦涩的二进制文件,Smali是人可以读懂的代码,而Jadx等工具就是解析Smali文件,翻译成Java代码,其准确度差了不止一个档次了。
我们尝试一下新的形式,用问与答的形式表述一下Smali学习的一些困惑。
问:学习Smali有啥用?
答:可以实现对Apk源代码的修改。
问:我只是想搞懂Apk的运行逻辑,我为什么要修改Apk源代码?
答:因为Apk程序的运行是非常复杂的,你很难光靠静态分析Jadx反编译得到的Java代码就搞懂程序。
问:你这样说太虚了,举个例子把。
答:在上一节中,我们找到了疑似sign算法生成的地方,可是我们怎么确定这儿就是sign生成的地方?
问:可以抓一次数据包,如果这个函数的返回值和抓包得到的sign一致,那么就可以判断了吧?
答:抓包很好做,那怎么拿到这个函数的返回值呢?
问:我好像不知道。
答:我们之前对代码的分析是静态的,现在我们要动态分析程序和代码,以小红书sign为例,它最后return lowerCase2,那我们在上面一行print(lowerCase2),然后查看日志不就行了吗?
问:print是Python中用来打印输出的吧,Android用什么?
答:对对对,Java中打印用System.out.println()方法打印输出,Android提供了更方便的Log输出,形式如Log.d(“tag”,“Info”),我们可以通过Android Logcat日志查看器查看和监测一台Android设备运行时产生的所有日志,再通过tag标签/包名/进程id等标识筛选和监测我们需要的那一类Log日志即可。
问:之前通过Android Studio,我确实通过Logcat菜单查看过Log日志,可是那是开发App用的工具,逆向时我们怎么通过它检测Log呢?
答:逆向App时,Android Studio也是非常强大的工具,连接设备后,我们确实也可以通过Android Studio内置的Logcat工具栏查看日志,但Android Studo太庞大了,我们可以使用Android SDK提供的Android Devices Monitor,它更加轻量级,但功能完善。打开SDK目录——tools——ddms.bat/monitor.bat都可以。
问:我现在已经知道怎么查看日志了,那该怎么在程序中插入一行Log.d(“疑似sign值”, lowerCase2)呢?
答:将Dex返汇编成Smali文件,找到这个类对应的Smali文件,在对应的位置插入Log.d(“疑似sign值”, lowerCase2)这句Android代码所对应的Smali代码,然后将Smali代码回编译成Dex文件,重打包成Apk在手机上运行,手机连接电脑,即可在Android Device Monitor(简称DDMS)中查看Logcat。
问:这就是Smali插桩对吗?
答:是的,Smali插桩可以输出一些关键的信息值,比如函数的参数,函数的返回值,除此之外,Smali插桩还可以帮助我们探测程序的运行逻辑,比如你在if语句内放一个Log.d(”Test“,0),如果Logcat中没有看到这句日志,就说明程序没有走if这个代码块。
引用一下维基百科的插桩定义:程序插桩,最早是由J.C. Huang
教授提出的,它是在保证被测程序原有逻辑完整性的基础上在程序中插入一些探针(又称为“探测仪”),通过探针的执行并抛出程序运行的特征数据,通过对这些数据的分析,可以获得程序的控制流和数据流信息,进而得到逻辑覆盖等动态信息,从而实现测试目的的方法。
问:那Smali除了插桩还能干啥?我听说Hook技术也可以实现插桩。
答:确实,Hook技术很强大,你可以Hook一个函数,它就受你摆布,不论是狸猫换太子换成另外一个函数,还是简单的输出它的参数和返回值都是可以的,Android平台的主流Hook框架目前是Xposed和Frida,它们都很方便而且强大。
问:那我们为什么不学它们而学Smali?
答:因为Smali是基础中的基础,搞Android逆向,就不能不懂Smali代码和arm汇编,更因为Smali动态调试需要你理解Smali,单论插桩能力,Frida插桩甩出Smali插桩三条街,我们之后很快就会提到它。
问答结束,下一讲中,我们将使用Smali插桩技术在Log中输出疑似Sign生成函数的参数和返回值。
Android逆向入门7——Smali语法学习(1)相关推荐
- android逆向分析之smali语法
一 .smali数据类型 1.Dalvik字节码 Davlik字节码中,寄存器都是32位的,能够支持任何类型,64位类型(Long/Double)用2个连续的寄存器表示: Dalvik字节码有两种类型 ...
- 【转载】Android逆向开发之smali语言的学习
Android逆向开发之smali语言的学习 该文转载自乱码三千 – 分享实用IT技术 smali和java基本数据类型对比 smali java B byte S short I int J lon ...
- Android逆向之调试smali代码基础
点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 介绍Android逆向中调试smali代码的方法." 最近在重整Android逆向分析环境,一切都在从零开始,做下记录,给大家分享 ...
- android 逆向入门知识
为什么会引入这个话题,因为在第一次入门的时候发现xxx.apk逆向之后的目录结构很清晰,但是自己新建的demo资源一大堆,当时一脸懵逼,在整合的过程中绕了很多弯路,最后才发现了原因.所以整理出来,方便 ...
- Android逆向世界之一:smali文件
亲测可用,如有问题请私信! 一直对android的逆向分析很感兴趣,这些年也陆陆续续反编译了一些android的项目,今天开始对这方面的知识做一下总结.先从android的apk文件开始讲起. APK ...
- Android逆向--如何调试smali代码?
最近在重整Android逆向分析环境,一切都在从零开始,做下记录,给大家分享. 本文介绍Android逆向中smali代码的调试及环境的准备. 事先准备如下工具: Android killer:反编译 ...
- Android逆向入门1——引言与抓包
一个人要走多少路 才能称的上是一个男人 一个Python程序员要绕多少弯 才能找到Android逆向的路 废话不多说,Talk is cheap. 本教程食用指南 主要面向Python爬虫工程师 An ...
- Android基础入门教程——1.0 学习大纲
当一个萌新看见Android的大门时,那离进入那扇门也不远了.下面是总结的学习Android的内容大纲. 下一章
- python入门之基础语法学习笔记
Python 中文编码 Python 文件中如果未指定编码,在执行过程会出现报错: Python中默认的编码格式是 ASCII 格式,在没修改编码格式时无法正确打印汉字,所以在读取中文时会报错. 解决 ...
最新文章
- 关于REID的mAP指标
- threadlocal内存泄露_ThreadLocal原理解析
- linux gcc 内联汇编入门
- SAP 调用外部系统
- SpringBoot Quartz 定时任务详解
- 网络服务器预防dos***的层次
- python seaborn 热图 值对应颜色_基于行值的seaborn热图配色方案
- 前端怎么获取cookie的值_京东购物小程序cookie方案实践(附Demo)
- 游戏主播这个行为终于有人治了!腾讯下“禁令”
- C++---布隆过滤器
- 视频会议受追捧,省钱又节能
- cmos和ttl_TTL和CMOS的区别详解
- nicescroll参数
- OMS订单管理系统框架图
- 微信小程序实现tab标签页的切换及动态的选中下划线移动
- MyBatis Plus 联合查询
- 华为交换机 查ip冲突_华为交换机如何查看本交换机IP地址?
- 快速找出bug的几点建议
- 求助:如何实现EA自动判断趋势,寻找高低点,并获取高低点K线价格数据,然后根据价格画出支撑阻力区域.
- NPN和PNP 的电流方向 、大小关系 、电压偏置
热门文章
- IS指标复现 文本生成图像IS分数定量实验全流程复现 Inception Score定量评价实验踩坑避坑流程
- 吕布机器人唤醒方式能换么_《王者荣耀》英雄吕布化身机器人 这价格你买吗?...
- matplotlib 配色
- 史上最强多线程面试47题(含答案),建议收藏
- 一文了解websocket和socket(论点:概念、流程、区别)
- 诸葛io 大数据时代,企业如何打好信息资源整合攻坚战?
- 阿里P8级Java必备知识之JVM面试合集
- parallels desktop windows环境安装的软件都显示在mac桌面怎么隐藏
- css的选择器-逗号、空格分隔和连写的区别
- SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建【后端篇】【快速生成后端代码、封装结果集、增删改查、模糊查找】【毕设基础框架】