jadx反编译

article/2025/10/14 20:36:38

刚发现的一个反编译神器jadx,对比之前的apktool跟dex2jar,jadx胜在可读性好太多,apktool后的smali长的跟汇编语言一样,dex2jar产生的源码也经常出现奇奇怪怪的语法,让我理解不能.

jadx GitHub 地址:https://github.com/skylot/jadx

下载或克隆后,在目录下运行

./gradlew dist
结束后会生成build文件夹,我们需要的脚本文件就在build\jadx\bin下;

我们可以命令行运行jadx.bat脚本产生源码:

jadx -d out classes.dex
也可以打开jadx-gui.bat图形化界面查看源码;


图可能看不清,选一个代码量不大的类贴上看

package com.ddfun.a;import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.ddfun.R;
import com.ddfun.activity.MyWebview;
import com.ddfun.model.ActivityBoardBean;
import com.ff.common.c.b;
import java.util.List;public class a extends BaseAdapter {List<ActivityBoardBean> a;public static class a implements OnClickListener {ActivityBoardBean a;TextView b;TextView c;ImageView d;ImageView e;ImageView f;public void a(View view) {this.f = (ImageView) view.findViewById(R.id.icon_iv);this.d = (ImageView) view.findViewById(R.id.hot_iv);this.e = (ImageView) view.findViewById(R.id.new_iv);this.b = (TextView) view.findViewById(2131624086);this.c = (TextView) view.findViewById(R.id.tv_time);view.setTag(this);view.setOnClickListener(this);}public void onClick(View view) {a aVar = (a) view.getTag();view.getContext().startActivity(MyWebview.a(view.getContext(), null, b.a(aVar.a.id), "activityboardtype", aVar.a.title));}}public /* synthetic */ Object getItem(int i) {return a(i);}public View getView(int i, View view, ViewGroup viewGroup) {a aVar;if (view == null) {view = View.inflate(viewGroup.getContext(), R.layout.activity_board_list_item_lay, null);a aVar2 = new a();aVar2.a(view);aVar = aVar2;} else {aVar = (a) view.getTag();}ActivityBoardBean a = a(i);aVar.a = a;aVar.b.setText(a.title);aVar.c.setText(a.publish_date);if (a.isHot()) {if (aVar.d.getVisibility() != 0) {aVar.d.setVisibility(0);}} else if (aVar.d.getVisibility() != 8) {aVar.d.setVisibility(8);}if (a.isNew()) {if (aVar.e.getVisibility() != 0) {aVar.e.setVisibility(0);}} else if (aVar.e.getVisibility() != 8) {aVar.e.setVisibility(8);}com.ff.imgloader.a.a().a(com.ff.imgloader.a.b(a.image), aVar.f, com.ff.imgloader.a.c, com.ff.imgloader.a.c, false);return view;}public void a(List list) {this.a = list;notifyDataSetChanged();}public synchronized boolean b(List list) {boolean z;int i = 0;z = false;while (i < list.size()) {boolean z2;ActivityBoardBean activityBoardBean = (ActivityBoardBean) list.get(i);if (this.a.contains(activityBoardBean)) {z2 = z;} else {this.a.add(activityBoardBean);z2 = true;}i++;z = z2;}if (z) {notifyDataSetChanged();}return z;}public int getCount() {return this.a == null ? 0 : this.a.size();}public ActivityBoardBean a(int i) {return (ActivityBoardBean) this.a.get(i);}public long getItemId(int i) {return 0;}
}


大家可以看到,可读性是不是非常高,这还是在代码混淆的情况下.我们不开启代码混淆来看看:



package com.ddfun.adapter;import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.ddfun.R;
import com.ddfun.activity.MyWebview;
import com.ddfun.model.ActivityBoardBean;
import com.ff.common.http.MyHttpClient;
import com.ff.imgloader.ImageLoader;
import java.util.List;public class ActivityBoardListAdapter extends BaseAdapter {List<ActivityBoardBean> list;public static class Holder implements OnClickListener {ImageView hot_iv;ImageView icon_iv;ActivityBoardBean item;TextView name_tv;ImageView new_iv;TextView tv_time;public void initView(View v) {this.icon_iv = (ImageView) v.findViewById(R.id.icon_iv);this.hot_iv = (ImageView) v.findViewById(R.id.hot_iv);this.new_iv = (ImageView) v.findViewById(R.id.new_iv);this.name_tv = (TextView) v.findViewById(2131624086);this.tv_time = (TextView) v.findViewById(R.id.tv_time);v.setTag(this);v.setOnClickListener(this);}public void onClick(View v) {Holder holder = (Holder) v.getTag();v.getContext().startActivity(MyWebview.getStartIntent(v.getContext(), null, MyHttpClient.getActivityBoardUrl(holder.item.id), MyWebview.ACTIVITYBOARDTYPE, holder.item.title));}}public View getView(int position, View convertView, ViewGroup parent) {Holder holder;if (convertView == null) {convertView = View.inflate(parent.getContext(), R.layout.activity_board_list_item_lay, null);holder = new Holder();holder.initView(convertView);} else {holder = (Holder) convertView.getTag();}ActivityBoardBean item = getItem(position);holder.item = item;holder.name_tv.setText(item.title);holder.tv_time.setText(item.publish_date);if (item.isHot()) {if (holder.hot_iv.getVisibility() != 0) {holder.hot_iv.setVisibility(0);}} else if (holder.hot_iv.getVisibility() != 8) {holder.hot_iv.setVisibility(8);}if (item.isNew()) {if (holder.new_iv.getVisibility() != 0) {holder.new_iv.setVisibility(0);}} else if (holder.new_iv.getVisibility() != 8) {holder.new_iv.setVisibility(8);}ImageLoader.getInstance().loadIcon(ImageLoader.getPrefixedUrl(item.image), holder.icon_iv, ImageLoader.PREVIEWPICSIZE, ImageLoader.PREVIEWPICSIZE, false);return convertView;}public void setData(List l) {this.list = l;notifyDataSetChanged();}public synchronized boolean addData(List l) {boolean needNotify;needNotify = false;for (int i = 0; i < l.size(); i++) {ActivityBoardBean bean = (ActivityBoardBean) l.get(i);if (!this.list.contains(bean)) {this.list.add(bean);needNotify = true;}}if (needNotify) {notifyDataSetChanged();}return needNotify;}public int getCount() {return this.list == null ? 0 : this.list.size();}public ActivityBoardBean getItem(int position) {return (ActivityBoardBean) this.list.get(position);}public long getItemId(int position) {return 0;}
}


这个图截的是跟图一同一个类,我用txt打开的.大家可以看到,是不是跟源码基本一样了,以后可以选择apktool+jadx来使用,apktool反编译资源文件,清单文件;jadx反编译代码.


http://chatgpt.dhexx.cn/article/3eAc6t9W.shtml

相关文章

新版jadx-gui导入dex会提示Bad checksum

新版jadx-gui导入dex会提示Bad checksum 问题解决方案 问题 今天将一个app脱壳后&#xff0c;拿到DEX&#xff0c;导入jadx中时&#xff0c;弹出了一个错误 也就是会校验dex的checksum&#xff0c;此时如果关闭按钮&#xff0c;忽略错误&#xff0c;会导致dex文件反编译失败&…

jadx学习记录01

原计划是先学习 okHttp 和拦截器&#xff0c;再用 Android Studio 来 demo 下&#xff0c;奈何 Android Studio 装完 sync 一直失败&#xff0c;后续换个电脑再试下、一并整理 okHttp 相关知识点。 今日任务&#xff1a;用 jadx 分析小红书 6.90 版本的 java 代码&#xff0c;…

【Android】Jadx动态调试应用

【Android】Jadx动态调试应用 1. 前言 Jadx已支持动态调试APP&#xff0c;但一直没试过&#xff0c;从逆向角度尝试走一遍流程并熟悉&#xff0c;方便日后翻阅。 2. 相关知识 2.1 动态调试原理 动态调试的原理可以概括为以下几个步骤&#xff1a; 启动应用程序进程&#x…

移动安全工具-jadx

1 需求 官网链接&#xff1a; GitHub - skylot/jadx: Dex to Java decompiler 2 语法 jadx - dex to java decompiler, version: 1.4.5usage: jadx [options] <input files> (.apk, .dex, .jar, .class, .smali, .zip, .aar, .arsc, .aab) options:-d, --output-dir …

jadx反编译工具的使用

目录 jadx工具介绍 jadx工具的安装 jadx工具的使用 jadx遇到的问题 jdk和jre的区别 jadx工具介绍 decompile Dalvik bytecode to java classes from APK, dex, aar, aab and zip files将Dalvik 字节码从APK&#xff0c;dex,aar,aab&#xff0c;zip文件里反编译为java类de…

Android 反编译利器,jadx 的高级技巧

一、前言 今天介绍一个非常好用的反编译的工具 jadx(Java,Dex反编译器) 。jadx 的功能非常的强大&#xff0c;对我而言&#xff0c;基本上满足日常反编译需求。 jadx 优点&#xff1a; 图形化的界面。拖拽式的操作。反编译输出 Java 代码。导出 Gradle 工程。 这些优点都让…

app逆向(11)| jadx反编译工具的安装

文章目录 一、什么是jadx二、安装一、什么是jadx JADX是一款优秀的Android反编译工具,支持命令行和图形化界面,能为我们省下大量的反编译时间。 二、安装 前提首先需要安装java的jdkjadx的github地址:https://github.com/skylot/jadx 进入,下载压缩包。 解压压缩包后,…

jadx:好用的反编译工具

最近换了新公司&#xff0c;新公司比较高大上都是用的mac电脑开发Android&#xff0c;让我这个window党情何以堪&#xff0c; 任务&#xff1a;我的导师给了我们的一个开发的apk&#xff0c;他让我看打包混淆了没&#xff0c;我就翻一下我以前的工具&#xff0c;尼玛&#xff…

Android反编译——jadx工具

Android反编译工具——jadx 介绍反编译jar包反编译apk文件jadx下载jadx使用反编译文件搜索功能查看类、变量或者方法使用情况添加注释反混淆 本篇博文为转载原创作者公众号&#xff1a;JavaGuide 介绍 jadx 是一款功能强大的反编译工具&#xff0c;使用起来简单方便&#xff08…

决策树原理总结(ID3、C4.5、CART)+ 常见面试问题

系统梳理树类型算法原理加常见面试问题 类容按照决策树、Adaboost、GBDT、XGBoost、LightGBM 顺序进行梳理 本次的重点类容是决策树的CART树 ID3、C4.5介绍请转移到&#xff1a;ID3、C4.5的原理与案例介绍 1. CART树 ID3与C4.5虽然可以通过多叉树尽可能的挖掘特征信息&#…

机器学习之决策树算法

1-1 基本流程 决策树是一个有监督分类与回归算法。 决策树的生成只考虑局部最优&#xff0c;相对的&#xff0c;决策树剪枝则考虑全局最优。 一、概念&#xff1a; 决策树&#xff1a;是一种树形结构&#xff0c;其中每个内部节点表示一个属性上的判断&#xff0c;每个分支代表…

决策树挑出好西瓜

一、决策树 1、基本介绍 决策树&#xff08;decision tree&#xff09;是一种基本的分类与回归方法。其主要算法有&#xff1a;ID3、C4.5、CART。以及进化后的C4.5算法C5.0、分类有极大提升的Tsallis等算法。这些算法的区别就在于选择最优特征的方式。但C5.0的核心原理与C4.5…

1.决策树C4.5算法

文章目录 一、概述二、改进表现三、优缺点四、决策树1.特征选择2.决策树的生成3.决策树的剪枝 一、概述 C4.5是一系列用在机器学习和数据挖掘的分类问题中的算法。它的目标是监督学习&#xff1a;给定一个数据集&#xff0c;其中的每一个元组都能用一组属性值来描述&#xff0c…

python实现三种经典决策树算法

决策树实现ID3、C4.5、CART算法 Author: 浅若清风cyfDate: 2020/12/15 一、创建数据集 手动 def createDataSet():"""创建测试的数据集:return:"""dataSet [# 1[青绿, 蜷缩, 浊响, 清晰, 凹陷, 硬滑, 好瓜],# 2[乌黑, 蜷缩, 沉闷, 清晰, 凹…

数据挖掘--决策树C4.5算法(例题)

C4.5算法与ID3算法的不同点&#xff1a; &#xff08;1&#xff09;分支指标采用增益比例 &#xff08;2&#xff09;数值属性的处理 &#xff08;3&#xff09;处理缺少属性值的训练样本 &#xff08;4&#xff09;使用K次迭代交叉验证&#xff0c;评估模型的优劣程度&#xf…

决策树算法总结(上:ID3,C4.5决策树)

文章目录 一、决策树原理1.1 决策树简介1.2 基本概念 二、数学知识2.1 信息熵2.2 条件熵:2.3 信息增益 三、ID3决策树3.1 特征选择3.2 算法思路3.3 算法不足 四、C4.5决策树算法4.1 处理连续特征4.2 C4.5决策树特征选取4.3 处理缺失值4.4 过拟合问题 五、决策树C4.5算法的不足 …

决策树分类算法的案例(代码实现及运行测试)

1 案例需求 我们的任务就是训练一个决策树分类器&#xff0c;输入身高和体重&#xff0c;分类器能给出这个人是胖子还是瘦子。 所用的训练数据如下&#xff0c;这个数据一共有10个样本&#xff0c;每个样本有2个属性&#xff0c;分别为身高和体重&#xff0c;第三列为类别标签…

决策树cart算法实战

1、使用决策树预测隐形眼镜类型&#xff0c;隐形眼镜数据集(lenses.csv)是非常著名的数据集&#xff0c;它包含很多患者眼部状况的观察 条件以及医生推荐的隐形眼镜类型。隐形眼镜类型包括硬材质、软材质以及不适合佩戴隐形眼镜。 要求&#xff1a;读取lenses.csv中的隐形眼镜数…

人工智能决策树大作业

人工智能技术: 机器学习之决策树大作业 以西瓜集 2.0 为建模数据&#xff0c;采用交叉验证方法进行数据训练集和验证集的划分&#xff0c;实现决策树 “预剪枝”算法&#xff0c;要求:尽可能充分利用有限的西瓜集 2.0 数据所提供信息&#xff0c;建立泛化能力强的 决策树模型。…