Top Related Projects
Tools to work with android .dex and java .class files
Dex to Java decompiler
Virtual Engine for Android(Support 14.0 in business version)
A Java 8+ Jar & Android APK Reverse Engineering Suite (Decompiler, Editor, Debugger & More)
Quick Overview
Smali is an assembler/disassembler for the dex format used by Android's Java VM implementation. It provides a human-readable representation of Android's DEX format, allowing developers to analyze, modify, and reassemble Android applications at the bytecode level.
Pros
- Enables reverse engineering and analysis of Android applications
- Supports both disassembly and assembly of DEX files
- Integrates well with other Android development and security tools
- Actively maintained and regularly updated
Cons
- Steep learning curve for those unfamiliar with bytecode and assembly
- Can be time-consuming for large applications
- Potential for misuse in malicious activities
- Limited documentation for advanced features
Code Examples
# Example 1: Basic method declaration
.method public static main([Ljava/lang/String;)V
.registers 2
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
const-string v1, "Hello, World!"
invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
return-void
.end method
This example shows a basic Smali method declaration for a "Hello, World!" program.
# Example 2: Conditional branching
if-eqz v0, :cond_a
const/4 v0, 0x1
goto :goto_b
:cond_a
const/4 v0, 0x0
:goto_b
return v0
This snippet demonstrates conditional branching in Smali, checking if a register is zero and setting a value accordingly.
# Example 3: Invoking a method
invoke-virtual {p0, v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
This example shows how to invoke a virtual method (setText) on an Android TextView object.
Getting Started
To get started with Smali:
-
Clone the repository:
git clone https://github.com/JesusFreke/smali.git
-
Build the project:
./gradlew build
-
Use the baksmali tool to disassemble a DEX file:
java -jar baksmali-2.5.2.jar d path/to/classes.dex -o output_directory
-
Use the smali tool to assemble Smali files back into a DEX file:
java -jar smali-2.5.2.jar a output_directory -o classes.dex
For more detailed instructions and advanced usage, refer to the project's README and wiki on GitHub.
Competitor Comparisons
Tools to work with android .dex and java .class files
Pros of dex2jar
- Provides a more comprehensive toolset for working with Android DEX and Java class files
- Offers additional functionality like converting DEX to JAR and vice versa
- Generally easier to use for beginners due to its straightforward command-line interface
Cons of dex2jar
- Less actively maintained compared to smali
- May produce less accurate results in some cases, especially with complex obfuscated code
- Limited support for newer Android features and optimizations
Code Comparison
smali:
.method public static main([Ljava/lang/String;)V
.registers 2
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
const-string v1, "Hello, World!"
invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
return-void
.end method
dex2jar (decompiled Java):
public static void main(String[] args) {
System.out.println("Hello, World!");
}
Both tools serve different purposes in Android reverse engineering. smali focuses on assembly-like representation of DEX bytecode, while dex2jar aims to convert DEX to Java bytecode for further analysis. The choice between them depends on the specific requirements of the reverse engineering task at hand.
Dex to Java decompiler
Pros of jadx
- Provides a user-friendly GUI for decompiling and analyzing Android apps
- Generates more readable Java source code from DEX and APK files
- Supports direct APK decompilation without intermediate steps
Cons of jadx
- May struggle with heavily obfuscated code or complex applications
- Less suitable for low-level bytecode analysis compared to smali
Code Comparison
smali:
.method public onCreate(Landroid/os/Bundle;)V
.locals 1
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
const v0, 0x7f030001
invoke-virtual {p0, v0}, Lcom/example/MainActivity;->setContentView(I)V
return-void
.end method
jadx (decompiled Java):
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
The smali code represents low-level bytecode, while jadx produces more readable Java source code. smali is better suited for detailed bytecode analysis, whereas jadx provides a higher-level view of the decompiled code, making it easier to understand the overall structure and logic of the application.
Virtual Engine for Android(Support 14.0 in business version)
Pros of VirtualApp
- Provides a complete virtual environment for running Android apps
- Supports multi-app management and isolation
- Offers more advanced features for app virtualization and sandboxing
Cons of VirtualApp
- More complex to set up and use compared to Smali
- May have compatibility issues with certain Android versions or devices
- Requires deeper understanding of Android internals for effective use
Code Comparison
VirtualApp (Java):
@Override
public void onCreate() {
super.onCreate();
VirtualCore.get().setInitializer(new VirtualCore.VirtualInitializer() {
@Override
public void onMainProcess() {
// Main process initialization
}
});
}
Smali (Smali assembly):
.method public onCreate()V
.locals 0
.prologue
invoke-super {p0}, Landroid/app/Application;->onCreate()V
return-void
.end method
Summary
VirtualApp is a more comprehensive solution for app virtualization and management, offering advanced features for running multiple apps in isolated environments. Smali, on the other hand, is a disassembler and assembler for Android's dex format, primarily used for reverse engineering and modifying Android apps at a lower level. While VirtualApp provides a higher-level abstraction for app management, Smali offers more granular control over bytecode manipulation.
A Java 8+ Jar & Android APK Reverse Engineering Suite (Decompiler, Editor, Debugger & More)
Pros of bytecode-viewer
- Graphical user interface for easier navigation and analysis
- Supports multiple decompilers and disassemblers
- Includes additional features like searching and code analysis tools
Cons of bytecode-viewer
- Larger file size and resource requirements
- May have a steeper learning curve for new users
- Potentially slower for quick, command-line based tasks
Code Comparison
smali:
.class public Lcom/example/MyClass;
.super Ljava/lang/Object;
.method public constructor <init>()V
.registers 1
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
bytecode-viewer:
public class com.example.MyClass {
public com.example.MyClass() {
super();
}
}
While smali provides a low-level representation of the bytecode, bytecode-viewer offers a decompiled Java view, making it easier to understand the original source code structure. However, smali's representation is closer to the actual bytecode, which can be beneficial for certain analysis tasks.
Both tools serve different purposes in the realm of Android app analysis and reverse engineering. smali is more focused on direct bytecode manipulation, while bytecode-viewer provides a comprehensive suite of tools for code analysis and visualization.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
About
smali/baksmali is an assembler/disassembler for the dex format used by dalvik, Android's Java VM implementation. The syntax is loosely based on Jasmin's/dedexer's syntax, and supports the full functionality of the dex format (annotations, debug info, line info, etc.)
Downloads are at https://bitbucket.org/JesusFreke/smali/downloads/. If you are interested in submitting a patch, feel free to send me a pull request here.
See the wiki for more info/news/release notes/etc.
Support
- github Issue tracker - For any bugs/issues/feature requests
- #smali on freenode - Free free to drop by and ask a question. Don't expect an instant response, but if you hang around someone will respond.
Some useful links for getting started with smali
Top Related Projects
Tools to work with android .dex and java .class files
Dex to Java decompiler
Virtual Engine for Android(Support 14.0 in business version)
A Java 8+ Jar & Android APK Reverse Engineering Suite (Decompiler, Editor, Debugger & More)
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot