1 .dalvik字节码
1 dalvik寄存器:
- 32位: 所有寄存器
- 64位: 使用两个相邻的寄存器
2 寄存器的命名法:
v
: 局部变量寄存器v0-vn
参数寄存器:vn-vn+m
p
: 参数寄存器p0-pn
变量寄存器v0-vn
第一种
[]2
第二种
[]4
3 dex文件反汇编工具
.java
编译成.class
再编译成 <code>.dex
最后编译得到 smali文件
.java -> .class -> .dex -> smali
-
dx.jar
:.class
打包成.dex
dx –dex –output=Decrypt.dex com/yijinda/demo/Decrypt.class
-
baksmali.jar
:.dex
反编译成smali
文件java -jar baksmali.jar -o smali_out/classes.dex
-
smali.jar
:smali
打包成.dex
java -jar smali.jar -o smali_out/classes.dex
4 dalvik字节码类型
基础类型
Dalvik 类型 | java类型 |
---|---|
B | byte |
C | char |
S | short |
I | int |
J | long |
F | float |
D | double |
Z | boolean |
V | void |
L | java类类型 |
[ | 数组类型 |
字段
//字段
Lpackage/name/ObjectName;->FieldName:Ljava/lang/String
//字段格式
类型 (包名类名 /路径);->字段名称:字段类型;
方法
//方法
Lpackage/name/ObjectName;->MethodName(III)Z
(III)Z: 这部分信息表示的是方法的签名信息
代表的意思是 三个int参数 返回boolean
练习:
//分析字段:
// Lcom/alipay/sdk/app/H5PayActivity;->b:Ljava/lang/String;
// Lcom/auth/third/accountlink/ui/WebViewActivity;->a:Z
// Lcom/alipay/sdk/authjs/a;->m:Lorg/json/JSONObject;
// 解答:
package com.alipay.sdk.app
class H5PayActivity
{
string b;
}
package com.auth.third.accountlink.ui
class WebViewActivity
{
bool a;
}
import org.json;
package com.alipay.sdk.authjs
class a
{
JSONObject m;
}
//分析方法:
// Lcom/alipay/sdk/j/h;->b()Z
// Landroid/content/Intent;->getExtras()Landroid/os/Bundle;
// Lorg/cocos2dx/lua/LoadingAct;->setContentView(I)V
//解答
package com.alipay.sdk.j
class h
{
public boolean b() {}
}
package android.content
class Intent
{
public android.os.Bundle getExtras(){}
}
package org.cocos2dx.lua
class LoadingAct
{
public void setContentView(int int_1){}
}
Q.E.D.