有的安卓程序反编译后是samli文件,这是程序员直接用smali语言写的,还是是用java写的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有的安卓程序反编译后是samli文件,这是程序员直接用smali语言写的,还是是用java写的?相关的知识,希望对你有一定的参考价值。

有的安卓程序反编译后是samli文件,这是程序员直接用smali语言写的,还是是用java写的?为了防止反编译而把Java翻译成smali的?

您好,
1、原始类型:
v void 只能用于返回值类型
Z boolean
B byte
S short
C char
I int
J long(64位)
F float
D double(64位)
对象类型:
Lpackage/name/ObjectName相当于java中的package.name.ObjectName解释如下:
L:表示这是一个对象类型
package/name:该对象所在的包
;:表示对象名称的结束
数组的表示形式:
[I :表示一个整形的一维数组,相当于java的int[];
对于多维数组,只要增加[ 就行了,[[I = int[][];注:每一维最多255个;
对象数组的表示形式:
[Ljava/lang/String 表示一个String的对象数组;
方法的表示形式:
Lpackage/name/ObjectName;——>methodName(III)Z 详解如下:
Lpackage/name/ObjectName 表示类型
methodName 表示方法名
字段的表示形式:
Lpackage/name/ObjectName;——>FieldName:Ljava/lang/String;
即表示: 包名,字段名和各字段类型
方法的传参:
当一个方法被调用的时候,方法的参数被置于最后N个寄存器中;
例如,一个方法有2个参数,5个寄存器(v0~v4)
那么,参数将置于最后2个寄存器(v3和v4)
非静态方法中的第一个参数总是调用该方法的对象;
说明:对于静态方法除了没有隐含的this参数外,其他都一样
寄存器的命名方式:
V命名
P命名 第一个寄存器就是方法中的第一个参数寄存器
比较:使用P命名是为了防止以后如果在方法中增加寄存器,需要对参数寄存器重新进行编号的缺点:
特别说明一下:Long和Double类型是64位的,需要2个寄存器

例如:对于非静态方法
LMyObject——>myMethod(IJZ)V;
有4个参数:LMyObject,int,long,bool; 需要5个寄存器来存储参数;
P0 this
P1 I (int)
P2,P3 J (long)
P4 Z(bool)追问

什么意思啊?没看懂,能直面回答我的问题吗?

参考技术A android代码(基于java)写的。smali类似机器语言。反编译出来的是机器语言

安卓应用反编译-APK包反编译

第二章 APK包反编译

被编译器处理过的代码和资源已经打包成了APK,有的甚至被转化成了二进制文件。但是我们也有一些方法,把这些编译过的内容给变回原来的样子,这个过程叫做-反编译。

技术分享

反编译分为两个部分:一个是资源文件,一个是java文件。so文件是c++编译的结果,可以认为是不可反编译的(反编译成汇编指令,估计大部分人也看不懂)。

2.1 反编译资源文件

APK tool是反编译的有力工具,据说是谷歌提供的官方的反编译工具,可以把APK目录解包,资源文件全部还原成编译前的样子,而dex文件反编译成smail格式的文件(而不是我们希望的java原文件)。smail格式文件是安卓系统的虚拟机执行时使用的语法,我们不会去讲解这部分内容。

2.1.1 工具准备

  1. APK tool的官网下载APKTool的最新版本;
技术分享

2. 在官网下载与`APKTool`配套的[脚本文件-apktool.bat](https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/windows/apktool.bat),其内容如下;

@echo off
if "%PATH_BASE%" == "" set PATH_BASE=%PATH%
set PATH=%CD%;%PATH_BASE%;
java -jar -Duser.language=en "%~dp0\apktool.jar" %1 %2 %3 %4 %5 %6 %7 %8 %9

不过该脚本有一个小小的问题-需要去掉apktool.jar前面的一个\;下载完成后用文本编辑器打开该脚本,将这一段修改成,

@echo off
if "%PATH_BASE%" == "" set PATH_BASE=%PATH%
set PATH=%CD%;%PATH_BASE%;
java -jar -Duser.language=en "%~dp0apktool.jar" %1 %2 %3 %4 %5 %6 %7 %8 %9

3. 将下载的APKTool压缩包解压,与脚本文件一起放到你希望存放的目录下,例如`D:\Work\apktool`;

技术分享

4. 为了使用方便,将存放目录加入到系统的环境变量中; `我的电脑`点击右键->`属性`->`高级系统设置`->`环境变量`,选中`Path`这一项,进行编辑;

技术分享
在编辑栏最后输入apktool所在的路径`D:\Work\apktool`;如果该项之前还有别的路径,请用`;`分隔开;
技术分享

5. 启动`cmd命令行窗口`,输入`apktool -version`,如果看到类似如下内容就说明安装成功了;

$ apktool -version
2.0.3

至此,APKTool就安装并设置完成了。
如果无法访问官网下载,请上安豆网,下载最新的版本。

2.2.2 反编译资源

接下来开始使用APKTool,


1. 启动cmd命令行窗口


2. 假设apk放在D:\Test.apk目录,输入apktool d D:\Test.apk,开始反编译Test.apk`;

$ apktool d D:\Test.apk
I: Using Apktool 2.0.3 on Test.apk 
I: Loading resource table... 
I: Decoding AndroidManifest.xml with resources... 
I: Loading resource table from file: C:\Users\Gym\apktool\framework\1.apk 
I: Regular manifest package... 
I: Decoding file-resources... 
I: Decoding values */* XMLs... 
I: Baksmaling classes.dex... 
I: Copying assets and libs... 
I: Copying unknown files... 
I: Copying original files... 


3. 编译的结果就在cmd命令行窗口启动的位置下,反编译的目录结构如下,

技术分享

现在打开res目录下的资源都被还原了,打开后就能看到原始的设计;而java源码被反编译成了smli格式的文件。

##2.3 反编译java源代码 要查看java源码,有三个方式: 1. 把dex文件转换成smail文件,然后用专门的工具将smail翻译成java; 2. 把dex文件转换成java的通用编译格式class文件,然后用专门的工具将class翻译成java; 3. 把dex文件转换成jar文件,然后用专门的工具将jar翻译成java; 这里我们采用第三种方法。 ### 2.3.1 工具准备 首先准备反编译用的工具。

1. 在官网下载[dex2jar](http://sourceforge.net/projects/dex2jar/files/)工具,它可以把APK中的dex文件转化成jar文件;

2. 下载完成后,将压缩包解压,放到你希望存放的目录下,例如`D:\Work\dex2jar`;

技术分享

3. 为了使用方便,将存放目录加入到系统的环境变量中;

技术分享

4. 在官网下载[JD-GUI](http://jd.benow.ca/),它可以查看jar文件的java源码;

5. 下载完成后,将压缩包解压,放到你希望存放的目录下,例如`D:\Work\jd-gui`;

技术分享
至此,java源码的反编译工具就安装并设置完成了。 如果无法访问官网下载,请上[安豆网](http://anddle.com/resource)下载,那里将这几个工具整体打包,方便大家使用。 ###2.3.2 反编译代码 接下来开始使用反编译工具,

1. 解压APK文件,找到Android软件安装包中的`class.dex`;

2. 用dex2jar工具将classes.dex生成jar文件;启动`cmd命令行窗口`,输入`d2j-dex2jar D:\classes.dex`,开始反编译`classes.dex`,`d2j-dex2jar`后面需要跟上要反编译的dex文件路径;

$ d2j-dex2jar D:\classes.dex 
dex2jar classes.dex -> .\classes-dex2jar.jar 

结果生成了classes-dex2jar.jar文件;


3. 进入JD-GUI目录,运行JD-GUI工具,打开上面的生成的jar文件,即可看到java源代码。

技术分享








以上是关于有的安卓程序反编译后是samli文件,这是程序员直接用smali语言写的,还是是用java写的?的主要内容,如果未能解决你的问题,请参考以下文章

安卓apk反编译修改重新打包签名全过程

apk是啥文件,Android文件中怎么反编译

简直是鬼畜神作《达拉崩吧》程序员版;安卓8.1曝严重bug;Avast开源机器码反编译器RetDec;Ruby 2.3.6发布

小程序反编译

问一下高手 c++dll文件如何反编译 看源代码啊????

我学习安卓XML文件修改,请问AXMLPrinter2.jar这个反编译XML的工具怎么使用?