首页
社区
课程
招聘
[求助]修改smali需要注意的地方
发表于: 2013-10-9 09:42 24190

[求助]修改smali需要注意的地方

2013-10-9 09:42
24190
各位大神:
      请教个问题,修改smali代码的时候需要注意哪些地方的问题啊。 我每次修改都会出现新的错误,什么all args fit in 4 bits。。。 等等  或者直接导致上下文的语句出现了问题。 比如:
const-string v16, "b57ba656b518a6b145b9a77fabcddcf1f24ed757"

aput-object v16, v14, v15

invoke-direct {v13, v14}, Lcom/intrepidusgroup/learner/PinningTrustManager;-><init>([Ljava/lang/String;)V

aput-object v13, v8, v12


我想吧v16 logcat出来 于是增加语句

const-string v17, "logging"

invoke-static {v17, v16} ,Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I


但是他就提示 All register args must fit in 4 bits

请问如何调整啊  多谢

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (20)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好像,超过 v15 就要用 invoke-static/range 这样的语句来调用了
2013-10-9 10:51
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
额 不行的啊
上传的附件:
2013-10-9 14:01
0
雪    币: 18
活跃值: (117)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
多了一个变量,前面有个参数要改
2013-10-9 14:53
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
额 是 .locale吗?? 这个我已经改过了  我前面的内容是
aput-object v16, v14, v15
     
    invoke-direct {v13, v14}, Lcom/intrepidusgroup/learner/PinningTrustManager;-><init>([Ljava/lang/String;)V

    aput-object v13, v8, v12
    
 	
    const-string v18, "logging"
    const-string v17, "test123"
    
    
    invoke-static/range {v18, v17} ,Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I


其中从const-string开始为我自己加的语句
2013-10-9 15:09
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=vodga;1229119]额 不行的啊
[/QUOTE]

range 要用 ..
如:invoke-virtual/range {v0 .. v5}
2013-10-9 15:39
0
雪    币: 507
活跃值: (130)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
换个打印方式不就行了,参数太多了,你也可以自己写个静态方法去Log打印一下,在你打印v16的地方直接传入即可。
2013-10-10 21:19
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
额  这个也不行啊。。。
2013-10-11 09:27
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
望大神指点一二啊。。。
2013-10-11 09:31
0
雪    币: 507
活跃值: (130)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
你在程序中,写一个静态的方法,例如public static void printStr(String str){
Log.v("test",str);
}
再调用一下这个方法。
类似这样的,也可以system.out,然后反编译,把方法放入当前smali中,再需要打印的地方放入反编译后的调用方法,注意Lcom.aa也就是当前smali的类名即可.
2013-10-12 09:21
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
OK 多谢 来试试
2013-10-13 10:25
0
雪    币: 53
活跃值: (280)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
v17, v16换成 v0 ~ v15 之间的寄存器试试
确保修改寄存器不影响上下文,否则记得改回来即可
2013-10-14 15:21
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
前面的寄存器是不能用的。。。
2013-12-16 13:42
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
弄出来了  多谢指点
2013-12-16 14:54
0
雪    币: 194
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
[QUOTE=vodga;1229119]额 不行的啊
[/QUOTE]

这是什么工具,可以检查smali的语法有错的?  求指教。
2014-3-18 11:19
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
求楼主的工具.
2014-3-24 18:40
0
雪    币: 1436
活跃值: (3901)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
17
加入静态方法后的smali是
.method public static printlog(Ljava/lang/String;)V
    .locals 1
    .param p0, "str"    # Ljava/lang/String;

    .prologue
    .line 27
    const-string v0, "KKKK"

    invoke-static {v0, p0}, Landroid/util/Log;->v(Ljava/lang/String;Ljava/lang/String;)I

    .line 28
    return-void
.end method


调用它的地方是
#    String a="123";
#    printlog(a);

    .line 22
    const-string v0, "123"
    .line 23
    .local v0, "a":Ljava/lang/String;
    invoke-static {v0}, Lcom/kk/WifiC;->printlog(Ljava/lang/String;)V

用的还是 invoke-static,将这段插入别的smali时,又不能直接用V0,改成v20也报错啊,还是只能用v0~v15啊
2014-9-18 13:59
0
雪    币: 63
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
我记得超过13个都不一定能让你引用。
2014-9-18 14:08
0
雪    币: 507
活跃值: (130)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
19
你看下那个方法有几个变量,你想打印哪个,就传入哪个参数。
如果原方法都没有20个,你传入v20肯定报错的。
这个是传入你需要打印的参数的寄存器。
建议楼主直接写个java代码,输出几个字符串。
不熟练的情况下,不要手动去模仿写smali代码。
例如本帖上面写的
const-string v16, "b57ba656b518a6b145b9a77fabcddcf1f24ed757"
就直接调用
invoke-static {v16}, Lcom/kk/WifiC;->printlog(Ljava/lang/String;)V
即可。
2014-9-18 17:32
0
雪    币: 1436
活跃值: (3901)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
20
搞定,仔细观察那个寄存器在补丁位置是没有用的,再就是大于15的先赋值到V0~V15
    .line 2073
    invoke-virtual/range {v29 .. v29}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v27         #要用log将该值输出,其大于15,后面要先赋值给V1
	
[COLOR="Red"]# 以下是加入的内容,输出log("KKKKSend",str1)
const-string v0, "KKKKSend"     #为啥用V0,因为后面有move-object/from16 v0, v29,所以这里用V0不影响程序
move-object/from16 v1, v27     #同样,V1后面也有用到,不会破会寄存器上下文,所以让V1=V27
invoke-static {v0, v1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
#[/COLOR]

    .line 2075
    .local v27, "udp":Ljava/lang/String;
    move-object/from16 v0, p0

    iget-object v0, v0, Lcom/kk/Activity$Thread;->this$0:Lcom/kk/Activity;

    move-object/from16 v29, v0

    move-object/from16 v0, v29

    iget-object v0, v0, Lcom/kk/Activity;->jnic:Lcom/kk/Wifi;

    move-object/from16 v29, v0

    .line 2076
    invoke-virtual/range {v27 .. v27}, Ljava/lang/String;->length()I

    move-result v30

    .line 2075
    move-object/from16 v0, v29

    move-object/from16 v1, v27

    move/from16 v2, v30


2014-9-18 23:44
0
雪    币: 1
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
很清晰的思路
2015-6-30 16:24
0
游客
登录 | 注册 方可回帖
返回
//