使用axmlprinter2,smali,baksmali来实现android 编译,反编 -凯发k8网页登录

posts - 310, comments - 6939, trackbacks - 0, articles - 3
  凯发k8网页登录-凯发天生赢家一触即发官网 :: 凯发k8网页登录首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

一、前言:
诸如layout里的布局及权限文件 (androidmanifest.xml)已经是一堆乱码了,完全看不懂,想看看别人是怎么布局的都不容易。还有源代码都被编译成了 classes.dex,完全看不出什么线索。基于以上的困惑,笔者给大家分享一下android中的拿来主义。

二、所需工具(点击各自连接进入下载页面):

1.axmlprinter2.jar

2.baksmali.jar

3.smali.jar

资源下载地址:

三、准备工作

为了方便起见,作者把axmlprinter2.jar, 还有baksmali.jar,还有smali.jar(下下来为了方便重命名),放在android sdk tools文件夹中如下图所示:

四、开始拿来主义1.用 axmlprinter2.jar查看apk中的布局xml文件:apkinstaller应用生成的apkinstaller.apk(为了方便起见放到tools目录里)用winrar等 工具打开,将res/layout/main.xml解压出来(也还是放在tools目录里哦)打开main.xml文件,内容如下(一堆天文):

这时候axmlprinter2.jar派上用场了,打开cmd终端,一直进入到tools目录下,输入如下命令:java -jar axmlprinter2.jar main.xml > main.txt. 

打开main.txt代码如下:

 
    xmlns:android="" 
    android:orientation="1" 
    android:layout_width="-1" 
    android:layout_height="-1" 
    > 
            android:id="@7f050000" 
        android:layout_width="-1" 
        android:layout_height="-2" 
        > 
     

为了比对打开源程序中的main.xml代码如下(大家比对一下吧):

 
http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    android:id="@ id/apk_web" 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent" 
     
/> 

2.用baksmali.jar反编译classes.dex:将apkinstaller.apk里的classes.dex解压到tools目录里,然后baksmali.jar就派上用场了,在cmd命令行里输入如下命令:java -jar baksmali.jar -o classout/ classes.dex .

下面我们看一下apkinstaller.smali内容是什么,如以下代码:

.class public lcom/tutor/apkinstaller/apkinstaller; 
.super landroid/app/activity; 
.source "apkinstaller.java" 
# instance fields 
.field private apkweb:landroid/webkit/webview; 
# direct methods 
.method public constructor ()v 
    .registers 1 
    .prologue 
    .line 8 
    invoke-direct {p0}, landroid/app/activity;->()v 
    return-void 
.end method 
# virtual methods 
.method public oncreate(landroid/os/bundle;)v 
    .registers 5 
    .parameter "savedinstancestate" 
    .prologue 
    .line 13 
    invoke-super {p0, p1}, landroid/app/activity;->oncreate(landroid/os/bundle;)v 
    .line 14 
    const/high16 v2, 0x7f03 
    invoke-virtual {p0, v2}, lcom/tutor/apkinstaller/apkinstaller;->setcontentview(i)v 
    .line 15 
    const/high16 v2, 0x7f05 
    invoke-virtual {p0, v2}, lcom/tutor/apkinstaller/apkinstaller;->findviewbyid(i)landroid/view/view; 
    move-result-object v2 
    check-cast v2, landroid/webkit/webview; 
    iput-object v2, p0, lcom/tutor/apkinstaller/apkinstaller;->apkweb:landroid/webkit/webview; 
    .line 16 
    iget-object v2, p0, lcom/tutor/apkinstaller/apkinstaller;->apkweb:landroid/webkit/webview; 
    invoke-virtual {v2}, landroid/webkit/webview;->getsettings()landroid/webkit/websettings; 
    move-result-object v1 
    .line 17 
    .local v1, websettings:landroid/webkit/websettings; 
    const/4 v2, 0x1 
    invoke-virtual {v1, v2}, landroid/webkit/websettings;->setjavascriptenabled(z)v 
    .line 19 
    const-string v0, "" 
    .line 20 
    .local v0, apkurl:ljava/lang/string; 
    iget-object v2, p0, lcom/tutor/apkinstaller/apkinstaller;->apkweb:landroid/webkit/webview; 
    invoke-virtual {v2, v0}, landroid/webkit/webview;->loadv 
    .line 21 
    return-void 
.end method 

同样为了比对我们看一下apkinstaller.java的源代码如下:

package com.tutor.apkinstaller; 
import android.app.activity; 
import android.os.bundle; 
import android.webkit.websettings; 
import android.webkit.webview; 
public class apkinstaller extends activity { 
    
    private webview apkweb; 
    @override 
    public void oncreate(bundle savedinstancestate) { 
        super.oncreate(savedinstancestate); 
        setcontentview(r.layout.main); 
       apkweb = (webview)findviewbyid(r.id.apk_web); 
       websettings websettings = apkweb.getsettings(); 
       websettings.setjavascriptenabled(true); 
       
       string apkurl = ""; 
       apkweb.load; 
    } 

我相信大家 已经能看出来门道来了吧,hoho~3.用smali.jar编译classout成classes.dex:我们上一步已经将classes.dex反编译成了.smali文件,好了,我们看看smali文件看够了,在偿试把它编译成classes.dex吧,输入如下命令:java -jar smali.jar classout/ -o

我们可以将新生成的classes.dex塞入apkinstaller.apk里覆盖原来的classes.dex文件,这样我们的apk还是一样能用的哦


评论

# re: 使用axmlprinter2,smali,baksmali来实现android 编译,反编  回复     

2011-03-30 15:43 by
很详细啦

# re: 使用axmlprinter2,smali,baksmali来实现android 编译,反编  回复     

2011-11-16 14:35 by
楼猪真垃圾,转贴也图片没转

只有注册用户后才能发表评论。


网站导航:
              
 
网站地图