编辑smali.问题:低16位必须清零.十六进制id是错误的吗?

Mis*_*erX 3 android reverse-engineering edit smali apktool

早上好/下午好/晚上好,我安静的是一个小语言的新手,在编译的时候,有一个我无法解决的问题.我希望以前没有问过这个问题,但我检查了谷歌和stackoverflow上的一些线程,但找不到任何解决方案,所以我认为它没有.那么,会发生什么:

我正在尝试修改我的应用程序的C1.smali文件,我只想更改数组的错误ID.所以我刚刚更换了id,我没有触及其他任何东西.

修改后的smali文件:

.line 52
invoke-virtual {p0}, Lcom/one/aplication/C1;->getResources()Landroid/content/res/Resources;

move-result-object v6

const/high16 v7, 0x7f060001
# array "Codes", id was 0x7f050000

invoke-virtual {v6, v7}, Landroid/content/res/Resources;->getStringArray(I)[Ljava/lang/String;

move-result-object v5
Run Code Online (Sandbox Code Playgroud)

当然,我通过检查public.xml 文件(在res\values中)验证了id是否正确.我让你自己看看:

 <public type="string" name="name1" id="0x7f05003d" />
<public type="string" name="surname1" id="0x7f05003e" />
<public type="array" name="server" id="0x7f060000" />
<public type="array" name="Codes" id="0x7f060001" />
<public type="menu" name="search" id="0x7f070000" />
<public type="id" name="txt" id="0x7f080000" />
<public type="id" name="button1" id="0x7f080001" />
Run Code Online (Sandbox Code Playgroud)

现在,当我想重新编译时,apktool会抛出一个我无法理解的问题: C:\apktool>apktool b CC I: Using Apktool 2.0.0-RC4 I: Checking whether sources has changed... I: Smaling smali folder into classes.dex... CC\smali\com\one\aplication\C1.smali[58,4] Invalid literal value: 2131099649. Low 16 bits must be zeroed out. Exception in thread "main" brut.androlib.AndrolibException: Could not smali file : com/one/aplication/C1.smali at brut.androlib.src.SmaliBuilder.buildFile(SmaliBuilder.java:71) at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:55) at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:41) at brut.androlib.Androlib.buildSourcesSmali(Androlib.java:354) at brut.androlib.Androlib.buildSources(Androlib.java:294) at brut.androlib.Androlib.build(Androlib.java:280) at brut.androlib.Androlib.build(Androlib.java:255) at brut.apktool.Main.cmdBuild(Main.java:225) at brut.apktool.Main.main(Main.java:84)

有人知道这个问题的原因吗?apktool问题指向行[58],这是我修改的行.我真的不知道会发生什么!感谢任何想要帮助我的人,请原谅我可怜的英语.祝你有美好的一天!:)

Jes*_*eke 8

在原始字节码中,const/high16指令接受一个16位操作数,然后在加载到寄存器之前将其向左移位16位.在smali 2.0及更高版本中,操作数以后移位形式给出,当然,这要求最低有效16位全为0.

例如,要将值0x12340000加载到寄存器中,可以使用

const/high16 0x12340000
Run Code Online (Sandbox Code Playgroud)

在原始字节码中,操作数将表示为16位值"0x1234".

值0x7f060001不符合此要求,因此不能与const/high16指令一起使用.你可以改用const指令.

const v7, 0x7f060001
Run Code Online (Sandbox Code Playgroud)