赞
踩
本文目标:
版本:Android Studio Dolphin | 2021.3.1 Patch 1
一个集成了jadx-gui的AndroidStudio/IDEA
插件。
优点:dex2jar&jd-gui
的结合体,使用更方便。
Android apk文件逆向工具。
https://ibotpeaches.github.io/Apktool/
Dex 到 Java 反编译器,用于从 Android Dex 和 Apk 文件生成 Java 源代码的命令行和 GUI 工具。
优点:dex2jar&jd-gui的结合体,有这一个就够了。
缺点:没有mac的可执行程序。
https://github.com/skylot/jadx
此应用程序用于查看设备中应用程序使用的第三方库。它可以查看应用程序本机库的ABI体系结构(通常,无论应用程序是64位还是32位)。它还可以查看由The Rule Repository标记的知名库,甚至可以根据库引用的数量对它们进行排序和查看。
非常好用的Android端app分析软件,主要可以用来分析app的基本结构,查看包名等。
https://github.com/LibChecker/LibChecker
把dex文件反编译成jar文件。
https://github.com/pxb1988/dex2jar
查看jar源码的可执行程序。
http://java-decompiler.github.io/
mac可执行程序在m1上无法运行,可参考:Mac上打不开JD-GUI解决办法
可以将java&kotlin代码转为smali的AndroidStudio/IDEA
插件。
似乎是只能将纯java&kotlin代码编译成smali,据说AndroidX代码会报错,我自己编译Activity也报错了。
smali2java是一个将smali代码反编译成java代码的工具。
缺点:没有找到可用mac版本。
http://www.hensence.com/cn/smali2java/
java转smali,smali转java工具。
缺点:没有找到可用mac版本。
http://lzonel.cn/3056.html
在AndroidStudio中双击一个apk,打开查看apk内的详情,也可以直接用压缩软件解压。
其中:
反编译apk的核心工具apktool。
一个逆向工程第三方,封闭,二进制Android应用程序的工具。
它可以将资源解码为接近原始的形式,并在进行一些修改后重新构建它们。
它还使应用程序的工作更容易,因为项目,如文件结构和自动化的一些重复性任务,如构建apk等。
dex作为包含程序代码的文件,Android程序的启动运行都是通过类加载器ClassLoader读取dex中的代码运作的。
因此如何修改dex中的代码是反编译的关键所在,而apktool可以将dex反编译成smali文件,我们通过修改smali文件完成“目标”。
因此反编译的大致流程是:
Smali,Baksmali分别是指安卓系统里的Java虚拟机(Dalvik)所使用的一种.dex格式文件的汇编器,反汇编器。
其语法是一种宽松式的Jasmin/dedexer语法,而且它实现了.dex格式所有功能(注解,调试信息,线路信息等)。
修改Smali有三种方式:
由于我不会smali语法,也没有找到适合mac的smali转换工具,因此采用上述第三种修改Smali的方式。
首先自己打包一个未混淆&未加固的apk作为目标apk。
在AndroidStudio打开目标apk,打开AndroidManifest.xml
,读取包名&启动Activity。
如上图可知:
包名为:com.demon.demonnewest
启动Activity为:com.demon.demonnewest.module.StartActivity
添加测试代码:
TestActivity.kt
package com.demon.demonnewest import android.content.Intent import android.os.Bundle import android.widget.Button import android.widget.LinearLayout import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity class TestActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val layout = LinearLayout(this) layout.orientation = LinearLayout.VERTICAL val text = TextView(this) val button = Button(this) button.text = "Click" layout.addView(text) layout.addView(button) setContentView(layout) val sb: StringBuilder = StringBuilder() sb.append("TestActivity\n") intent.extras?.run { keySet().forEach { sb.append("$it=${get(it)}\n") } } text.text = sb.toString() button.setOnClickListener { Toast.makeText(this@TestActivity,"Button~",Toast.LENGTH_SHORT).show() startActivity(Intent(this@TestActivity, TestJavaActivity::class.java)) } } }
TestJavaActivity.java
package com.demon.demonnewest; import android.os.Bundle; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; public class TestJavaActivity extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText("TestJavaActivity"); Button btn = new Button(this); btn.setOnClickListener(view -> Toast.makeText(TestJavaActivity.this,"Button~",Toast.LENGTH_SHORT).show()); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.addView(tv); layout.addView(btn); setContentView(layout); } }
直接gradle---Tasks---other---assembleDebug
双击运行,打debug包。
然后在app/build/outputs/apk/debug/app-debug.apk
找到打包后的apk。
命令行执行apktool d app-debug.apk
反编译,找到需要添加的smali。
得到反编译后的app文件夹。
apktool d app.apk
编辑器直接打开修改即可。
//...
//修改启动Activty为TestActivity
<activity android:exported="true" android:name="com.demon.demonnewest.TestActivity" android:theme="@style/Theme.Start">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
//添加TestJavaActivity
<activity android:name="com.demon.demonnewest.TestJavaActivity"/>
//...
将第三步中我们新增加代码后得到smali复制到smali_classes文件夹中。
随便找一个包含目标包名:com.demon.demonnewest
的目录即可。
如下指令将修改后的反编译文件夹,编译成new.apk。
apktool b app -o new.apk
得到的apk是未签名的是无法安装的,需要签名。
不推荐使用旧版的jarsigner进行签名,只能进行v1签名,高版本手机可能无法安装。
新版的v1&v2 签名工具apksigner在版本>25的SDK\build-tools\中。
//windows
java -jar apksigner.jar sign --ks 你的密钥 --ks-key-alias 别名 --ks-pass pass:密钥密码 --key-pass pass:别名密码 --out 签名后的apk路径 待签名的apk
//mac
./apksigner sign --ks 你的密钥 --ks-key-alias 别名 --ks-pass pass:密钥密码 --key-pass pass:别名密码 --out 签名后的apk路径 待签名的apk
安装后启动app,启动页已经正常替换,按钮可以正常跳转,初步反编译实践成功。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。