Android逆向从入门到入土(smali修改,so修改)
闲来无事,学习了下安卓的逆向工程,有助于观摩学习他人的优秀代码,查询了解后发现大体包括两部分:
1.dex反编译,即smali语法学习;
2.Native层,arm汇编学习。
反编译dex,Smali语法
工具
java环境不多说
1.apktool.jar;
2.jd-gui.jar;
3.dex2jar.zip;
这里就不提供了,毕竟自己动手,丰衣足食,建议百度下载最新的版本,旧版本可能会有bug。
查看java源码
假设现在有一个test.apk,如果我们想要查看一个apk里的java源码,就可以通过解压apk文件得到dex文件,然后使用dex2jar.zip工具包中的d2j-dex2jar.bat将dex转为jar文件:
将classes.dex拖动到d2j-dex2jar.bat上,得到classes-dex2jar.jar,使用jd-gui.jar打开就可以查看源码了:
反编译
但是jar文件只能辅助我们查看java代码,无法修改。想要修改的话,还是要反编译出smali文件,然后对smali文件进行修改操作,使用下边的命令反编译apk:
apktool.jar d test.apk
然后会在当前目录生成test目录,目录内容大体如下:
assets资源目录,包含了图片和字体等资源;
build和dist为重新编译生成的,新apk在dist目录;
lib为so文件目录;
original保存了原签名和反编译前的清单文件;
res主要为layout,strings等xml文件;
unknown不用管;
下边是AndroidManifest.xml,清单文件,已经可以打开查看了;
然后最重要的来了smali和smali_classes2,apk中的每个dex文件会反编译出一个smali文件夹,classes.dex对应smali,classes2.dex对应smali_classes2,以此类推。
修改smali
知道了这些后,就可以查看修改我们想要的内容了。AndroidManifest.xml不多说,做过安卓开发都可以改,重点是smali的阅读修改。首先打开smali文件夹内容如下:
由于现在apk编译时普遍会进行混肴,以防他人修改二次发布,所以目录结构有些乱,但并无大碍。
随手打开一个smali文件(sublime,已安装smali插件):
嗯,看不懂,没事现在学还来得及,你需要了解下smali语法,传送门:APK反编译之一:基础知识--smali文件阅读。
smali修改简单示例:
上图为原java代码,下图是反编译出的smali代码,此方法用来判断外置储存是否可读。
现在无论外置存储是否可读,我们都想让此方法返回true,则可以在smali代码中的return v1
前加上一行const/4 v1, 0x1
,如下图:
是不是非常简单?当然,这只是最简单的修改,一切都建立在深入地学习和了解过smali语法的基础上。
Native层,arm汇编
安卓native层,通俗来说就是对lib目录下的so文件学习和了解,so文件是Android NDK动态链接库,是二进制文件,作用相当于windows下的.dll文件。想要深入了解相关知识,可以百度关键字:‘安卓 native’,‘安卓 JNI’,‘安卓 ELF’,‘安卓 NDK’。
不同的cpu构架
so通常是针对不同的cpu构建编译而成的,如下图:
arm64-v8a:arm最新的64cpu构架,如骁龙810,820,835等都是基于此构架的,同时兼容A32,T32指令集;
armeabi-v7a:32位cpu构架,如骁龙800,801等,兼容armv5,armv6;
armeabi:armv5,armv6构架,基本已经淘汰了;
x86:intel的32位cpu构架,即windows平台的32位cpu构架;
x86_64:其实是amd出的兼容64位的32位cpu构架;
arm构架都是向下兼容的,例如如果CPU是armv8,没有对应arm64-v8a文件夹,则会执行armeabi-v7a中的so文件。
话不多说,开始研究修改so文件吧,首先使用010 editor或ida打开armeabi下的so(elf)文件(这里使用ida),弹出界面直接点击ok,进入如下页面:
要了解elf文件的详细信息可以查看:ARM平台下elf文件超详细的分析与解读,elf文件的解析这里不做更多说明。如果你跟我一样,别的什么也不想看,就想知道怎么修改so,那么下面我们就来看看怎么修改arm汇编的机器码,来达到修改so文件的目的。
修改前的准备工作
1.了解二进制文件的大小端模式,传送门:详解大端模式和小端模式;
2.了解寄存器相关知识,了解arm32位和64位寄存器的区别,特别是lr,sp,pc等关键寄存器的作用;
3.arm指令集学习,包括32位指令(A32,T32)和64位指令(A64),这里不上链接了,因为太多了,具体建议百度自查;
4.下载arm官网cpu构架手册,修改时需要对应查看,链接:A-Profile Architecture,我们主要查看a系列的构架手册,主要下载的文件:
Arm® Architecture Reference Manual Armv8, for Armv8-A architecture profile
Arm® Architecture Reference Manual Armv7-A and Armv7-R edition
The A64 instruction set
第一本是关于A64指令集的手册,其实也包含了A32和T32指令集,第二本是armv7构架,包含了ARM指令和Thumb指令,第三本介绍了A64指令。
5.熟练进行进制转换,可以使用win10自带的计算器的程序员模式。
修改so文件
- 32位
以下内容建立在以上知识的基础上,开始修改,接着我们打开的so页面(armeabi-v7a),滚动到汇编代码区域,如下图:
例如想要修改Ox00005EE8处的关键跳转BEQ loc_5EFA
为BNE loc_5EFA
,通过汇编代码知道,此处用R0寄存器中的值和2比较大小,如果R0中的值等于2,跳转到下边的loc_5EFA处:
双击此行,然后点击Hex View-1标签可以看到对应的机器码:
由于elf的存储模式是小端模式(Little-endian),故实际的机器码是D0 07
,转换为二进制:1101 0000 0000 0111
,可以看出是16位的Thumb指令,打开armv7构架手册(armv8也可以),找到指令集部分:
如上图,此机器码对应红框中的编码方式,要修改BEQ
为BNE
,则需要修改8-11位的条件位,立即数保持不变:
上图可以查出EQ
的机器码为0000
,NE
机器码则是0001
,因此修改后的机器码为1101 0001 0000 0111
,再转换回16进制为D1 07
,小端存储07 D1
,按如下步骤,右键点击修改:
修改完后右键点击应用修改:
然后返回IDA View-A视图,可以看到BEQ loc_5EFA
已经改为了BNE loc_5EFA
:
- 64位
下边尝试下修改64位构架下的so文件,64位的so必须用64位的ida打开:
如上图,我们修改红框中的代码,改为:
CMP W1, #1
B.LT loc_1B5C
CMP W0, #0
的机器码为0111 0001 0000 0000 0000 0000 0001 1111
,查看armv8a手册:
寄存器w0
改成w1
,只需将5-9位改为00001
。立即数#0
改为#1
,需要将10-21位改为00 0000 0000 01
,改完后机器码变为0111 0001 0000 0000 0000 0100 0011 1111
,转换为16进制后:71 00 04 3F
,小端模式3F 04 00 71
;
B.GT loc_1B10
的机器码0101 0100 1111 1111 1111 1110 0000 1100
,编码方式如下:
B.GT改为B.LT,即修改0-3位为1011
。
原立即数1111 1111 1111 1110 000
,补码转为原码为1001 0000
,即-16
。
偏移量计算方法为:offset = SignExtend(imm19:'00', 64)
,也就是19位的立即数后边拼接00
(左移2位),变为1111 1111 1111 1110 000 00
,然后有符号扩展为64位(对于负数,前边补1,补足64位),变为1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1100 0000
,此为补码,转为原码1100 0000
,即-64
。正如红框中的所述,是立即数的4倍。
此处要改为loc_1B5C
,即偏移量为+12,则立即数为+12/4 = +3
,5-23位的立即数变为0000 0000 0000 0000 011
。
最终机器码为0101 0100 0000 0000 0000 0000 0110 1011
,转换16进制54 00 00 6B
,小端模式6B 00 00 54
。
然后,修改应用后查看结果:
Android逆向从入门到入土(smali修改,so修改)相关推荐
- 【Android 逆向】整体加固脱壳 ( 脱壳点简介 | 修改系统源码进行脱壳 )
文章目录 一.脱壳点简介 二.修改系统源码进行脱壳 一.脱壳点简介 在上一篇博客 [Android 逆向]整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 rewriteD ...
- Android逆向入门7——Smali语法学习(1)
这一节我们一起探讨smali语法和smali在Android逆向中的应用,它是Android逆向世界中不可或缺的一部分. 简单的来说,Dex反编译的结果就是Smali,Smali和dex之间的关系,我 ...
- 【Android 逆向】ART 脱壳 ( 修改 /art/runtime/dex_file.cc#OpenCommon 系统源码进行脱壳 )
文章目录 一.要修改的源码 /art/runtime/dex_file.cc#OpenCommon 二.修改 /art/runtime/dex_file.cc#OpenCommon 函数源码进行脱壳 ...
- Android逆向之--------常用软件安装
Android逆向系列文章目录 第一章 Android逆向学习入门之软件安装 文章目录 Android逆向系列文章目录 前言 一.ApkTool 使用apktool进行反编译apk 二.smali/b ...
- Android逆向-实战sign分析-某某合伙人_v4.0.9
1.基础分析 1.1.基础分析 工作中经常会对一些app进行安全审计,一般在拿到应用后可以使用APK Helper工具对应用做个简单分析,了解目标的包名,版本号,名称等基础信息,之后再安装到手机上熟悉 ...
- 小七新Android逆向,小七Android逆向脱壳课程
[视频目录] [小七新Android逆向脱壳课程]脱壳1.Java环境配置与各种逆向工具安装配置介绍 [小七新Android逆向脱壳课程]脱壳2.Android手机端配置及必要软件安装 [小七新And ...
- android逆向01:修改apk的资源文件,smali插桩
前提: 有需求才有实现. android逆向能干什么?去除游戏中的广告,跳过各种支付达到付费效果,人为干预简化游戏流程直奔主题,无限增加各种付费道具,等等:当然可以对自己的apk进行逆向的逆向进行加固 ...
- 什么是Android逆向?如何学习安卓逆向?Android逆向自学笔记入门到实战
简单地来说,安卓逆向是对已经打包好的APP进行反编译.源码分析了解APP实现逻辑的一门技术.我们可以把安卓安装时用到的APK文件看作一个加密后的压缩包,逆向就是要最大程序地还原出APK打包之前的源码. ...
- Android逆向--如何调试smali代码?
最近在重整Android逆向分析环境,一切都在从零开始,做下记录,给大家分享. 本文介绍Android逆向中smali代码的调试及环境的准备. 事先准备如下工具: Android killer:反编译 ...
最新文章
- Java高并发编程:总线锁定和缓存一致性的问题
- 字体对话框java实验_Java Web安全 || Java基础 sun.misc.Unsafe
- 启动Tomcat 7一闪而过的问题
- SCI/EI期刊投稿 Reply Letter 常用格式总结
- TOMCAT中使用HTTPS的过程
- 《汇编语言》第一章笔记
- C# 插件构架实战(Jack H Hansen )
- xp计算机如何查看内存大小,xp如何查看内存大小
- 广和通工业级5G模组产品线一览到底
- 华尔街日报评亚洲10大商界人物 王建宙等上榜
- sin(ωt),一文和正弦函数、频域、周期的头疼说白白
- Java后端根据身份证号获取年龄
- 最好用的 20 款数据可视化工具
- 最小生成树 算法思想及模板代码
- 计算机开机桌面黑屏怎么办,小编教你电脑启动后黑屏该怎么办
- myeclipse下server视图nullpoint问题
- 国务院将灵活就业列入“放管服”重点任务分工方案
- 一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10
- Origin 画箱图
- 计算机启动盘安装教程,u启动u盘启动盘制作工具制作u盘启动盘及u盘装系统教程...
热门文章
- Win10应用程序无法正常启动0xc0000142错误的解决方法
- zabbix server报错:FATAL: password authentication failed for user zabbix
- Linux中,Mysql安装
- 【Oracle】RAC中控制文件多路复用
- mybatis generator自动生成sqlmap代码的不完善之处以及解决方法
- MVC 打印解决方案--SNF快速开发平台3.1
- 戴尔笔记本不能识别U盘和鼠标解决方法
- Oracle中用户和架构之间的区别?
- 为什么null为对象,并且null和undefined有什么区别?
- 让现有的Git分支跟踪一个远程分支?