跳至主要内容

java语言反编译 smali 汇编基础语法(4)之返回指令和分支结构

http://ift.tt/2Gaml8x

java语言反编译 smali 汇编基础语法(4)之返回指令和循环、分支结构



返回指令

返回指令不多,有以下几种:
- return-void:返回一个void
- return-vAA:返回一个32位非对象类型的值,返回寄存器为8位
- return-wide vAA:返回一个64位非对象类型的值,返回寄存器为8位
- return-object vAA:返回一个对象类型

字符串操作

指令 说明
const-string v0,”english string" 英语字符串可以被直接解析
const-string v1,”\uxxx\uxxx" unicode字符串是这种方式
const v3,0xxxxxx 说明字符串存在于资源文件中,后面是资源的id

选择结构

smali条件跳转分支的语法一般为:

    if-<条件>v0,v1:cond_xx
    如果v0<条件>v1成立,就跳转到cond_xx

判断关键字如下:

条件关键字 意思
if-eq if equal
if-ne if not equal
if-lt if less than
if-le if less or equal
if-ge if greater or equal
if-eqz if equal zero
if-nez if not equal zero
if-ltz if less than zero
if-lez if less equal zero
if-gtz if greater than zero
if-gez if greater equal zero

循环结构

在smali中循环的实现就是通过无条件跳转语句goto加条件语句if-<条件>相结合实现

循环无非就是三张,for循环,while循环,do...while循环,判断的时候注意一下就好了

分支结构

分支结构在smali中有两种

第一种:case值是连续递增的

关键字是packed-switch
比如:

public void showPackedSw(int nNumber){
    switch(nNumber){
        case 0:{...}break;
        case 1:{...}break;
        case 2:{...}break;
    }
} 

这种的在smali汇编中一般展现为:

packed-switch p1,:pswitch_data_0 # p1为传递进来哟啊匹配case值的参数
:goto_0
#退出分支结构代码
:pswitch_0
#case 0时的程序代码
goto :goto_0  # 跳转到分支结构退出代码
:pswitch_1
#程序代码
goto:goto_0
#pswitch_2
goto:goto_0
:pswitch_data_0
  .packed-switch 0x00 #case 值开始的地方,依次递增
    :pswitch_0 #case 0:
    :pswitch_1 #case 1:
    :pswitch_2 #case 2:
  .end packed-switch

第二种:case值可以为任意值

关键字为sparse-switch
比如:

    public ShowTest(int nNumber){
    switch(nNumber){
        case 0x5:{....}break;
        case 0xf:{...}break;
        ....
        }
}


体现在汇编中就是

sparse-switch p1,:switch_data_0 #p1 传进来的参数

:goto_0 #case 出口
#代码
:pswitch_0 #case 5跳转到这里
#case值等于5时的程序代码
goto:goto_0
:pswitch_1
#程序代码
goto:goto_0
:pswitch_data_0
  .sparse-swich #case值开始的地方,依次递增
    0x5->:pswitch_0 #case 0x5
    0xf->:pswtich_1 #case 15
  .end packed-switch

The post java语言反编译 smali 汇编基础语法(4)之返回指令和分支结构 appeared first on cole.

http://ift.tt/2DyyCGb Smali, smali January 24, 2018 at 02:31PM

评论

此博客中的热门博文

反Hook 之自己实现GetProcAddress和LoadLibraryA(c++ version)

http://ift.tt/2AocAD0 // 课上练习.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <windows.h> //要实现的功能: /* 自己实现GerProcAddress LoadLibraryA */ //思路: /* GerProcAddress和LoadLibraryA都是在Kernel32.dll中的 首要的任务就是找到Kernel32.dll,然后遍历IAT就能找到这两个函数 现在首要的难点就是如何找到kernel32.dll() 通过dll的加载顺序可以找到,而且虽然需要使用未文档化的API,但是好在windgb可以直接看,而且用到的也并不是很多 懒得去晚上搜了,直接自己实现一个得了,作为演示,能用就行(最好还是搜一个正规的结构体) */ /* 0: kd> dt _TEB /a nt!_TEB +0x000 NtTib : _NT_TIB +0x01c EnvironmentPointer : Ptr32 Void +0x020 ClientId : _CLIENT_ID +0x028 ActiveRpcHandle : Ptr32 Void +0x02c ThreadLocalStoragePointer : Ptr32 Void +0x030 ProcessEnvironmentBlock : Ptr32 _PEB //首先实现部分TEB结构体,因为只需要用的PEB的部分,所以实现到这就ok了 */ //构建 TEB typedef struct _TEB { //保证0x30是peb的结构体就ok了 struct _tem { DWORD a1; DWORD a2; DWORD a3; DWORD a4; DWORD a5; DWORD a6; DWORD a7; DWORD a8; DWORD a9; DWORD a10; ...

32位ARM汇编语言(四)数据处理指令

http://ift.tt/2Gwa4v5 基本指令介绍 数据传送指令 比较指令 cmp{条件}操作数1,操作数2 CMN{条件}操作数1,操作数2 TST{条件},操作数1,操作数2 TEQ{条件} 操作数1,操作数2 算数逻辑运算指令 ADD{条件}{S}目的寄存器,操作数1,操作数2 ADC{条件}{S}目的寄存器,操作数1,操作数2 RSB{条件}{S}目的寄存器,操作数1,操作数2 RSC{条件}{S}目的寄存器,操作数1,操作数2 AND{条件}{S}目的寄存器,操作数1,操作数2 EOR{条件}{S}目的寄存器,操作数1,操作数2 BIC{条件}{S}目的寄存器,操作数1,操作数2 基本指令介绍 数据传送指令 数据传送指令用于在寄存器和储存器中之间进行数据的双向传输 比如:MOV ,MVN 算数逻辑运算指令 完成常用的算术与逻辑运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中相应条件表示位 比如:ADD,ADC,SUB,SBC,RSB,RSC,AND,ORR,EOR,BIC 比较指令 不保存运算结果,只更新CPSR中相应的条件标志位 比如:CMP,CMN,TST,TEQ 数据传送指令 指令 描述 MOV{条件}{S}目的寄存器,操作数 数据传送指令 MVN{条件}{S}目的寄存器,操作数 数据取反传送指令 {S}选项决定指令的操作是否影响CPSR中条件标志位的值 MVN与MOV不同之处是在传送之前按位被取反 __asm__ ("mov ri,r0“); //将寄存器R0的值传送到寄存器R1 __asm__(”mov r1,r0,lsl#3"); //将寄存器R0的值左移3位后传到R1 __asm__(“mov pc,lr"); //将寄存器lr的值传送到pc,常用于子程序返回 __asm__("mvn r0,#0”); // 将立即数0 取反传送到寄存器R0中,完成后R0=-1 比较指令 指令 描述 CMP{条件}操作数1,操作数2 比较指令 CMN{条件}操作数1,操作数2 比较反值指令 TST{条件...

RS232 学习笔记

https://ift.tt/2zh0MU7 什么是RS232 RS232的传输方式 RS232的分类 数据终端设备:DTE(Data Terminal Equipment) 数据通信设备:DCE:Data Communication Equipment 常见的管脚接口和脚位的意义 发展 RJ-45接口和DB-9 Console 及DB-9 Modem接口的对应关系 9针串口 各脚位的意义 常见的串口设置 波特率(Bps) 数据位(Data Bits) 奇偶校验(Parity) 停止位(Stop Bits) 流量控制 什么是RS232 RS232 是 美国电子工业联盟 指定的串行通信的接口标准。 原始编号全称是EIA-RS-232(简称232,RS232)。他被广泛用于计算机串行接口外设连接。 RS232 标准的全称是EIA-RS-232C标准,其中EIA代表美国电子工业联盟,RS(Rrcommand Standard)代表推荐标准,232是标识号,C代表232的第三次修改。 RS232的传输方式 在rs232标准中,字符是以一串行的比特串来一个接一个断点以串列(serial)的方式传输的(所以又叫串口)。 优点 传输线少,配线简单,发送距离可以较远 最常见的编码格式是异步起停( Asynchronous Start-stop )格式,它使用一个起始比特后面紧跟7个或8个数据比特(bit),然后是奇偶校验比特,最后是一个或两个停止比特。所以发送一个字符至少需要10比特,带来的效果是使全部的传输速率,发送信号的速率以10划分。 一个最平常的代替异步起停的方式是使用高级数据链路控制协议(HDLC)。 RS232在设计之初就是用来连接调制解调器做传输之用的,也因此它的脚位意义通常和调制解调器传输有关。 RS232的分类 根据不同的线路用来发送和接受信号的不同,妇女为 数据终端设备:DTE(Data Terminal Equipment) 计算和终端设备有DTE连接器 数据通信设备:DCE:Data Communication Equipment 调制解调器和打印机有DCE连接器 不是很准确, 但是可以大概分为这两类 常见的管脚接口和脚位的意义 发展 RS232...