Android逆向基础笔记—Dalvik字节码小记_const/4 v2, 0x1
2016-08-26 08:46
561 查看
这几天认真研读了一下dalvik字节码,因为这个是重点,对以后的Android逆向分析很重要。
我是学过汇编的,但是感觉还是不是太懂。这玩意也太乱了吧。然后我有些看不懂,就百度一阵,也没有结果。就自己研究了下下,把自己不懂的地方写出来。不对的地方,大家请指出。
我主要是集中在赋值哪里。我开始没弄懂,后来才明白过来。
const/4 v1, 0x1 这里大家应该知道 v1=1。但是真真正正想过为什么?也许很多人都知道,这里是写给不知道的。
首先4代表4字节,那么就是4位的。所以呢 v1=0*4+1=1
const/16 v2, 0x10 这里的话,16字节,那么16位对吧。所以v2 = 1*16+0 = 16
const/16 v3, 0x28 16字节,16位。v3 = 2*16+8 = 40;
这里就解释完了。后面给点dalvik的实例吧。
.local 4 //本地4个寄存器,也就是下面的v0,v1,v2,v3
const/4 v2, 0x1 //4字节常量 v2=1
const/16 v1, 0x10 //16字节常量 v1=16
:local v1, "length":I //int length=v1
if-nez v1,:cond_1 //如果v1不等于0,这跳转至cond_1
:cond_0 //cond_0标签
:goto_0 //goto_0标签
return v2 //返回v2的值
:cond_1 //开始执行cond_1标签代码
const/4 v0,0x0 //4字节常量 v0=0
:local v0, "i":I //int i=v0
:goto_1 //开始执行goto_1标签代码
if-lt v0, v1, :cond_2 //如果v0小于v1,则跳转至cond_2
const/16 v3,0x28 //如果v0大于等于v1,则执行下面语句: 16字节常量v3=40
if-le v1,v3, :cond_0 //如果v1小于等于v3,则跳转至cond_0,即返回v2的值
const/4 v2, 0x0 //如果v1大于v3,则4字节常量v2=0
goto:goto_0 //跳转至goto_0,即返回v2的值
:cond_2 //cond_2标签
xor-int/lit8 v1, v1, 0x3b //将第二个v1寄存器中的值与0x3b(59)进行异或运算,得到的值赋值给第一个v1寄存器中
add-int/lit8 v0, v0, 0x1 //将第二个v0寄存器中的值加上0x1(1),所得的值放入第一个v0寄存器中
goto:goto_1 //跳转值goto_1标签
翻译成java代码就是
int v2 = 1;
int v1 = 16;
if (v1 != 0){
for (int v0 = 0; v0 < v1;){
v1 = v1 ^ 59;
v0++;
}
if (v1 > 40){
v2 = 0;
}
}
return v2;
我是学过汇编的,但是感觉还是不是太懂。这玩意也太乱了吧。然后我有些看不懂,就百度一阵,也没有结果。就自己研究了下下,把自己不懂的地方写出来。不对的地方,大家请指出。
我主要是集中在赋值哪里。我开始没弄懂,后来才明白过来。
const/4 v1, 0x1 这里大家应该知道 v1=1。但是真真正正想过为什么?也许很多人都知道,这里是写给不知道的。
首先4代表4字节,那么就是4位的。所以呢 v1=0*4+1=1
const/16 v2, 0x10 这里的话,16字节,那么16位对吧。所以v2 = 1*16+0 = 16
const/16 v3, 0x28 16字节,16位。v3 = 2*16+8 = 40;
这里就解释完了。后面给点dalvik的实例吧。
.local 4 //本地4个寄存器,也就是下面的v0,v1,v2,v3
const/4 v2, 0x1 //4字节常量 v2=1
const/16 v1, 0x10 //16字节常量 v1=16
:local v1, "length":I //int length=v1
if-nez v1,:cond_1 //如果v1不等于0,这跳转至cond_1
:cond_0 //cond_0标签
:goto_0 //goto_0标签
return v2 //返回v2的值
:cond_1 //开始执行cond_1标签代码
const/4 v0,0x0 //4字节常量 v0=0
:local v0, "i":I //int i=v0
:goto_1 //开始执行goto_1标签代码
if-lt v0, v1, :cond_2 //如果v0小于v1,则跳转至cond_2
const/16 v3,0x28 //如果v0大于等于v1,则执行下面语句: 16字节常量v3=40
if-le v1,v3, :cond_0 //如果v1小于等于v3,则跳转至cond_0,即返回v2的值
const/4 v2, 0x0 //如果v1大于v3,则4字节常量v2=0
goto:goto_0 //跳转至goto_0,即返回v2的值
:cond_2 //cond_2标签
xor-int/lit8 v1, v1, 0x3b //将第二个v1寄存器中的值与0x3b(59)进行异或运算,得到的值赋值给第一个v1寄存器中
add-int/lit8 v0, v0, 0x1 //将第二个v0寄存器中的值加上0x1(1),所得的值放入第一个v0寄存器中
goto:goto_1 //跳转值goto_1标签
翻译成java代码就是
int v2 = 1;
int v1 = 16;
if (v1 != 0){
for (int v0 = 0; v0 < v1;){
v1 = v1 ^ 59;
v0++;
}
if (v1 > 40){
v2 = 0;
}
}
return v2;
相关文章推荐
- Android逆向基础笔记—Dalvik字节码小记_const/4 v2, 0x1
- Android逆向基础笔记—Android NDK开发2之Windows下的gcc手动编译(交叉连编译)和利Linux Ubuntu系统下的交叉工具链手动编译
- Android逆向基础笔记—Android中的常用ARM汇编指令
- Android逆向基础笔记—Android NDK开发1环境的配置及介绍
- Android逆向基础笔记—Android NDK开发4之Android studio NDK自动编译
- android逆向学习,笔记(四)ARM汇编基础
- Android逆向基础笔记—巧用蓝叠和Android Studio进行动态调试
- Android逆向基础笔记—初识逆向
- Android逆向基础笔记—Android NDK开发3之使用ndk-build工具手动编译
- Android逆向基础笔记—Android中的常用ARM汇编指令
- Android逆向基础笔记—初识逆向
- C\C++ 程序员从零开始学习Android - 个人学习笔记(二) - java基础 - 从源代码到运行
- Android基础学习笔记--Mars篇
- C\C++ 程序员从零开始学习Android - 个人学习笔记(四) - java基础 - 数据类型、变量、字符串、数组
- C\C++ 程序员从零开始学习Android - 个人学习笔记(三) - java基础 - 环境和工具
- Android Map开发基础知识学习笔记
- C\C++ 程序员从零开始学习Android - 个人学习笔记(八) - java基础 - 继承、抽象类、接口、内部类(待续)
- Android Map开发基础知识学习笔记
- Android Map开发基础知识学习笔记
- android基础学习笔记--MP3播放器开发