首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修改.smali文件

修改.smali文件
EN

Stack Overflow用户
提问于 2012-09-29 06:31:01
回答 4查看 26.3K关注 0票数 14

我对一些android apks进行了逆向工程,为功能测试添加了一些工具。我想知道下面给出的一个小例子,我怎么才能添加像这样的东西

代码语言:javascript
复制
Log.e(TAG, "some descritpion", e);

添加到.smali文件中的每个方法。

代码语言:javascript
复制
.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
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-29 07:37:04

调用Log.e()的实际代码相当简单。它将涉及到如下内容:

代码语言:javascript
复制
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

但是,您必须小心您使用的寄存器。您不希望损坏一个寄存器,该寄存器的值将在以后使用。

所以你有两个选择:

找到“安全的”未使用的寄存器,并使用那些(可以是tricky)

  • Increase的方法的寄存器计数,并使用新创建的寄存器)

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

例如,让我们以一个总共有5个寄存器(.registers 5)的方法为例,其中3个是参数寄存器。因此,您有v0和v1,它们是非参数寄存器,以及p0-p2,它们是3个参数寄存器,是v2-v4的别名。

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

票数 34
EN

Stack Overflow用户

发布于 2012-10-27 00:24:11

对寄存器的评论太大,无法对JesusFreke的回答进行评论。值得一提的是,如果您使用.local指令而不是.register指令,编号方案将会有所不同。粗略地说,指令之间的关系如下:

代码语言:javascript
复制
.registers = .locals + NUMBER_OF_PARAMETERS

因此,如果您有一个具有4个参数的函数,并且使用了另外3个寄存器,那么可能出现的指令是.registers 7.locals 3

您将按如下方式设置寄存器:

代码语言:javascript
复制
v0
v1
v2
v3 <==> p0
v4 <==> p1
v5 <==> p2
v6 <==> p3

来源:https://github.com/JesusFreke/smali/wiki/Registers

票数 13
EN

Stack Overflow用户

发布于 2013-08-02 20:06:52

添加smali代码的一种更简单的方法是在测试android应用程序中编写java代码。使用apktool进行反汇编。查看smali文件以识别smali代码,并将其用于注入到您已反汇编的其他应用程序中。

点击此处下载apktool:http://ibotpeaches.github.io/Apktool/

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12648196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档