千家信息网

实验吧smali文件分析

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,试题网址: http://www.shiyanbar.com/ctf/18710x01首先我们得到了一个hello.dex文件,要把它反编译为smali文件,使用工具baksmali,cmd命令: j
千家信息网最后更新 2024年11月23日实验吧smali文件分析

试题网址: http://www.shiyanbar.com/ctf/1871


0x01

首先我们得到了一个hello.dex文件,要把它反编译为smali文件,使用工具baksmali,cmd命令: java -jar baksmali-2.0.3.jar -o class/ Hello.dex ,就在当前目录下生成了一个文件夹,里边有一个hello.smali 代码如下:

.class public LHello;.super Ljava/lang/Object;.source "Hello.java"# direct methods.method public constructor ()V    .registers 1    .prologue    .line 1    invoke-direct {p0}, Ljava/lang/Object;->()V    return-void.end method.method public static main([Ljava/lang/String;)V    .registers 5    .prologue    .line 7    new-instance v0, LHello;    invoke-direct {v0}, LHello;->()V    .line 8    sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;  //v1存out对象的引用    const/4 v2, 0x5    //把5符号扩展32位赋值给v2    const/4 v3, 0x3    //把3符号扩展32位赋值给v3    invoke-virtual {v0, v2, v3}, LHello;->foo(II)I   //调用函数foo    move-result v0    //把函数的结果赋值给v0    invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(I)V  //打印输出v0    .line 9    return-void.end method# virtual methods.method public foo(II)I    .registers 5    .prologue    .line 3            add-int v0, p1, p2        // v0=p1+p2    sub-int v1, p1, p2        // v1=p1+p2    mul-int/2addr v0, v1        // v0=v0*v1    return v0.end method。  于是便可以进行分析了.



0x02

在这里首先稍微的科普一下,安卓程序都是由安卓虚拟机来运行的,Dalvik虚拟机有两种不同的寄存器表示方法,p命名法还有v命名法,假如说一个函数fun()使用了5个寄存器,2个显式的参数,并且这个方法是非静态的方法,所以调用的时候会传入一个隐式的fun对象引用,所以有三个参数,局部变量使用前2个寄存器,参数使用后3个,分别为v0,v1,v2,p0,p1,其中p0传入对象的引用。


然后说下Dalvik字节码的类型,方法还有字段表示方法:

1.类型:

V--void Z--boolean B--byte S--short C--char I--int F--float

D--double L--java类型 [--数组类型

其中java类型一般都是LpackageName/name/Objname 来表示具体的那个对象,如Ljava/lang/String相当于java.lang.String



2.方法:

Lpackage/name/Objname;->MethodName(III)Z

III表示三个整型参数,Z表示返回值是boolea型,


3.字段:

字段由类型、字段名、字段类型构成,字段名和字段类型之间使用:隔开

#instance fileds 实例字段

#static fields 静态字段


一些基本语法:

.prologue 方法开始

invoke-direct  调用函数

return-void  函数返回void

.end method  函数结束

new-instance  创建实例

iput-object  对象赋值

iget-object  调用对象


所以最终返回结果 (5+3)*(5-3)=16


当然这里直接反编译成jar然后反汇编为java代码更容易看出来:


import java.io.PrintStream;
public class Hello
{
public static void main(String[] paramArrayOfString)
{
Hello localHello = new Hello();
System.out.println(localHello.foo(5, 3));
}

public int foo(int paramInt1, int paramInt2)
{
return (paramInt1 + paramInt2) * (paramInt1 - paramInt2);
}
}

字段 类型 方法 函数 对象 参数 文件 寄存器 三个 代码 实例 符号 结果 静态 安卓 分析 不同 之间 变量 命令 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库系统应用实例 恩江中学网络安全 服务器生存教学视频教程 中小学教育网络安全 湖北正规软件开发设施检测中心 数据库原理与技术实验十一 软件开发应如何评估 hp服务器怎么配置管理口 孩子学IT软件开发哪个最好 如何写软件开发的技术路线 数据库日期数据清洗 战地服务器在哪里选 软件开发部软件开发部 数据库actual 曾经下载的软件开发去掉云朵 草料二维码连接自有数据库 公安局网络安全警察有前途吗 金蝶专业版数据库不一致 万物互联网络技术 前台获取数据库数据 计算机网络技术专业未来职业 金蝶服务器电脑坏了怎么办 北京pdu服务器电源可以定制吗 网络技术员叫什么 苹果光遇会有服务器已满的情况吗 计算机网络安全保密产品 常州互动博物馆软件开发 山东北斗授时模块服务器云主机 学习网络安全哪个平台好 主动网络安全技术吗
0