ios a静态库 能反编译吗

ios a静态库 能反编译吗,第1张

.a静态库不能进行反编译,反汇编的可能性也极低。

静态库:静态库仅在程序启动时被连接使用,程序运行时将不再需要该静态库。

与静态库相对的是动态库:程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

一、dexdump方法

dexdump是emulator自带提供的查看dex文件的工具,可使用类似这样的命令将dex文件dump到txt文件中:

D:\Program Files\android-sdk-windows-1.6_r1\platforms\android-1.6\tools>dexdump.exe -d classes.dex >spk.dump.txt

得到的文件内容,描述了类的信息,但实在是不好读啊~~~~

二、dex2jar + XJad 方法

该方法是使用dex2jar.jar包,将classes.dex文件解包成jar,在通过XJad(或者其他class反编译工具)进行java反编译。如:

1、dex2jar.bat d:\play\classes.dex

默认的输出路径同classes.dex,生成的文件名为classes.dex.dex2jar.jar

2、使用XJad反编译该jar包

之后的使用方法,大家都懂的:)

该方法的好处在于,通过XJad反编译后,大家可直接开到java源文件,缺点在于只能反编译出开发时的java文件,而开发时使用的lib包不能反编译出来。

三、AXMLPrinter2.jar + baksmali.jar + smali.jar 方法

这个方法就强大了,AXMLPrinter2是还原AndroidManifest.xml和main.xml的工具,直接打开这两个xml文件是乱码,而通过还原之后,可以很明白的看到里面的内容(我猜测还是使用了字节异或的方式加的密)。

baksmali.jar是反解析dex的工具,smali.jar则是再还原成dex的工具

*** 作方式如下:

1、java -jar AXMLPrinter2.jar D:\play\AndroidManifest.xml >AndroidManifest.txt

2、java -jar AXMLPrinter2.jar D:\play\res\layout\main.xml >main.txt

3、java -jar baksmali-1.2.5.jar -o classout/ d:\play\classes.dex

baksmali可解析(注意,是解析,不是反编译)原java包以及引用的lib包,解析出的文件认真看还是能看懂,比如以下片段:

view plaincopy to clipboardprint?

.class Lcom/paul/test/a

.super Landroid/view/View

# static fields

.field private static final a:Landroid/graphics/Typeface

# instance fields

.field private b:I

.field private c:I

.field private d:Z

.field private e:J

.field private f:I

.field private l:[Ljava/lang/String

# direct methods

.method static constructor ()V

.registers 2

sget-object v0, Landroid/graphics/Typeface->SANS_SERIF:Landroid/graphics/Typeface

const/4 v1, 0x0

invoke-static {v0, v1}, Landroid/graphics/Typeface->create(Landroid/graphics/TypefaceI)Landroid/graphics/Typeface

move-result-object v0

sput-object v0, Lcom/wiyun/ad/a->a:Landroid/graphics/Typeface

return-void

.end method

#

# other methods ..........

#

# virtual methods

.method public onKeyUp(ILandroid/view/KeyEvent)Z

.registers 4

const/16 v0, 0x42

if-eq p1, v0, :cond_8

const/16 v0, 0x17

if-ne p1, v0, :cond_b

:cond_8

invoke-direct {p0}, Lcom/paul/test/a->d()V

:cond_b

const/4 v0, 0x0

invoke-virtual {p0, v0}, Lcom/paul/test/a->setPressed(Z)V

invoke-super {p0, p1, p2}, Landroid/view/View->onKeyUp(ILandroid/view/KeyEvent)Z

move-result v0

return v0

.end method

.class Lcom/paul/test/a

.super Landroid/view/View

# static fields

.field private static final a:Landroid/graphics/Typeface

# instance fields

.field private b:I

.field private c:I

.field private d:Z

.field private e:J

.field private f:I

.field private l:[Ljava/lang/String

# direct methods

.method static constructor ()V

.registers 2

sget-object v0, Landroid/graphics/Typeface->SANS_SERIF:Landroid/graphics/Typeface

const/4 v1, 0x0

invoke-static {v0, v1}, Landroid/graphics/Typeface->create(Landroid/graphics/TypefaceI)Landroid/graphics/Typeface

move-result-object v0

sput-object v0, Lcom/wiyun/ad/a->a:Landroid/graphics/Typeface

return-void

.end method

#

# other methods ..........

#

# virtual methods

.method public onKeyUp(ILandroid/view/KeyEvent)Z

.registers 4

const/16 v0, 0x42

if-eq p1, v0, :cond_8

const/16 v0, 0x17

if-ne p1, v0, :cond_b

:cond_8

invoke-direct {p0}, Lcom/paul/test/a->d()V

:cond_b

const/4 v0, 0x0

invoke-virtual {p0, v0}, Lcom/paul/test/a->setPressed(Z)V

invoke-super {p0, p1, p2}, Landroid/view/View->onKeyUp(ILandroid/view/KeyEvent)Z

move-result v0

return v0

.end method

认真一看,就知道:

# static fields 定义静态变量的标记

# instance fields定义实例变量的标记

# direct methods 定义静态方法的标记

# virtual methods 定义非静态方法的标记

以onKeyUp方法为例,其中定义了处理逻辑,if-eq p1, v0, :cond_8 表示如果p1和v0相等,则执行cond_8的流程:

:cond_8

invoke-direct {p0}, Lcom/paul/test/a->d()V

调用com.paul.test.a的d()方法

不相等: if-ne p1, v0, :cond_b 则执行cond_b的流程:

:cond_b

const/4 v0, 0x0

invoke-virtual {p0, v0}, Lcom/paul/test/a->setPressed(Z)V

invoke-super {p0, p1, p2}, Landroid/view/View->onKeyUp(ILandroid/view/KeyEvent)Z

move-result v0

大概意思就是调用com.paul.test.a的setPressed方法,然后再调用父类View的onKeyUp方法

最后 return v0

该方法,能把外部引用的lib包类也解析出来,能开到包的全貌。缺点在于,解析出的smali文件并不是反编译出的java文件,可读性降低了,但仔细研究也能看出大概。

apktool反编译xml等资源文件:

a. 安装java环境,下载文件件附件:apktool-1.3.1.tar.bz2,apktool-install-windows-2.2_r01-2.tar.bz2;把这两个文件解压到同一目录下,该目录cmd中运行apktool获得帮助信息;

b. apktool d XXX.apk ABC : 反编译XXX.apk到文件夹ABC

c. apktool b ABC :从反编译后的文件夹ABC重建APK,输出到ABC\dist\out.apk(该apk没有签名)

d. 这样我们就可以把远apk文件通过反编译后,然后对里面资源文件作修改,然后再重建为apk即可;


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11516961.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存