apk反编译相关知识
-
apk反编译我们都知道,Android程序打完包之后得到的是一个APK文件,这个文件是可以直接安装到任何Android手机上的,我们反编译其实也就是对这个APK文件进行反编译。Android的反编译主要又分为两个部分,一个是对代码的反编译,一个是对资源的反编译,我们马上来逐个学习一下。 我们都知道,Android程序打完包之后得到的是一个APK文件,这个文件是可以直接安装到任何Android手机上的,我们反编译其实也就是对这个APK文件进行反编译。Android的反编译主要又分为两个部分,一个是对代码的反编译,一个是对资源的反编译,我们马上来逐个学习一下。 在开始学习之前,首先我们需要准备一个APK文件,为了尊重所有开发者,我就不拿任何一个市面上的软件来演示了,而是自己写一个Demo用来测试。 这里我希望代码越简单越好,因此我们建立一个新项目,在Activity里加入一个按钮,当点击按钮时弹出一个Toast,就这么简单,代码如下所示:public class MainA
-
APK反编译关键命令及步骤反编译对于开发来说属于基本功,会了反编译,既可以用来查看我们要发布的包配置是否正确,代码是否有什么问题,是否存在被他人注入修改的情况,还可以用来学习别人的代码,当然要是混淆加固的非常厉害那就另当别论下面开始,只说关键点,详细教程自行搜索假设已经有了apktool及2j-dex2jar工具,没有的自行下载最新版本,最新版可以提高反编译成功率注意,在使用apktool时,需同时下载apktool及对应平台的依赖包,解压后将平台依赖包中的apktool.jar复制到apktool目录下先说查看清单文件,资源文件不在查看考虑范围方法1:1.复制apk至apktool路径内,运行cmd进入apktool.bat路径假如我的apktool放在了d盘,那么完整的命令是:C:\Users\Administrator>cd d: 回车;C:\Users\Administrator>d:2.执行 'apktool.bat d f xxx.apk',等待结束。其中d表示解包到此我们可以查
-
Android 反编译指南我们下载到的 App 安装包是 Apk 文件(Android Application Package) 。通过 Apk 文件,我们也可以得到这个应用的代码和资源文件,对应用进行修改。那么我们如何获取这些文件呢?这就需要 Android 反编译技术。01 所需要的软件Apktool反编译 xml 文件和 dex 文件,并可以将编译后的项目重新打包成 apk。官方下载地址: Apktool官方的速度有时候不稳定,也可以从我的网盘中下载: 链接 密码:xkaodex2jar将 classes.dex 转换为「.jar」文件)官方下载地址: dex2jar我的网盘: 链接 密码:xkaojd-gui查看「.jar」文件官方下载地址: jd-gui我的网盘: 链接 密码:xkao02 Apktool我们可以通过 Apktool 可以将 apk 文件进行反编译,但是直接把 apk 的扩展名改成「.zip」也可以对其进行解压并得到一些资源文件。直接解压和使用 Apktool 的区别ME
-
HLQ反编译坎坷路 之 首战 看我破解APK修改资源文件前言本文,乃是反编译首战,在此,特意记录过程中遇到的点点滴滴问题,如有不足之处,欢迎指正~在此,特意感谢鸡排兄以及薇薇姐~ 3q~本文目标由于首战,今天我们先来玩点简单的:将Apk解包并修改资源文件(包含:更换Apk名称、替换Icon以及更换文字内容)将修改好的Apk包进行回包,运行查看效果。本文操作流程摆(qián)好(tí)姿(liǎo)势(jiě)反编译之前,我们首先准备好反编译工具,下面将进行简单介绍。 而本文,则重点使用ApkTool工具进行愉快的玩耍~ 让我们一起开始愉快的玩耍吧~一、ApkTool 下载地址官方下载地址(资源下载较慢): https://bitbucket.org/iBotPeaches/apktool/downloads/资源库下载(下载速度还是66的): http://www.softpedia.com/get/Programming/Debuggers-Decompilers-Dissasemblers/ApkTool.shtml二
apk反编译相关课程
apk反编译相关教程
- 4.3 代码反编译分析 为了好反编译分析单独把库中的那个函数拷出来取了 startActivityKt 名字便于分析。class SplashActivity : BizActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.biz_app_activity_welcome) startActivityKt<AccountActivity>()//只需这样就直接启动了AccountActivity了,指明了类型形参上界约束Activity }}inline fun <reified T : Activity> Context.startActivityKt(vararg params: Pair<String, Any?>) = AnkoInternals.internalStartActivity(this, T::class.java, params)编译后关键代码://函数定义反编译 private static final void startActivityKt(@NotNull Context $receiver, Pair... params) { Intrinsics.reifiedOperationMarker(4, "T"); AnkoInternals.internalStartActivity($receiver, Activity.class, params);//注意点一: 由于泛型擦除的影响,编译后原来传入类型实参AccountActivity被它形参上界约束Activity替换了,所以这里证明了我们之前的分析。 }//函数调用点反编译protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(2131361821); Pair[] params$iv = new Pair[0]; AnkoInternals.internalStartActivity(this, AccountActivity.class, params$iv); //注意点二: 可以看到这里函数调用并不是简单函数调用,而是根据此次调用明确的类型实参AccountActivity.class替换定义处的Activity.class,然后生成新的字节码插入到调用点。}在函数加点输出就会更加清晰:class SplashActivity : BizActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.biz_app_activity_welcome) startActivityKt<AccountActivity>() }}inline fun <reified T : Activity> Context.startActivityKt(vararg params: Pair<String, Any?>) { println("call before") AnkoInternals.internalStartActivity(this, T::class.java, params) println("call after")}反编译后:private static final void startActivityKt(@NotNull Context $receiver, Pair... params) { String var3 = "call before"; System.out.println(var3); Intrinsics.reifiedOperationMarker(4, "T"); AnkoInternals.internalStartActivity($receiver, Activity.class, params); var3 = "call after"; System.out.println(var3); } protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(2131361821); Pair[] params$iv = new Pair[0]; String var4 = "call before"; System.out.println(var4); AnkoInternals.internalStartActivity(this, AccountActivity.class, params$iv);//替换成确切的类型实参AccountActivity.class var4 = "call after"; System.out.println(var4); }
- 5. Kotlin反编译插件的使用 AndroidStudio 和 IntelliJ IDEA 一样,也有 Kotlin 的反编译插件神器,有了它就能更加清晰理解 Kotlin 语法糖背后的原理了。1. 首先来给activity_main.xml布局中那个 TextView 加个 id:2. 然后在MainActivity中,直接使用tv_hello来改变文本内容,因为在app/build.gradle加入了apply plugin: 'kotlin-android-extensions',再也不需要像 Java 那样手动的findviewById。是不是觉得 Kotlin 超级方便,简单,没有任何模板代码。3. 可能很多人都会疑惑,为什么 Kotlin 却能做到不需要 findViewById 呢? Kotlin 编译器到底在背后默默做了哪些事?所以这时候需要轮到 Kotlin 反编译插件上场,通过它你将会发现 Kotlin 背后做了哪些骚操作。反编译工具的使用和 IntelliJ IDEA 是一样的。4. 点击Show Kotlin Bytecode后,将会看到代码区域右边,会出现一个Kotlin Bytecode区域,这里面显示的 Kotlin 字节码:5. 然后点击Kotlin Bytecode区域中的Decompile反编译按钮,它能将Kotlin字节码反编译成对应的Java代码:6. 然后在代码区域将会出现MainActivity.decompiled.java反编译后的 Java 代码:
- 5. Kotlin 反编译插件的使用 关于第一个 Hello Kotlin 大家可以会疑惑一点,特别是有 Java 基础的小伙伴心里会想为什么 Kotlin 的 main 函数定义可以脱离类包裹,在类外面直接定义函数运行,这一点在 Java 中是做不到的呀。想知道为什么吗? 那么接下来就由 Kotlin 反编译插件这个神器来告诉你。(强调一点,关于反编译插件后续会频繁反复用到,一定要学会如何使用)。下面就是使用反编译插件的基本使用步骤:1. 在主界面中,找到Tools中的Kotlin,然后找到Kotlin中的Show Kotlin Bytecode:2. 点击Show Kotlin Bytecode后,将会看到代码区域右边,会出现一个Kotlin Bytecode区域,这里面显示的Kotlin字节码:3. 然后点击Kotlin Bytecode区域中的Decompile反编译按钮,它能将Kotlin字节码反编译成对应的Java代码:4. 然后在代码区域将会出现HelloKotlin.decompiled.java反编译后的 Java 代码:到这里大家应该恍然大悟,有Java基础的小伙伴都能看懂,这就是一个HelloKotlinKt类中定义一个main函数。其实 Kotlin 那么简单 main 函数本质上还是一个类包裹,只不过 Kotlin 给你提供更简洁的写法。实际上 Kotlin 中的 main 函数是一个顶层函数,顶层函数会对应默认生成一个类,类名默认是定义的 Kotlin 文件名 +Kt 后缀;然后函数对应类中的静态函数。至于什么是顶层函数以及类名生成规则后面会陆续讲到。
- 2.1 编译 编译语法aapt2 compile path-to-input-files [options] -o output-directory/在以下示例中,AAPT2 分别编译了名为 strings.xml 和 myImage.png 的资源文件:aapt2 compile project_root/module_root/src/main/res/values-en/strings.xml -o compiled/aapt2 compile project_root/module_root/src/main/res/drawable/myImage.png -o compiled/如上表中所示,输出文件的名称取决于输入文件的名称及其父目录(资源类型和配置)的名称。对于以 strings.xml 作为输入的上述示例,aapt2 会自动将输出文件命名为 values-en_strings.arsc.flat。另一方面,存储在 drawable 目录中的已编译可绘制对象文件的文件名将为 drawable_img.png.flat。编译选项命令选项说明-o指定已编译资源的输出路径。–dir指定要在其中搜索资源的目录。–pseudo-localize生成默认字符串的伪本地化版本,如 en-XA 和 en-XB。–no-crunch停用 PNG 处理。–legacy将使用早期版本的 AAPT 时允许的错误视为警告。-v启用详细日志记录。
- 5. 反向映射 所谓的反向映射就是指枚举的取值,不但可以正向的 Months.Jan 这样取值,也可以反向的 Months[1] 这样取值。enum Months { Jan = 1, Feb, Mar, Apr}将上面的代码进行编译,查看编译后的 JavaScript 代码:'use strict'var Months;(function (Months) { Months[Months['Jan'] = 1] = 'Jan' Months[Months['Feb'] = 2] = 'Feb' Months[Months['Mar'] = 3] = 'Mar' Months[Months['Apr'] = 4] = 'Apr'})(Months || (Months = {}))通过查看编译后的代码,可以得出:console.log(Months.Mar === 3) // true// 那么反过来能取到 Months[3] 的值吗?console.log(Months[3]) // 'Mar'// 所以console.log(Months.Mar === 3) // trueconsole.log(Months[3] === 'Mar') // trueTips:字符串枚举成员不会生成反向映射。枚举类型被编译成一个对象,它包含了正向映射( name -> value)和反向映射( value -> name)。
- 4. 编译库 如果你正在开发一个供其他 Kotlin 应用程序使用的库,那么可以构建 .jar 文件,而不将 Kotlin 运行时包含在其中。kotlinc hello.kt -d hello2.jar可以通过 jar 查看工具来看:相比下面这种运行时方式编译后的产物是不一样的,下面包含一个运行时打包:kotlinc hello.kt -include-runtime -d hello.jar可以通过 jar 查看工具来看:由于以这种方式编译的二进制文件依赖于 Kotlin 运行时,因此无论何时使用编译库,都应确保后者存在于类路径中。还可以使用 kotlin 脚本来运行 Kotlin 编译器生成的二进制文件:kotlin -classpath hello.jar HelloKt # HelloKt 是 Kotlin 编译器为名为 hello.kt 的文件生成的主类名。
apk反编译相关搜索
-
ajax
android
a href
abap
abap开发
abort
absolutelayout
abstractmethoderror
abstracttablemodel
accept
access
access教程
accordion
accumulate
acess
action
actionform
actionlistener
activity
addeventlistener