Android 反编译 .vdex、.odex、.dex 文件

准备环境

1.下载baksmali-2.5.2.jar和smali-2.5.2.jar,baksmali用来反编译odex文件,smali用于将odex文件反编译生成的smali文件,重新打包成dex文件,下载链接:
https://bitbucket.org/JesusFreke/smali/downloads/

2.下载dex2jar-2.0,用于将dex文件编译成jar文件(可以下载dex-tools-2.1和dex2jar-2.0 两个版本),github地址:
https://github.com/pxb1988/dex2jar

3.下载jd-gui.exe,用于查看java代码:
https://github.com/java-decompiler/jd-gui

反编译.odex文件

1.新建文件夹,把baksmali、smali文件连同dex文件和vdex文件放在同一个文件内,odex和vdex文件名字要保持一致。
在这里插入图片描述
2.使用baksmali反编译odex文件,反编译命令:java -jar baksmali-2.5.2.jar d SystemUI.odex
执行此命令后会在当前文件夹内生成一个名为out的文件夹,此文件内即反编译生成的smali文件,如图所示:
在这里插入图片描述在这里插入图片描述
3.使用smali将上一步生成的文件重新打包成dex文件,打包命令:java -jar smali-2.5.2.jar a out,执行
此命令后会生成名为out.dex的文件,如图所示:
在这里插入图片描述

反编译.dex文件

4.将上一步生成的out.dex文件拷贝到dex2jar-2.0文件夹下(dex2jar-2.0压缩包解压后的文件夹),
执行命令:d2j-dex2jar.bat out.dex,会生成out-dex2jar.jar和out-error.zip文件,至此反编译完成,如图所示:
在这里插入图片描述
5.双击打开下载好的jd-gui.exe,打开上一步生成的out-dex2jar.jar文件,即可查阅java源码:
在这里插入图片描述

反编译.vdex文件

1.反编译.vdex文件需要利用vdexExtractor工具,下载地址:
https://github.com/anestisb/vdexExtractor
安装及使用参照:https://blog.csdn.net/Alexwym/article/details/107730906

安装编译vdexExtractor根据上面链接的安装提示如图:
在这里插入图片描述
在这里插入图片描述

2.将.vdex文件转为.dex文件
进入vdexExtractor工具的bin目录下,执行./vdexExtractor.exe -i xxx.vdex或./vdexExtractor.exe -i xxx.vdex -o ./ 指令。便可在当前目录下生成相应的dex文件如图:
在这里插入图片描述

在这里插入图片描述

3.注意:某些.vdex 可能会报错,需要在后面添加, --ignore-crc-error,反编译Dex 忽略CRC错误
在这里插入图片描述
4. 参考上面反编译.dex文件

Tips

1.如果baksmali.jar 其他版本的包,可能使用方法不同,请help。
2.dex转jar的时候dex2jar-2.0 版本可能不支持版本,换成dex-tools-2.1,如图:
在这里插入图片描述



如果本文有帮到你,记得点赞加关注哦

参考:
https://blog.csdn.net/sj18624326200/article/details/111286047
https://blog.csdn.net/qq_32072451/article/details/86626004
https://blog.csdn.net/Alexwym/article/details/107730906

以下是用51单片机连接共阴极8位数码管显示数字时钟的基本代码,仅供参考: ```c #include <reg51.h> #define uchar unsigned char #define uint unsigned int uchar code table[] = { // 共阴极8位数码管显示0~9的编码值 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; uchar hour = 0; // 小时数 uchar minute = 0; // 分钟数 uchar second = 0; // 秒数 void delay(uint t) { // 延时函数 uint i, j; for (i = t; i > 0; i--) for (j = 110; j > 0; j--); } void display(uchar *p) { // 数码管显示函数 uchar i; for (i = 0; i < 8; i++) { // 8位数码管循环显示 P2 = 0xff; // 关闭数码管 P0 = p[i]; // 设置要显示的数字 P2 = ~(1 << i); // 打开对应的数码管 delay(1); // 延时1ms } } void main() { TMOD = 0x01; // 定时器0工作方式1,16位计数器模式 TH0 = 0x4c; // 定时器初值,1ms定时 TL0 = 0x00; EA = 1; // 开启总中断 ET0 = 1; // 开启定时器0中断 TR0 = 1; // 开启定时器0 while (1) { // 主循环 uchar p[8]; p[0] = table[hour / 10]; // 显示小时的十位数字 p[1] = table[hour % 10]; // 显示小时的个位数字 p[2] = 0x40; // 显示冒号 p[3] = table[minute / 10]; // 显示分钟的十位数字 p[4] = table[minute % 10]; // 显示分钟的个位数字 p[5] = 0x40; // 显示冒号 p[6] = table[second / 10]; // 显示秒的十位数字 p[7] = table[second % 10]; // 显示秒的个位数字 display(p); // 数码管显示 } } void timer0() interrupt 1 { // 定时器0中断服务函数 TH0 = 0x4c; TL0 = 0x00; second++; // 秒数加1 if (second == 60) { // 如果秒数达到60 second = 0; // 秒数清零 minute++; // 分钟数加1 if (minute == 60) { // 如果分钟数达到60 minute = 0; // 分钟数清零 hour++; // 小时数加1 if (hour == 24) // 如果小时数达到24 hour = 0; // 小时数清零 } } } ``` 注意:以上代码仅供参考,具体实现方式可能因人而异。同时,为了保证代码的正确性和可靠性,建议在编写代码时仔细思考和测试。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值