闲来无事,学习了下安卓的逆向工程,有助于观摩学习他人的优秀代码,查询了解后发现大体包括两部分:
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_5EFABNE loc_5EFA,通过汇编代码知道,此处用R0寄存器中的值和2比较大小,如果R0中的值等于2,跳转到下边的loc_5EFA处:

双击此行,然后点击Hex View-1标签可以看到对应的机器码:

由于elf的存储模式是小端模式(Little-endian),故实际的机器码是D0 07,转换为二进制:‭1101 0000 0000 0111‬,可以看出是16位的Thumb指令,打开armv7构架手册(armv8也可以),找到指令集部分:

如上图,此机器码对应红框中的编码方式,要修改BEQBNE,则需要修改8-11位的条件位,立即数保持不变:

上图可以查出EQ的机器码为0000NE机器码则是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修改)相关推荐

  1. 【Android 逆向】整体加固脱壳 ( 脱壳点简介 | 修改系统源码进行脱壳 )

    文章目录 一.脱壳点简介 二.修改系统源码进行脱壳 一.脱壳点简介 在上一篇博客 [Android 逆向]整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 rewriteD ...

  2. Android逆向入门7——Smali语法学习(1)

    这一节我们一起探讨smali语法和smali在Android逆向中的应用,它是Android逆向世界中不可或缺的一部分. 简单的来说,Dex反编译的结果就是Smali,Smali和dex之间的关系,我 ...

  3. 【Android 逆向】ART 脱壳 ( 修改 /art/runtime/dex_file.cc#OpenCommon 系统源码进行脱壳 )

    文章目录 一.要修改的源码 /art/runtime/dex_file.cc#OpenCommon 二.修改 /art/runtime/dex_file.cc#OpenCommon 函数源码进行脱壳 ...

  4. Android逆向之--------常用软件安装

    Android逆向系列文章目录 第一章 Android逆向学习入门之软件安装 文章目录 Android逆向系列文章目录 前言 一.ApkTool 使用apktool进行反编译apk 二.smali/b ...

  5. Android逆向-实战sign分析-某某合伙人_v4.0.9

    1.基础分析 1.1.基础分析 工作中经常会对一些app进行安全审计,一般在拿到应用后可以使用APK Helper工具对应用做个简单分析,了解目标的包名,版本号,名称等基础信息,之后再安装到手机上熟悉 ...

  6. 小七新Android逆向,小七Android逆向脱壳课程

    [视频目录] [小七新Android逆向脱壳课程]脱壳1.Java环境配置与各种逆向工具安装配置介绍 [小七新Android逆向脱壳课程]脱壳2.Android手机端配置及必要软件安装 [小七新And ...

  7. android逆向01:修改apk的资源文件,smali插桩

    前提: 有需求才有实现. android逆向能干什么?去除游戏中的广告,跳过各种支付达到付费效果,人为干预简化游戏流程直奔主题,无限增加各种付费道具,等等:当然可以对自己的apk进行逆向的逆向进行加固 ...

  8. 什么是Android逆向?如何学习安卓逆向?Android逆向自学笔记入门到实战

    简单地来说,安卓逆向是对已经打包好的APP进行反编译.源码分析了解APP实现逻辑的一门技术.我们可以把安卓安装时用到的APK文件看作一个加密后的压缩包,逆向就是要最大程序地还原出APK打包之前的源码. ...

  9. Android逆向--如何调试smali代码?

    最近在重整Android逆向分析环境,一切都在从零开始,做下记录,给大家分享. 本文介绍Android逆向中smali代码的调试及环境的准备. 事先准备如下工具: Android killer:反编译 ...

最新文章

  1. Java高并发编程:总线锁定和缓存一致性的问题
  2. 字体对话框java实验_Java Web安全 || Java基础 sun.misc.Unsafe
  3. 启动Tomcat 7一闪而过的问题
  4. SCI/EI期刊投稿 Reply Letter 常用格式总结
  5. TOMCAT中使用HTTPS的过程
  6. 《汇编语言》第一章笔记
  7. C# 插件构架实战(Jack H Hansen )
  8. xp计算机如何查看内存大小,xp如何查看内存大小
  9. 广和通工业级5G模组产品线一览到底
  10. 华尔街日报评亚洲10大商界人物 王建宙等上榜
  11. sin(ωt),一文和正弦函数、频域、周期的头疼说白白
  12. Java后端根据身份证号获取年龄
  13. 最好用的 20 款数据可视化工具
  14. 最小生成树 算法思想及模板代码
  15. 计算机开机桌面黑屏怎么办,小编教你电脑启动后黑屏该怎么办
  16. myeclipse下server视图nullpoint问题
  17. 国务院将灵活就业列入“放管服”重点任务分工方案
  18. 一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10
  19. Origin 画箱图
  20. 计算机启动盘安装教程,u启动u盘启动盘制作工具制作u盘启动盘及u盘装系统教程...

热门文章

  1. Win10应用程序无法正常启动0xc0000142错误的解决方法
  2. zabbix server报错:FATAL: password authentication failed for user zabbix
  3. Linux中,Mysql安装
  4. 【Oracle】RAC中控制文件多路复用
  5. mybatis generator自动生成sqlmap代码的不完善之处以及解决方法
  6. MVC 打印解决方案--SNF快速开发平台3.1
  7. 戴尔笔记本不能识别U盘和鼠标解决方法
  8. Oracle中用户和架构之间的区别?
  9. 为什么null为对象,并且null和undefined有什么区别?
  10. 让现有的Git分支跟踪一个远程分支?