首页 >> 互联网 >

Android(apk反编译基础(apktoos)图文教程)

2022-09-18 01:54:29 来源: 用户: 

大家好,小太来为大家解答以上问题。Android,apk反编译基础(apktoos)图文教程这个很多人还不知道,现在让我们一起来看看吧!

长期以来,我在广工图书馆主页上写了一个类似爬虫的demo(因为没有接口,只能取静态网页)来实现一些图书馆系统的一些功能。但是最近发现库系统篡改了html页面,在一个html页面中嵌入了上千行评论,并且有自己的App,应该是为了增加抓取的流量成本,防止别人抓取网页。但是,加评论就不讨人喜欢了。内网访问速度还可以,外网访问体验很差。

如下图:一堆评论,导致一个网页需要2MB。

首页的APP必须使用库的后台接口与服务器交互,所以我想试试反编译,看看APP用的是什么接口。(另外,更简单的是用tcpdump对Android手机进行抓包并分析其接口,再用Wireshark分析tcp包。但是如果想知道所有的接口,可能需要一个一个的调用,会比较麻烦。采用反编译,你可能会在一个类里找到这些接口)。

一、首先要准备的工具:(更多反编译工具可以去Snow论坛下载或者学习-链接)。APK工具是GOOGLE提供的APK编译工具,需要JAVA运行环境。你可以反编译APK,可以用来反编译成非常接近打包前的原始格式。将AndroidManifest.xml、资源文件resources.arsc、dex文件反编译成可以调试的smali文件。修改后可以编译回apk文件。APKTool还可以用来汉化Android软件,然后重新打包发布。官方:http://code.google.com/p/android-apktool/

解压APKTool,把要反编译的APK放到目录中。

反编译:通过CMD进入上述目录,执行命令:apktooldecodezhaobenShu.apkoutdir。

稍等片刻完成反编译,反编译后的文件会在outdir目录下。

-outdir目录结构

Res:资源文件,基本和adnroid项目目录中的res一样,各种UI图片XML布局文件valuesxml文件(另外还有一个public.xml,上面有每个资源的id号(R.java中的ID))smail:这是一个key文件夹,里面有Smail格式文件,是Dalvik虚拟机执行的操作码(Dalvikopcodes)。如果有,这些操作有它们自己的语法吗?Androidmanifest.XML:Android项目下的AndroidManifest.xmlapktool.yml:用于重新打包。

二、smail语法:(全部语法请link)

smail中的数据类型签名与java中的相同,如下所示。

b-byteC-charD-doubleF-floatI-intJ-longS-shortv-voidZ-boolean[XXX-arraylxxx/yyy-object

三、smail代码例子:

乍一看,smail文件可能感觉有点乱。但是,只要你懂几个语法,就可以很好的阅读smail文件。Smail把常用的语法(不是全部)比较成:赋值、取值、函数调用、if语句、返回值等。赋值取值:例子:iget-objectV6,p0,Lcom/zbsh/code/class/classsystem$9;-val$vBarCodes:Ljava/util/ArrayList;

四、分析:

Iget值操作,i=instance,用于实例字段(实例变量),object表示类。V6是局部寄存器,p0在这里代表这个(在非静态函数中代表这个,在静态函数中代表第一个参数)。LCOM/ZBSH/CODE/CLASS/ClassSystem是CLASSsystem类,包路径为LCOM/ZBSH/CODE/CLASS,-箭头操作符相当于C/C,后跟类中的变量或方法。vBarCodes是CLASSSYSTEM中的变量,Ljava/util/ArrayList是vBarCodes的类型(java中类的签名)。

五、作用:

ClassSystem中vBarCodes的值存储在寄存器v6中。vBarCodes的类型必须是对象,并且是实例变量和非静态变量。其中object可以替换为基本数据类型:iget-booleaniget-byteiget-chariget-short等等。

六、同样的

Sgt-[type]用于获取静态变量。(缺少一个p0,因为静态变量没有这个)

Aget-[type]用于获取数组类型。

[x]获取vx,vy,并将寄存器vy中的值赋给vx。

七、赋值:

同样都有以下几种:iput-[type]sput-[type]aput-[type]也支持寄存器和寄存器之间的赋值,寄存器和变量之间的赋值调用-直接调用私人的函数调用-超级调用父类函数调用-静态调用静态函数调用-虚拟用于调用保护或公众的函数(相当于C的虚函数,java的重载函数,只有保护和公众的能够重载)还有一种比较特殊的:调用-

本文到此结束,希望对大家有所帮助。

  免责声明:本文由用户上传,与本网站立场无关。财经信息仅供读者参考,并不构成投资建议。投资者据此操作,风险自担。 如有侵权请联系删除!

 
分享:
最新文章
站长推荐