跳至主要内容

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; ...

IDA动态调试ELF中遇到的问题(1)

https://ift.tt/2Gxnf2F 遇到 got SIGCHLD singal(child status has changed)...这种提示 singal fork了子进程 直接点yes,然后继续单步执行,出来提示 pass to application就行了 内存查看 用od习惯了之后,凡事都想右键看一下内存,但是IDA中好像没有那么如意, 目前只是在栈中右键发现有查看hex的选项 动态调试的时候的nop ida保存动态调试的时候修改的数据 方法一:在程序运行的时候保存 The post IDA动态调试ELF中遇到的问题(1) appeared first on cole . https://ift.tt/2q9Qf5g WHATEVER April 05, 2018 at 09:44AM

数据库(MySQL)编程之数据库和表的基本操作

http://ift.tt/2gOXg6X     数据库和表的基本操作 操作前的基本知识 基本 sql语句不区分大小写(关键字建议用大小写),但字符串常量区分大小写 sql语句可单行或多行书写,以; 结尾 关键字不能跨行或简写 可以用空格或者缩进来提高可读性 注释 sql标准 /**/ : 多行注释 "--":单行注释 mysql 标准: "#":单行注释 "COMMENT":为字段或列添加注释 创建和查看数据库 创建数据库 模板 CREATE DATABASE [IF NOT EXISTS ] db_name create_specification: IF NOT EXITSTS : 检查数据库是否存在,如果存在就不创建 creat_specification :创建条件 CHARACTER SET: 制定数据聚采用的字符集 COLLATE :制定数据库字符集的比较方式 DEFAULT :表示默认内容,即使没有制定该项,也有默认的值 # 创建数据库使用字符集为 UTF-8 ,使用规则为 uftf_bin CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE uft8_bin; 一般默认的数据库就是utf8 和utf8_bin的比较方式,因此一般创建数据库的时候都用 CREATE DATABASE db_name mysql> create database testdb; Query OK, 1 row affected (0.02 sec) 查看数据库 命令 SHOW DATABASES     mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sakila | | sys | | testdb | |...