易语言吧

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1544|回复: 2

[技术文章] Android逆向之smali

[复制链接]

2

主题

5

帖子

2681

积分

VIP超级贵宾

Rank: 8Rank: 8

积分
2681
威望
198
易币
2280
贡献
0
积分
2681
UID
7726
在线时间
2 小时
注册时间
2020-7-28
发表于 2020-7-31 22:47:34 | 显示全部楼层 |阅读模式
本帖最后由 黑骑士 于 2020-7-31 22:49 编辑

头信息smail文件前三行
  1. .class <访问权限> [关键修饰字] <类名>;
  2. .super <父类名>;
  3. .source <源文件名>
复制代码
.class指令表示当前的类名,类的访问权限是public,类名是Lcom/example/mark/myfirstapp/MainActivity,类开头的L是遵循Dalvik字节码的相关约定,表示后面跟随的字符串是一个类
.super指定了当前类所继承的父类
.source指定了当前类的源文件名
接口.implements <接口名>
类型#
  1. V   void
  2. Z   boolean
  3. B   byte
  4. S   short
  5. C   char
  6. I   int
  7. J   long
  8. F   float
  9. D   double
  10. L   java类
  11. [   数组
复制代码
变量存放在寄存器中,寄存器采用v和p来命名,v表示本地寄存器,p表示参数寄存器。寄存器为32位,支持任何类型,其中long,double是64位,使用两个相邻的寄存器。
[x表示一维数组,x代表基本类型,如[I代表int[],[[x代表二维数组。
Java语言存在大量对象,java.lang.String表示为Ljava/lang/String;,分号一定要加上。
静态字段
(1)静态字段
  1. #static fields
  2. .field <访问权限> static [修饰关键字] <字段名>:<字段类型>
复制代码
(2)实例字段
  1. #instance fields
  2. .field <访问权限> static [修饰关键字] <字段名>:<字段类型>
复制代码
方法定义
  1. #direct/virtual methods     ----注释,直接方法(direct methods)指的是该类中定义的方法,虚方法(virtual methods)指的是从父类中继承的方法或者实现的接口方法。
  2. .method <访问权限> [修饰关键字] <方法原型>      ----方法原型描述了方法的名称、参数和返回值
  3.     <.registers>        ----指定了方法中寄存器的总数,这个数量是参数和本地变量总和
  4.     [.param]            ----方法的参数
  5.     [.prologue]         ----指定了代码的开始处,混淆过的代码可能去掉了该指令
  6.     [.line]             ----此处代码在源代码中的行号
  7.     <.local>            ----使用这个指定表明方法中非参寄存器
  8.     <代码体>
  9. .end method
复制代码
常用指令
  1. move v0,v3  把v3寄存器的值移动到寄存器v0上
  2. const-string v0, "admin"    把字符串"admin"赋值给v0寄存器
  3. invoke-super    调用父函数
  4. invoke-static   调用静态函数
  5. invoke-direct   调用函数
  6. input-object    对象赋值
  7. iget-object     调用对象
  8. new-instance    创建实例
  9. return-void     函数返回void
复制代码
if判断
  1. if-eq vA, VB, cond_** 如果vA等于vB则跳转到cond_**。相当于if (vA==vB)
  2. if-ne vA, VB, cond_** 如果vA不等于vB则跳转到cond_**。相当于if (vA!=vB)
  3. if-lt vA, VB, cond_** 如果vA小于vB则跳转到cond_**。相当于if (vA<vB)
  4. if-le vA, VB, cond_** 如果vA小于等于vB则跳转到cond_**。相当于if (vA<=vB)
  5. if-gt vA, VB, cond_** 如果vA大于vB则跳转到cond_**。相当于if (vA>vB)
  6. if-ge vA, VB, cond_** 如果vA大于等于vB则跳转到cond_**。相当于if (vA>=vB)

  7. if-eqz vA, :cond_** 如果vA等于0则跳转到:cond_** 相当于if (VA==0)
  8. if-nez vA, :cond_** 如果vA不等于0则跳转到:cond_**相当于if (VA!=0)
  9. if-ltz vA, :cond_** 如果vA小于0则跳转到:cond_**相当于if (VA<0)
  10. if-lez vA, :cond_** 如果vA小于等于0则跳转到:cond_**相当于if (VA<=0)
  11. if-gtz vA, :cond_** 如果vA大于0则跳转到:cond_**相当于if (VA>0)
  12. if-gez vA, :cond_** 如果vA大于等于0则跳转到:cond_**相当于if (VA>=0)
复制代码
注解
  1. #annotations
  2. .annotation [注解属性] <注解类名>
  3.     [注解字段 = 值]
  4. .end annotation
复制代码
smail插桩
虽说是老生常谈的东西了,稍微记录一下,我觉得最重要的就是寄存器的问题了,如果需要额外的寄存器,要在smali函数的最前面将寄存器数量增加到需要的数量。
    在smali代码中,寄存器有两种表示方式,一种是v命名法,一种是p命名法。在v命名法中,从v0开始依次表示局部变量和参数。在p命名法中,从p0开始表示参数,从v0开始表示局部变量。以p命名法为例,在smali函数的开头,.locals n则表示可以使用v0到vn-1表示局部变量,因此如果插桩的时候需要额外的寄存器,则将.locals n 表示为.locals n+1就可以在插桩的代码中使用vn了。

#黑骑士技术QQ1994091497,培训火热扩招中

4

主题

61

帖子

448

积分

易语言学徒

Rank: 3Rank: 3

积分
448
威望
0
易币
387
贡献
0
积分
448
UID
8950
在线时间
21 小时
注册时间
2020-9-14
发表于 2020-9-18 20:15:38 | 显示全部楼层

论坛不能没有像楼主这样的人才啊!我会一直支持[c。olor=blue]易语言吧
回复

使用道具 举报

0

主题

2368

帖子

9586

积分

VIP超级贵宾

Rank: 8Rank: 8

积分
9586
威望
198
易币
6819
贡献
0
积分
9586
UID
11903
在线时间
36 小时
注册时间
2021-1-23
发表于 2021-5-29 04:01:57 | 显示全部楼层
楼主发贴辛苦了,谢谢楼主分享!我觉得易语言吧是注册对了!
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【选择右侧内容,快速回复】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

大漠插件注册码无须等1-3号

QQ|一:站内所有资源均来自互联网收集或用户上传分享,本站不拥有此类资源的版权。 作为网络服务提供者,对转载行为的发生不具备充分的监控能力。但是当版权拥有者提出侵权并出示充分的版权证明材料时,易语言吧负有移除转载作品以及停止继续传播的义务。在满足前款条件下采取移除等相应措施后不为此向原发布人承担违约责任,包括不承担因侵权不成立而给原发布人带来损害的赔偿责任。 用户免费分享产生,如果侵犯了你的权益,联系QQ:3066137757|Archiver|手机版|小黑屋|易语言吧

GMT+8, 2024-4-20 16:12 , Processed in 0.207678 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表