gpt4 book ai didi

android - 修改 .smali 文件

转载 作者:可可西里 更新时间:2023-11-01 19:09:04 25 4
gpt4 key购买 nike

我对一些 android apk 进行了逆向工程,以添加一些用于功能测试的工具。我想知道给定一个 smali,如下所示,我该如何添加类似

的内容
Log.e(TAG, "some descritpion", e);

.smali 文件中的每个方法。

.class public Ld;
.super Landroid/view/View;
.source "SourceFile"


# instance fields
.field a:Z

.field b:Lcom/rovio/ka3d/App;


# direct methods
.method public constructor <init>(Lcom/rovio/ka3d/App;)V
.locals 2
.parameter

.prologue
const/4 v1, 0x1

.line 317
invoke-direct {p0, p1}, Landroid/view/View;-><init>(Landroid/content/Context;)V

.line 313
const/4 v0, 0x0

iput-boolean v0, p0, Ld;->a:Z

.line 314
const/4 v0, 0x0

iput-object v0, p0, Ld;->b:Lcom/rovio/ka3d/App;

.line 318
iput-object p1, p0, Ld;->b:Lcom/rovio/ka3d/App;

.line 319
invoke-virtual {p0, v1}, Ld;->setFocusable(Z)V

.line 320
invoke-virtual {p0, v1}, Ld;->setFocusableInTouchMode(Z)V

.line 321
return-void
.end method


# virtual methods
.method public a(Z)V
.locals 4
.parameter

.prologue
const/4 v3, 0x0

.line 325
invoke-virtual {p0}, Ld;->getContext()Landroid/content/Context;

move-result-object v0

const-string v1, "input_method"

invoke-virtual {v0, v1}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;

move-result-object v0

check-cast v0, Landroid/view/inputmethod/InputMethodManager;

.line 326
invoke-virtual {p0}, Ld;->getWindowToken()Landroid/os/IBinder;

move-result-object v1

invoke-virtual {v0, v1, v3}, Landroid/view/inputmethod/InputMethodManager;->hideSoftInputFromWindow(Landroid/os/IBinder;I)Z

.line 327
if-eqz p1, :cond_0

.line 329
invoke-virtual {p0}, Ld;->getWindowToken()Landroid/os/IBinder;

move-result-object v1

const/4 v2, 0x2

invoke-virtual {v0, v1, v2, v3}, Landroid/view/inputmethod/InputMethodManager;->toggleSoftInputFromWindow(Landroid/os/IBinder;II)V

.line 330
invoke-virtual {p0}, Ld;->requestFocus()Z

.line 333
:cond_0
iput-boolean p1, p0, Ld;->a:Z

.line 334
return-void
.end method

.method public onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection;
.locals 3
.parameter

.prologue
.line 343
new-instance v0, La;

iget-object v1, p0, Ld;->b:Lcom/rovio/ka3d/App;

const/4 v2, 0x0

invoke-direct {v0, v1, p0, v2}, La;-><init>(Lcom/rovio/ka3d/App;Landroid/view/View;Z)V

.line 345
const/4 v1, 0x0

iput-object v1, p1, Landroid/view/inputmethod/EditorInfo;->actionLabel:Ljava/lang/CharSequence;

.line 350
const v1, 0x80090

iput v1, p1, Landroid/view/inputmethod/EditorInfo;->inputType:I

.line 351
const/high16 v1, 0x1000

iput v1, p1, Landroid/view/inputmethod/EditorInfo;->imeOptions:I

.line 352
return-object v0
.end method

最佳答案

调用 Log.e() 的实际代码相当简单。这将涉及类似的事情:

const-string v0, "MyTag"
const-string v1, "Something to print"
# assuming you have an exception in v2...
invoke-static {v0, v1, v2}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I

但是,您必须谨慎使用所使用的寄存器。您不想破坏具有稍后将使用的值的寄存器。

所以你有两个选择:

  1. 找到“安全”未使用的寄存器,并使用它们(可能很棘手)
  2. 增加方法的寄存器数,并使用新创建的寄存器

对于数字 2,唯一的问题是新寄存器不在寄存器范围的末尾 - 它们实际上就在参数寄存器之前。

例如,假设一个方法总共有 5 个寄存器 (.registers 5),其中 3 个是参数寄存器。所以你有 v0 和 v1,它们是非参数寄存器,p0-p2 是 3 个参数寄存器,并且是 v2-v4 的别名。

如果您需要添加额外的 2 个寄存器,您可以将其增加到 .registers 7。参数寄存器位于寄存器范围的末尾,因此 p0-p2 现在别名为 v4-v6,而 v2 和 v3 是可以安全使用的新寄存器。

关于android - 修改 .smali 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12648196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com