反编译apk相关知识
-
使用android逆向助手,进行反编译apk,查看apk源码第一步:下载逆向助手第二步:将apk文件拷贝到逆向助手的apktool目录,在逆向助手的apktool目录下按住shift同时点击鼠标右键,选择“在此处打开命令窗口,即CMD”第三步:在cmd命令行中输入命令 apktool d -f 应用程序名,得到以apk名字命名的文件夹,里面可以直接看到res目录下的资源文件和Android的清单文件,但是看不到Java文件第四步:双击打开Android逆向助手.exe,选中“提取dex”操作,然后将libapktool目录下的apk拖动到源文件中;点击“操作”,得到dex文件第五步:选中“dex转jar”操作,然后将得到的dex文件拖动到源文件中;点击“操作”,得到jar文件,jd工具会自动打开jar文件,这样就看到java源码了(如果应用进行了混淆,看到的源码类和方法都是abc等)原文链接:http://www.apkbus.com/blog-930411-77296.html
-
空指针脚本使用1.执行流程 通过apktool反编译apk(输入参数apk路径) 得到反编译后的AndroidManifest.xml文件 通过FindActivity.py得到Activity_List(activity列表) 删除Activity_List中含有不需要调起的activity 运行NullPointer.py,输出log在指定文件夹 手动分析log 2.环境 MacBook Python 2.7 apktool(https://ibotpeaches.github.io/Apktool/install/) 3.遇到的问题 1.只能用启动activity来测试空指针,无法做其他操作,例如传参点击操作 2.activity不允许外部被调用,无法测试 <font
-
浅谈:APK混淆保护解析,如何保护APP应用安全 我们做APP开发的一般都会遇到如何保护应用APK代码的问题。Java APK语言是基于jvm上面,反编译APK源代码很很容易。包括所有的class文件、src文件和jsp文件等等。 到目前为止,对于APK的保护,混淆技术是最为基本的保护方法。JAVA混淆工具也非常多,包括商业的、免费的、开放源代码的,大多是对Class文件进行混淆处理,也有少量工具首先对源代码进行处理,然后再对Class进行处理,这样加大了混淆处理的力度。 目前主要的混淆技术按照混淆目标主要可分为分别为:符号混淆、数据混淆、控制混淆、控制流重组、预防性混淆。对此,小编集中对其进行简单的分析。一、符号混淆 Class文件中有许多与程序执行本身无关的信息,例如变量名称、方法名称,并带有一定的含义,例如某个方法名
-
反编译一个APP就那么简单3分钟傻瓜式反编译一个APP写在前面:最近工作有些忙,一段时间没更新博客了,趁着刚吃完晚饭,来更新一下~前几天,需求上有一个功能没思路,反编译了一下同类型的APP,找到了一个关键类,问题得以解决。网络上有很多比较成熟的文章,不过我个人对于反编译这块,有些需求过剩,不够简单粗暴,所以特来介绍一个方便的工具来进行反编译操作。反编译是为了啥?我们什么时候需要反编译呢?想获得目标APP的资源(图片等)有功能不会写了,参考(copy)一下同类APP某些“羞羞”的事情前两条需求还是蛮常见的,最后一条是开个玩笑,别做坏事就~准备工具onekey decompile apk (一键反编译APK工具)目标APKonekey decompile apk下载链接正确姿势下载工具压缩包多说一句,这个工具集成了三个反编译的工具的功能,一步到位。如果你对这三个工具各自的功能使用感兴趣,自行搜索学习一下。解压到C盘根目录这里强调一下,最好是放在C盘根目录下,放到别的盘反编译可能会失败。我就失败过一次,具体原因是什么不得而知~得到以下文件
反编译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相关搜索
-
face
fade
fadein
fadeout
fadeto
fail
family
fastcgi
fastjson
fault
fclose
fdisk
feed
fetch
ff浏览器
fgets
fields
fieldset
fighting
figure