问题标签 [smali]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 将 .Java 文件转换为 .Smali 文件
我使用 APKTool 对 Android 应用程序进行了逆向工程,并获得了 .Smali 文件作为源代码输出。我将带有应用程序的 .Smali 文件转换为 .Java 文件。我能够成功编辑 .Java 文件,但现在我想将它们转换回 .Smali,以便我可以使用新的 .Smali 文件重新编译应用程序。当我将 .Java 文件留在那里时,它不会重新编译它并给出一些错误。我在 Internet 上找不到任何关于将 .Java 编译为 .Smali 的信息,所以希望你们能帮助我。
先感谢您。
android - Android dex 中的冗余操作码
我目前正在研究一些 Android 性能问题,并注意到 dex 代码中的一些次优模式。我只是想知道是否有人知道这是否可以预期,以及其背后的基本原理是什么。
例如,考虑以下 Java 代码:
当它被构建然后通过 baksmali 运行时,它看起来如下所示:
与我有关的部分是将实例字段的值读入寄存器 v1 的 iget 操作码。相同的字段是从前面操作码中相同的 v1 寄存器写入的,因此操作码看起来完全是多余的。
我唯一能想到的就是这样做是为了使这更加线程安全。但肯定这应该是程序员的责任(通过使用同步块)而不是编译器的责任。尽管我不能 100% 确定,但我认为上述行为与大多数 C/C++ 编译器的行为完全不同。
我应该说,使用 ProGuard 时产生的 dex 基本相同。我还应该提到我正在使用最新的 Android 工具和最新型号的 JDK。
android - 编辑smali。问题:低 16 位必须清零。十六进制的id错了吗?
早上好/下午/晚上好,我是 smali 语言的新手,在编译时,有一个我无法解决的问题。我希望这个问题以前没有被问过,但我检查了谷歌和 stackoverflow 上的一些线程,找不到任何解决方案,所以我认为它没有。那么,会发生什么:
我正在尝试修改我的应用程序的 C1.smali 文件,我只想更改错误的数组 id。所以我只是更换了id,我没有碰其他任何东西。
修改后的smali文件:
当然,我通过检查public.xml 文件(在 res\values 中)验证了 id 是否正确。我让你自己看看:
现在,当我想重新编译时,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]。我真的不知道会发生什么!感谢任何愿意帮助我的人,请原谅我糟糕的英语。祝你有美好的一天!:)
android - 使用 apktools 编译 snapchat 安装失败
好的,所以我在使用 apktools 反编译 apk 时遇到了问题。我目前正在尝试编辑当前版本的 snapchat,这样我就可以在没有 root 的情况下拥有无限的字幕长度。为此,我使用 apktools 反编译了 apk,编辑了所需的 smali 文件,然后重新编译它,但由于某种原因它不会安装在手机上。
然后我尝试在没有任何编辑的情况下反编译和重新编译 apk,它也没有工作。
是否需要进行一些特殊的签名才能正确构建和安装应用程序?或者也许是我在 apktools 中缺少的东西?我已经反编译了许多其他 apk,它们运行良好,但 snapchat 没有。任何帮助表示赞赏,谢谢。
android - 如何更改 android 应用程序的完整包名称?
我已经用 Apktool 反编译了一个 voip 调用 apk 文件,我试图更改它的包名称,但我收到一个错误unfortunately app stopped
...
我所做的是在所有文件中搜索包名(root dir)
并replace every occurrence
使用新的包名搜索notepad ++
。
这是应用程序使用communicate their server
与包名称相同的问题,因此会导致错误"unfortunately stoped!!!
“
我怎样才能replace only that package name
不影响具有相同包名称的其他名称。
提前致谢。
android - 如何让应用程序自动重命名文件夹
我有一个应用程序...我想为该应用程序添加一个功能。功能是自动重命名 sdcard 中的文件夹。
它这样做。下载一个文件。然后它会自动提取到sd卡。那么有没有让它自动重命名呢?有smali的代码吗?
java - Android smali 版:设置 jpeg 质量?
你好这里的开发者。
最近我修改了 ColorOS Camera 的一个端口,使其可以在我的设备(小米 Mi4)上运行。实际上,这个应用程序仅适用于 XML 版本。但要解决的是这个应用程序使用默认的android jpeg压缩(在我的例子中jpegquality = 85%)
我刚决定修改 smali 文件来改变这一点。我已经修改了突发模式以捕获 100% 质量的 jpeg(将值 0x4B 更改为 0x64 以获得 100% 质量,而不是在突发模式下为 75% 并且它有效)当我尝试编辑其他行以获得 jpeg 质量 = 100% 时出现问题使用普通拍摄模式。
有人可以帮我解释一下吗?(请不要忘记我是一个初学者,我花了很多时间来尝试编辑)
这是 smali 代码(来自 CameraProcessManager.smali)
这是相应的 java 代码(我知道我无法编辑由 smali 制作的 java 代码,遗憾的是,这会更容易)来自 dex2jar :
这是德十工作室的另一个观点:
我想保留 jpegorentation 设置,但将 jpegquality 更改为始终为 100%
如果有人能够帮助我并给出一些解释,请提前非常感谢=)
android - 什么是 Smali Code Android
我将学习一点关于 Dalvik VM、dex 和 Smali 的知识。
我读过关于 smali 的文章,但仍然无法清楚地理解它在编译器链中的位置。以及它的目的是什么。
这里有一些问题:
- 据我所知,dalvik 作为其他虚拟机运行字节码,在 Android 的情况下它是 dex 字节码。
- 什么是smali?Android OS 或 Dalvik Vm 是否直接使用它,或者它只是相同的 dex 字节码但对人类来说更具可读性?
- 它是否类似于 Windows 的反汇编程序(如 OllyDbg)程序可执行文件由不同的机器代码(例如 D3、5F)组成,并且每个机器代码都有适当的汇编命令,但 Dalvik Vm 也是软件,所以 smali 是字节码的可读表示
- 有新的艺术环境。它仍然使用字节码还是直接执行本机代码?
先感谢您。
android - Smali 注入代码的最佳场所
我正在制作一个 python 脚本来为每个方法添加跟踪,以便能够在 logcat 中获取运行时方法调用。
我的应用程序总是崩溃,不要让我复制错误日志,因为这不是我的问题的重点。实际上,我尝试在注册声明之后立即注入我的代码:.locals
我第一次使用.registers
指令但由于本地和参数寄存器的别名而出错。
我当时认为我可以使用该.locals
指令,但它完全相同。
我进行的不同测试如下:
- 如果本地寄存器和参数寄存器之间的差异大于 2,我使用
v0
和v1
. - 否则,我将
.locals
指令增加 2 并使用v0
andv1
。
但我不断收到 VFY 错误。
为什么有时.locals
等于 0 但有参数p0
,例如。
p0
应该被别名v0
但.locals
为 0,那么为什么如果我将其更改为.locals
2 并且只使用v0
并且v1
我仍然得到 VFY?
我正在考虑在返回指令之前添加我的代码,至少我是否更改局部变量并不重要,只要它不是返回变量
编辑:@JesusFreke 感谢您的好评。
我目前正在尝试根据您的建议改进我的 python 脚本。所以我创建了一个CustomClass,我在根文件夹中复制,但事实是我循环遍历根文件夹中的所有方法,我得到存储到变量中的类和方法名称,然后我更改了这个参数的值函数,我在每个方法中调用它。
但事实是它不能工作,因为每次我输入一个新方法时静态函数的参数值都会改变,最后它只会保留我输入的最后一个方法的值。
在这种情况下,我需要生成与 smali 文件夹中的方法一样多的静态函数,大约 40.000...
这是我的代码的一部分:
还有我的 CustomClass 内容:
android - smali中添加trace的方法
到目前为止,我做了一个只有一种方法的 smali 类,以便logcat
为任何方法添加跟踪。我可以编译并启动应用程序,但该方法什么也没打印。
我有一个本地参数,tag
对于logcat
这个本地参数来说很简单v0
,我从要添加跟踪的方法中得到它。还有一个参数p0
。我相信有问题,但 dalvik 调试器没有打印任何错误,因此我不知道我的错误在哪里。
下面是我的代码。
这是我如何调用该方法的示例:
更进一步,我想知道是否有任何方法可以打印出方法的返回寄存器的值。
我知道 Java 中的每种类型的变量都继承自 Object 并且 Object 有一个方法toString()
,因此理论上应该可以自定义我的方法add_trace()
以在运行时获取返回的寄存器的值。有人可以帮我吗?
谢谢。