静态分析android代码, 循环与trycatch

本文深入探讨了如何阅读Android应用的字节码和源码,包括使用IDA阅读dex文件、通过dex2jar将APK转换为JAR文件并使用jd-gui查看源码的方法。详细解释了Android.intent.category.LAUNCHER的作用,以及application类在主activity启动前进行全局变量传递的机制。同时,介绍了dex文件的数据结构整理、ida分析中的API识别和参数解析,以及Smali文件的格式与解析流程。最后,提供了d2j-dex2jar、Ja-gui等工具的使用方法,帮助开发者理解Android应用的内部运行机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:阅读dalvik字节码,可用ida阅读dex, 或直接文本阅读smali文件

二:阅读java源码,可用dex2jar生成jar文件,再使用jd-gui来阅读jar文件的源码。

Android.intent.category.LAUNCHER 在程序列表中可见。

1.            application类用于组件之间传递全局变量在主activity启动之前做一些工作,主activity可以通过AndroidManifest.xml中的android.intent.action.MAIN来定位。

2.            dex文件的数据结构大部分在dalvik\libdex\DexFile.h中,可以整理成ida的idc脚本来导入ida6.1中。

3.            ida分析中,imp表明该方法为androidSDK中的API,@后为声明,类名与方法名用_分开,并且能识别隐参数this,由于this取代p0, 则后面的参数命名都依次-1.

4.            1.            d2j-dex2jar  xxx.apk                       2.   Ja-gui

 

Smali文件格式:

//smali文件的头三行描述类信息

.class <访问权限>[修饰关键字]<类名>

.super<父类名>

.source<源文件名>

#static fields

.field<访问权限>static[修饰关键字]<字段名>:<字段类型>

#instance fields

.field<访问权限>[修饰关键字]<字段名>:<字段类型>

#direct methods

.method <访问权限> [修饰关键字] <方法原型>

                <.locals>              #局部变量数

                [.parameter]      #dalvik使用.parameters指定参数个数,而这表示一个参数,多个参数者出现多个.parameter.

                [.prologue]         #代码开始处

                [.line]                    #指定该处指令在源码中行号

                <代码体>

.end method

#interfaces

.implements <接口名>

如何类使用注解,则生成.annotation指令

#annotation

.annotation[注解属性]<注解类名>

[注解字段=值]

.end annotation

循环语句:

Iterator<对象><对象名> = <方法返回一个对象列表>;

For(<对象><对象名>:<对象列表>){

                [处理单个对象代码]

}

Iterator<对象><迭代器> = <方法返回一个迭代器>;

While(<迭代器>.hasNext()){

<对象><对象名> = <迭代器>.next();

                [处理单个对象的代码]

}

 

:goto_0

    invoke-interface{v2}, Ljava/util/Iterator;->hasNext()Z

 

    move-result v5

 

if-nez v5, :cond_0

:cond_0

    invoke-interface {v2},Ljava/util/Iterator;->next()Ljava/lang/Object;

 

    move-result-object v1

goto :goto_0

try catch:

try {

            String a = "sdf";

            Toast.makeText(this,a,Toast.LENGTH_SHORT);

            try {

                if( true ){

                    throw newNumberFormatException();

                }

            } catch (NumberFormatException e) {

                Toast.makeText(this,"number format exception", Toast.LENGTH_SHORT);

            }

        } catch (IllegalArgumentException e){

           Toast.makeText(this,"IllegalArgumentException",Toast.LENGTH_SHORT);

        }

Smali:

    .line 19

    :try_start_0

    const-string v0, "sdf"

 

    .line 20

    .local v0, "a":Ljava/lang/String;

    const/4 v2, 0x0

 

    invoke-static {p0, v0, v2},Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

    :try_end_0

    .catch Ljava/lang/IllegalArgumentException;{:try_start_0 .. :try_end_0} :catch_1

 

    .line 23

   :try_start_1

    new-instance v2,Ljava/lang/NumberFormatException;

 

    invoke-direct {v2},Ljava/lang/NumberFormatException;-><init>()V

 

    throw v2

    :try_end_1

    .catch Ljava/lang/NumberFormatException;{:try_start_1 .. :try_end_1} :catch_0

    .catch Ljava/lang/IllegalArgumentException;{:try_start_1 .. :try_end_1} :catch_1

 

    .line 25

    :catch_0

    move-exception v1

 

    .line 26

    .local v1,"e":Ljava/lang/NumberFormatException;

    :try_start_2

    const-string v2, "number format exception"

 

    const/4 v3, 0x0

 

    invoke-static {p0, v2, v3},Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

    :try_end_2

    .catch Ljava/lang/IllegalArgumentException;{:try_start_2 .. :try_end_2} :catch_1

 

Ida6.1   ctrl+s 选择String 搜索字符串, 选择code搜索api

Dex2jar 转换apk to jar,  jd-gui 查看jar源码。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值