re从零开始的反编译教程

参考链接:https://www.52pojie.cn/thread-742703-1-1.html

写在开头,引用很喜欢的一句话:要么学!要么不学!学和不学之间没有中间值 不学就放弃,学就要去认真的学! --致选择

1、 反编译简介

为了回溯编译过程(或对程序进行逆向工程),我们使用各种工具来撤销汇编和编译过程,这些工具就叫反汇编器和反编译器。反汇编器撤销汇编过程,因此我们可以得到汇编语言形式的输出结果。反编译器则以汇编语言甚至是机器语言为输入,其输出结果为高级语言。

2、 Smali语法教程

2.1 原始类型

  • B---byte
  • C---char
  • D---double
  • F---float
  • I---int
  • J---long
  • S---short
  • V---void
  • Z---boolean
  • [XXX---array
  • Lxxx/yyy---object

数组的表示方式是:在基本类型前加上前中括号“[”,例如int数组和float数组分别表示为:[I、[F;对象的表示则以L作为开头,格式是LpackageName/objectName;

(注意必须有个分号跟在最后),例如String对象在smali中为:Ljava/lang/String;,其中java/lang 对应 java.lang包,String就是定义在该包中的一个对象。或许有人问,既然类是用LpackageName/objectName;来表示,那类里面的内部类又如何在smali中引用呢?
答案是:在LpackageName/objectName/subObjectNamesubObjectName前加 $ 符号。

2.2 方法

方法的定义一般为:Func-Name (Para-Type1Para-Type2Para-Type3...)Return-Type
注意参数与参数之间没有任何分隔符,同样举几个例子就容易明白

  1. hello ()V。没错,这就是void hello()
  2. hello (III)Z。这个则是boolean hello(int, int, int)
  3. hello (Z[I[ILjava/lang/String;J)Ljava/lang/String;
    看出来这是String hello (boolean, int[], int[], String, long) 了吗?

2.3 Smali基本语法

无序列表的使用,在符号"-"后加空格使用。如下:

  • field private isFlag:z  定义变量
  • method  方法
  • parameter  方法参数
  • prologue  方法开始
  • line 123  此方法位于第123行
  • invoke-super  调用父函数
  • const/high16 v0, 0x7fo3  把0x7fo3赋值给v0
  • invoke-direct  调用函数
  • return-void  函数返回void
  • end method  函数结束
  • new-instance  创建实例
  • iput-object  对象赋值
  • iget-object  调用对象
  • invoke-static  调用静态函数

2.4 条件跳转分支

  • "if-eq vA, vB, :cond_*" 如果vA等于vB则跳转到:cond_*
  • "if-ne vA, vB, :cond_*" 如果vA不等于vB则跳转到:cond_*
  • "if-lt vA, vB, :cond_*" 如果vA小于vB则跳转到:cond_*
  • "if-ge vA, vB, :cond_*" 如果vA大于等于vB则跳转到:cond_*
  • "if-gt vA, vB, :cond_*" 如果vA大于vB则跳转到:cond_*
  • "if-le vA, vB, :cond_*" 如果vA小于等于vB则跳转到:cond_*
  • "if-eqz vA, :cond_*" 如果vA等于0则跳转到:cond_*
  • "if-nez vA, :cond_*" 如果vA不等于0则跳转到:cond_*
  • "if-ltz vA, :cond_*" 如果vA小于0则跳转到:cond_*
  • "if-gez vA, :cond_*" 如果vA大于等于0则跳转到:cond_*
  • "if-gtz vA, :cond_*" 如果vA大于0则跳转到:cond_*
  • "if-lez vA, :cond_*" 如果vA小于等于0则跳转到:cond_*

3、 Android Killer

3.1 反编译失败

https://www.jianshu.com/p/1c54c1ccf5cc

https://www.cnblogs.com/onelikeone/p/7594177.html

3.2 .smali文件已丢失

解决:点击进去jd-gui,删除试一试。再不行换最新版本


3.3 Android Killer反编译失败:No resource identifier found for attribute 问题解决方法

解析结束后进行编译报错
解决方法:https://blog.csdn.net/fuchaosz/article/details/104800802

3.4 解决反编译安装失败报Error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED的处理方式

Failed parse during installPackageLI: Targeting R+ (version 30 and above) requires the resources.arsc of installed APKs to be stored uncompress

解决方法:

  1. 使用安卓10及一下手机
  2. 手动降低该程序版本


降低gradle里版本,若出现
signatures do not match the previously installed version;

使用adb install命令在手机上安装app时,遇到这个报错。原因是新装的app和手机上现有的旧版app冲突了。
解决方法:删除手机上原来的app,再重新安装即可。

可是转念一想如果反编译的apk都是Version 30 R+以上,难道我解压后挨个改一遍gradle?太彻淡了,一定有解决方法,所以有了下面探究出现这个问题的解决方法:既然报错是资源文件高版本不支持,而且没有4位对齐,那么不编译资源文件就好了

  1. 不编译资源文件,使用V2签名(还是不能编译资源文件,即使用了V2签名s,在高版本)

4、 二次打包

APK签名工具之jarsigner和apksigner:

https://blog.csdn.net/xzytl60937234/article/details/89088215?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-1&spm=1001.2101.3001.4242

利用apktool反编译apk,并且重新签名打包:

https://blog.csdn.net/qq_21007661/article/details/109851522?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-4&spm=1001.2101.3001.4242

  1. 进入AndroidKiller_v1.3.1\bin\apktool目录

验证apktool能否使用


apktool -r d apk名字.apk,不反编译资源文件,为什么这么做,先挖个坑


错误提示没有4位对齐和不支持30版本以上的资源文件。所有尝试不编译资源文件

解决4位对齐的方法:


  1. 使用apktool进行反编译(Android Killer有该工具)

    1. 解压apk
    • apktool d src.apk //解压apk到当前文件夹
    • apktool d src.apk -o temp //到temp文件夹
    • apktool -r d apk名字.apk //不反编译资源文件,到当前文件夹
    • 直接用zip打开手动解压
执行反编译命令,apktool d filename,这里我执行的是apktool d app-debug.apk
其中d是decode的意思,表示要对这个apk进行解码,除了这个基本用法,还有其他的附带参数:

- -f 如果目标文件夹已存在,则强制删除现有文件夹(默认如果目标文件夹已存在,则解码失败)。
- -o 指定解码目标文件夹的名称(默认使用APK文件的名字来命名目标文件夹)。
- -s 不反编译dex文件,也就是说classes.dex文件会被保留(默认会将dex文件解码成smali文件)。
- -r 不反编译资源文件,也就是说resources.arsc文件会被保留(默认会将resources.arsc解码成具体的资源文件)

2. 修改需要的内容,用AndroidKiller修改smali文件
3. 二次打包回apk,使用apktool进行编译成apk安装包
   - apktool b src //src为解压的文件夹名称
   查看src目录,里面多了一个dist目录,目录里面有个 xxx.apk
  1. 签名

使用keytool产生密钥,生成abc.keystore

  • keytool -genkey -alias abc.keystore -keyalg RSA -validity 20000 -keystore abc.keystore

//keytool -genkeypair -keystore 密钥库名 -alias 密钥别名 -validity 天数 -keyalg RSA

查看当前目录,生成了新文件:abc.keystor

使用JarSigner对apk进行签名,命令如下

jarsigner -verbose -keystore abc.keystore -signedjar testx.apk src.apk abc.keystore

直接反编译的apk产生上述错误


但是只编译资源文件的apk安装时


发现没有使用V2进行签名,这时候进行V2签名,(apksigner,默认同时使用V1和V2签名

所以先对只编译资源文件的apk进行V2尝试看能否成功

重复1(进行apktool -r d apk名字.apk)-->2 -->3 -->4(不使用jarsigner而使用apksigner)

将生成的abc.keystore和打包回的apk(apktool\app-debug\dist里的app-debug.apk)放入C:\Users\taowei.lian\AppData\Local\Android\Sdk\build-tools\30.0.3下,因为Android studio的SDK下有apksigner.bat.

17.png

对jarsigner只是apk进行了V1签名;在Android7.0引入了V2签名,因此,当进入sdk\25.0.0及后续版本,会发现一个apksigner.bat执行脚本。

我们可以通过apksigner进行V2签名,当然,apksigner默认是同时支持V1与V2的,于是:

abc.keystore密钥库只有一个密钥对

  • apksigner sign --ks debug.keystore app-debug.apk

在debug.keystore密钥库中有多个密钥对,所以必须指定密钥别名

  • apksigner sign --ks debug.keystore --ks-key-alias androiddebugkey app-debug.apk

5、 签名验证

5.1 签名机制概述

学习了公钥和密钥的使用和区别,使用私钥的加密算法称为对称加密算法,这种算法实现是接收方和发送方公用一道密钥,优点是效率高,缺点是安全性差,如果被第三人得知密钥则信息泄露,由此衍生了公钥加密算法,也就是非对称加密算法,这个算法是接收方给发送方公钥,发送方用公钥加密后发给接收方,接受方再用私钥解密。这样即使所有人知道公钥也不会造成信息泄露。缺点是效率非常低。

此外了解了RSA签名的大致过程,发送方拥有公钥和私钥,对信息进行摘要然后把摘要通过密钥进行签名,然后把签名和信息一起发出去,那么如何验证该信息就是发送方发出的呢,这时候就使用到了公钥验证,通过公钥对信息进行解签,然后使用一样的摘要算法得到摘要,如果得到的摘要和解签后的内容一致则说明是发送方发出。
总结就是公钥加密,私钥解密。公钥验证,私钥签名

RSA 密码体制是一种公钥密码体制,公钥公开,私钥保密,它的加密解密算法是公开的。由公钥加密的内容可以并且只能由私钥进行解密,而由私钥加密的内容可以并且只能由公钥进行解密。也就是说,RSA 的这一对公钥、私钥都可以用来加密和解密,并且一方加密的内容可以由并且只能由对方进行解密。

  • 加密:公钥加密,私钥解密的过程,称为「加密」。

因为公钥是公开的,任何公钥持有者都可以将想要发送给私钥持有者的信息进行加密后发送,而这个信息只有私钥持有者才能解密。

  • 签名:私钥加密,公钥解密的过程,称为「签名」。

它和加密有什么区别呢?因为公钥是公开的,所以任何持有公钥的人都能解密私钥加密过的密文,所以这个过程并不能保证消息的安全性,但是它却能保证消息来源的准确性和不可否认性,也就是说,如果使用公钥能正常解密某一个密文,那么就能证明这段密文一定是由私钥持有者发布的,而不是其他第三方发布的,并且私钥持有者不能否认他曾经发布过该消息。故此将该过程称为「签名」。

Android 签名机制 v1、v2、v3

5.2 方法一(keytool,只支持V1签名校验)

进入JDK/bin, 输入命令

keytool -printcert -jarfile MyApp.apk (显示签名证书信息)

参数:

  • -printcert 打印证书内容
  • -jarfile 已签名的jar文件 或apk文件

5.3 方法二(apksigner,支持V1和V2签名校验)

进入Android SDK/build-tools/SDK版本, 输入命令

apksigner verify -v --print-certs xxx.apk

参数:

  • -v, --verbose 显示详情(显示是否使用V1和V2签名)
  • –print-certs 显示签名证书信息

例如:

apksigner verify -v MyApp.apk

最后安装加 -t :

adb install -t app-debug-signed.apk

附上参考链接:

6、 用AS编写第一个so

https://blog.csdn.net/A807296772/article/details/102298970

配置NDK的时候如果按钮是灰色的,手动配置

sdk.dir=C\:\\Users\\taowei.lian\\AppData\\Local\\Android\\Sdk
ndk.dir=C\:\\Users\\taowei.lian\\AppData\\Local\\Android\\Sdk\\ndk\\21.3.6528147

问题一、javac编译 解决警告:编码 GBK 的不可映射字符

直接在javac后面指定编码是UTF-8就是了。

javac -encoding UTF-8 xxxx.java

问题二、找不到 'com.example.jni.myJNI' 的类文件。

javah -classpath . -jni com.example.pixiaozhi.jni.TestJni

需要注意的是要加上* -classpath .其中classpath后面的一个黑点是不能省略的。

编译好后如何导入so库

  sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

成功运行后发现lib目录下已经apk编进去so了

7、 破解so

https://www.52pojie.cn/thread-732298-1-1.html
本节所有到的工具和Demo

IDA
链接:https://pan.baidu.com/s/15uCX8o6tTSSelgG_RN7kBQ 密码:ftie

Demo
链接:https://pan.baidu.com/s/1vKC1SevvHfeI7f0d2c6IqQ 密码:u1an

7.1 使用IDA工具,注意:拖进去的so必须是解压apk的so,不然修改无法生效!

找到so并打开它 因为我的机型是支持arm的所以我这里打开的是armeabi文件夹下的so 如果机型是x86模式的那么这里要打开x86模式下的libJniTest.so

  • armeabiv-v7a: 第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它.
  • arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一。
  • armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。
  • x86: 平板、模拟器用得比较多。
  • x86_64: 64位的平板。

编译过程:


7.2 找到字符串hello 52pojie!并修改为hello world!

按住键盘组合键 shift + f12 打开字符串窗口 这个窗口将会列举出so中所包含的所有字符串 因为上节课我们只编写了一个字符串 所以这里只有一个hello 52pojie! 如果打开的是x86的so这里还会有一些.so 但是字符串只有这一个


7.3 双击进去将会找到hello 52pojie!的内存地址

7.4 修改内存地址

鼠标点在hello 52pojie!字符串上,打开 Hex dump窗口,修改hello 52pojie!对应内存地址的内容
关于字符对应的16进制可以在百度百科搜索ascii码表 找到字符所对应的16进制

因为我要把hello 52pojie!修改成hello world! 是不是只要找到每个字符所对应的hex修改就好了
这里我看到 hello 52pojie!对应的hex是:68 65 6C 6C 6F 20 35 32 70 6F 6A 69 65 21
我在ascii码表上找到world所对应的十六进制是:77 6F 72 6C 64
所以hello world! 对应的十六进制是:68 65 6C 6C 6F 20 77 6F 72 6C 64 21



7.5 找到所要修改的字符所对应的16进制 右键Edit

注意编辑的时候光标暂停的位置只有先输入字母才能更改成功,修改好后 右键Apply changes应用

7.6 保存so。

退出后保存


此时已经so修改完毕


7.7 对原apk进行解压,替换so,打包,签名,安装流程,运行看看

大功告成,hello 52pojie! --> hello world!


第一篇技术处女文,借鉴了许多大佬的学习资料,填上了学习过程中踩到的所有坑,文章段落结构方面还待改进,望共励共励! --后记

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容

  • APK 反编译 一、APK反编译基本原理 1.APK分析 assets文件夹:原始资源文件夹,对应着Android...
    R7_Perfect阅读 720评论 0 1
  • 1 工具篇 反编译和回编用到的一些工具: apktool是解包APK 文件最常用的工具 keytool是一个Jav...
    Gavinme阅读 14,273评论 0 8
  • !!! 严正声明 本文相关反编译技术仅限于技术研究使用,不能用于非法目的,否则后果自负. 1. apktool 逆...
    潇风寒月阅读 1,232评论 0 1
  • 1分钟速览,使用apktool反编译涉及的命令如下: 需要注意的是,生成keystore文件时输入的密码一定要牢记...
    Ziv_紫藤花开阅读 712评论 2 1
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,532评论 28 53