实验吧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 <init>()V
    .registers 1
    .prologue
    .line 1
    invoke-direct {p0}, Ljava/lang/Object;-><init>()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;-><init>()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);
      }
}

时间: 2024-11-08 18:27:56

实验吧smali文件分析【安卓逆向首发】的相关文章

安卓逆向学习---深入Smali文件

参考:https://www.52pojie.cn/thread-396966-1-1.html Smali中的包信息 .class public Lcom/aaaaa; //他是com.aaaaa这个package下的一个类. .super Lcom/bbbbb; //继承自com.bbbbb这个类. .source "ccccc.java" //这是一个有ccccc.java编译得到的Smali文件. Smali中的声明 一般来说是这个样子: # annotations .anno

安卓逆向--修改smali

和上一篇帖子用的工具一样 Android逆向助手 v2.2 这里只是做一个嵌入smali的测试,嵌入的东西很简单,只想在所有的activity里面弹出一段提示. 源码: Toast.makeText(this, "----", Toast.LENGTH_LONG).show(); 大致步骤: 1.解压目标apk,查看smali文件,找到要嵌入的位置.大致是找BaseActivity.MainActivity等的onCreate方法,在setCOntentView方法之后紧跟一行,基本不

安卓逆向之基于Xposed-ZjDroid脱壳

http://bbs.pediy.com/thread-218798.htm 前言 之前介绍了普通常见的反编译模式 但对于使用了 360加固 棒棒 爱加密 等等的加固应用就没办法了. 你会发现反编译出来的dex 只有几个类 逻辑都是调用so 真正的dex会被加载到内存中隐藏起来 加固应用都是多dex这种形式 要想拿到他真正的dex 需要进行脱壳处理  基本原理都是从内存中dump 我一般会先用工具来尝试 不行的话就得上 IDA(反汇编神器)超级强的一个工 具 杀手级别 贯穿移动端 PC端的逆向

安卓逆向入门(一)

文章来源i春秋 这段时间大师傅安排了安卓逆向练习.首先 0 基础没有代码开始学起也是可以的,不用太过于执着于"我没有代码功底就学不会",我可以很明确的说,我也没有多少代码功底,都是偶尔被大师傅逼着看.但是简单的也就仅仅能看懂,写出来又是另一个问题了.有时候我们学习很多东西需要的代码知识不多,记住一些主要函数,语句就好了,不懂就有道翻译(很多也就是英语,我英语也不行,也不用想着不懂英语就不能编程什么的.)或百度,用到的时候对着那几个主要的函数,语句你还能不懂? 00X1: 安卓逆向基础工

安卓逆向的初步研究--从恋恋app入手

主题:安卓app中的关键登录逻辑分析目标:des算法分析,.so文件分析样本:恋恋v5.0.1 app代码:main函数自实现,其它函数提取自app中的安卓无关代码作者:by GKLBB参考:Bu弃 https://www.chinapyg.com/forum.php?mod=viewthread&tid=119242&highlight=DES 无名Android逆向 系列视频 资源: 链接:https://pan.baidu.com/s/14FzEJt0uegp9XQhYr5iQoA

PAI文本分析实验:常用文本分析组件及案例实战

上一篇介绍了PAI以及机器学习相关的一点知识,没有深入算法原理,只是从使用角度出发熟悉了操作流程,后面随着学习的深入,我也会对算法原理做一个详细的阐述.这次我们还是继续实战,认识机器学习在文本分析领域是如何工作的.先贴出官方的教程:机器学习PAI眼中的<人民的名义>. 准备开始 还是在阿里PAI环境下,我们从实验模板:人民的名义分析进入,然后点击去PAI平台创建,这样就在机器学习页面创建好了实验.接下里设置各个组件的参数,我们先看下模型图: 你会发现模板创建的结果和教程的模型图不一样.这里我们

/etc/fstab文件分析(第二版)

/etc/fstab文件分析 前面说新建的分区在系统重启之后就会失效,要想永久生效,需要将其写入/etc/fstab文件 一./etc/fstab文件格式:6个组成部分 物理分区名/卷标 挂载点 文件系统 缺省设置   是否检测     检测顺序 UUID=6e428a...  /    ext4   defaults     1             1 LABEL=/         /    ext4   defaults    1/0        0/1/2 /dev/sda1 二.

Smali文件语法解析

大家都应该知道APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,例如修改后缀后用RAR打开鳄鱼小顽皮APK能看到的是(Google Play下载的完整版版本):Where's My Water.zip\ asset\                        <资源目录1:asset和res都是资源目录但有所区别,见下面说明> lib\                             <so库存放位置,一般由NDK编译得到,常见于

Gradle文件分析--AndroidStudio学习

项目名/app/build.gradle文件分析 // 声明是Android程序 apply plugin: 'com.android.application' android { // 编译SDK的版本 compileSdkVersion 21 // build tools的版本 buildToolsVersion "21.1.1" defaultConfig { // 应用的包名 applicationId "com.example.siyuan.helloandroid