一看android的源代码
1)将Apkdapk 用zip解压后,出现了一个classesdex文件
2014/02/19 19:42
2014/02/19 19:42
2014/02/19 15:35 1,656 AndroidManifestxml
2014/02/19 15:35 687,024 classesdex
2014/02/19 15:49
META-INF
2014/02/19 15:49
res
2014/02/19 15:35 2,200 resourcesarsc
2)进入到dex2jar目录中,运行情况如下:
D:\developer\tools\test_apk\dex2jar-00915>dex2jarbat "\Apkd(d2j)\classesd
ex"
this cmd is deprecated, use the d2j-dex2jar if possible
dex2jar version: translator-00915
dex2jar \Apkd(d2j)\classesdex -> \Apkd(d2j)\classes_dex2jarjar
Done
在apk所在的目录会出现 classes_dex2jarjar 文件。
3) 用JD-GUI对jar包进行查看,可以查看源文件
二反编译apk
1在 下载 APKTOOL中的三个文件(aaptexe、apktoolbat、apktooljar)解压缩到你的Windows安装目录下,以方便使用Dos命令
2012/12/06 11:44 854,016 aaptexe
2014/02/19 17:15 277,372 Apkdapk //示例用 apk文件
2012/12/23 23:39 92 apktoolbat
2013/02/03 02:37 2,655,843 apktooljar
2进入到apktoolbat所在的目录,运行:
apktool d Apkdapk decode_dir
反编译后,decode_dir目录下的内容如下:
2014/02/19 17:16 716 AndroidManifestxml
2014/02/19 17:16 237 apktoolyml
2014/02/19 17:18
build
2014/02/19 17:16
res
2014/02/19 17:16
smali
此时我可以查看原文件AndroidManifestxml了,也是查看smali源文件(是用smali语言写的,可以对照java看)。
三APKTOOL的使用
1)decode
该命令用于进行反编译apk文件,一般用法为
apktool d
代表了要反编译的apk文件的路径,最好写绝对路径,比如C:\MusicPlayerapk
代表了反编译后的文件的存储位置,比如C:\MusicPlayer
如果你给定的已经存在,那么输入完该命令后会提示你,并且无法执行,需要你重新修改命令加入-f指令
apktool d –f
这样就会强行覆盖已经存在的文件
2)build
该命令用于编译修改好的文件,一般用法为
apktool b
这里的
就是刚才你反编译时输入的
(如C:\MusicPlayer),输入这行命令后,如果一切正常,你会发现C:\MusicPlayer内多了2个文件夹build和dist,其中分别存储着编译过程中逐个编译的文件以及最终打包的apk文件。
3)install-framework
该命令用于为APKTool安装特定的framework-resapk文件,以方便进行反编译一些与ROM相互依赖的APK文件。具体情况请看常见问题
四smali与java源码对照,并做出相应的修改
java源代码:
import androidosBundle;
import androidappActivity;
import androidviewMenu;
import androidwidget;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_main);
TextView a = (TextView)thisfindViewById(Ridtest) ;
asetText("raoliang");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present
getMenuInflater()inflate(Rmenumain, menu);
return true;
}
}
对应的smali源代码:
class public Lali/text/apkd/MainActivity;
super Landroid/app/Activity;
source "MainActivityjava"
# direct methods
method public constructor ()V
locals 0
prologue
line 8
invoke-direct {p0}, Landroid/app/Activity;->()V
return-void
end method
# virtual methods
method protected onCreate(Landroid/os/Bundle;)V
locals 2
parameter "savedInstanceState"
prologue
line 12
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
line 13
const/high16 v1, 0x7f03
invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->setContentView(I)V
line 14
const/high16 v1, 0x7f08
invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->findViewById(I)Landroid/view/View;
move-result-object v0
check-cast v0, Landroid/widget/TextView;
line 15
local v0, a:Landroid/widget/TextView;
const-string v1, "raoliang"
invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
line 16
return-void
end method
method public onCreateOptionsMenu(Landroid/view/Menu;)Z
locals 2
parameter "menu"
prologue
line 21
invoke-virtual {p0}, Lali/text/apkd/MainActivity;->getMenuInflater()Landroid/view/MenuInflater;
move-result-object v0
const/high16 v1, 0x7f07
invoke-virtual {v0, v1, p1}, Landroid/view/MenuInflater;->inflate(ILandroid/view/Menu;)V
line 22
const/4 v0, 0x1
return v0
end method
通过对比可以看到,常量是没有必变的,可以根据的smali的语法,进行相应的修改
五3、打包、签名和安装修改后的apk
修改完了,就可以打包回apk了。执行以下命令:
apktool b decode_dir
在mygame目录下的dist在会看到打包好的apk。
当然,现在一般是无法安装的,因为apk还没有签名。下面就来签名。签名需要keystore文件,我已经有专用的keystore了,如果还没有,请参阅这里进行生成。
执行以下命令为重新编译的my_gameapk签名:
jarsigner -verbose -keystore demokeystore Apkdapk demokeystore
最后,在安装到手机前,需要把手机中的已有版本先卸载,因为如果签名不同,是不能覆盖安装的,会提示“应用程序未安装”错误。
完整的运行情况如下:
D:\developer\tools\test_apk\new\decode\dist>keytool -genkey -alias demokeystore -keyalg RSA -validity 40000 -keystore demokeystore
输入keystore密码:
再次输入新密码:
您的名字与姓氏是什么?
[Unknown]: rao
您的组织单位名称是什么?
[Unknown]: rao
您的组织名称是什么?
[Unknown]:
您所在的城市或区域名称是什么?
[Unknown]:
您所在的州或省份名称是什么?
[Unknown]:
该单位的两字母国家代码是什么
[Unknown]:
CN=rao, OU=rao, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 正确吗?
[否]: y
输入的主密码
(如果和 keystore 密码相同,按回车):
D:\developer\tools\test_apk\new\decode\dist>jarsigner -verbose -keystore demokeystore Apkdapk demokeystore
输入密钥库的口令短语:
正在添加: META-INF/MANIFESTMF
正在添加: META-INF/DEMO_KEYSF
正在添加: META-INF/DEMO_KEYRSA
正在签名: res/drawable-hdpi/ic_launcherpng
正在签名: res/drawable-mdpi/ic_launcherpng
正在签名: res/drawable-xhdpi/ic_launcherpng
正在签名: res/drawable-xxhdpi/ic_launcherpng
正在签名: res/layout/activity_mainxml
正在签名: res/menu/mainxml
正在签名: AndroidManifestxml
正在签名: classesdex
正在签名: resourcesarsc
D:\developer\tools\test_apk\new\decode\dist>
到此为止,修改后的apk可以正常的安装了,不过,在安装之前,必须要先卸载以前的apk,不能直接替换(因为签名不一样)
APK文件是用专业软件eclipse编译生成的文件包。在网上可以找到许多软件来对APK的内容进行反编译,例如:可以通过AXMLPrinter2工具和命令:java -jar AXMLPrinter2jar AndroidManifestxml 解开在apk中的AndroidManifestxml。最近,业界有一个功能强大的解包打包工具包apktool,可以在Windows下用来方便快速地对APK文件进行解包和打包,给修改和编辑工作带来许多方便。下面来介绍它的使用。1) APKtool软件包APKtool软件包有2个程序组成:apktooljar 和 aaptexe另外提供一个批处理文件:apktoolbat,其内容为:java -jar "%~dp0\apktooljar" %1 %2 %3 %4 %5 %6 %7 %8 %9运行apktoolsjar需要java环境(160版本以上)。apktooljar用于解包,apktooljar和aaptexe联合用于打包。2) APK文件的解包下面以解开Contactsapk为例。首先把Contactsapk Copy到当前工作目录下(例:Test)。在DOS下打入命令apktool d Contactsapk ABC这里“d”表示要解码。Contactsapk是要解包的APK文件。ABC是子目录名。所有解包的文件都会放在这个子目录内。3) APK文件的打包在DOS下打入命令apktool b ABC New-Contactsapk这里“b”表示要打包ABC是子目录名,是解包时产生的子目录,用来存放所有解包后的和修改后的文件。New-Contactsapk是打包后产生的新的APK文件。4) Framework框架文件在解开APK文件时,apktool需要框架文件(framework-resapk)来解码和打包。Apktool已经包含了标准的框架,所以在大多数APK文件的解包时,不需要另外提供框架文件。但是,某些制造商使用了他们自己的框架文件,为了解包,就不得不从手机中把框架文件(framework-resapk)提取出来,然后安装到计算机。安装命令是:apktool if framework-resapk 安装后就会得到:~\apktool\framework\1apk5) 解包、解包和签名批处理在实际使用时,可能对多个APK文件进行处理。方便的做法是写成批处理文件。打包和签名可以一次完成。解包批处理命令:for %%i in (apk) do java -jar apktooljar d %%i _%%i && move _%%i Modifying_Files && copy %%i Backuped_Raw_Files && @echo File [%%i] unpacking process is completed!打包和签名批处理命令:for /d %%i in () do cd && java -jar apktooljar b Modifying_Files\%%i && java -jar signapkjar testkeyx509pem testkeypk8 Modifying_Files\%%i\dist\apk %%i && ren %%i New%%i && move New%%i Modified_Signed_Files && @echo %%i Complete repacking and Signing! && cd Modifying_Files
这个确实很困难。如果是DOS程序还好办,如果是Windows程序,其反汇编的工作量相当巨大。而且这仅是反汇编,得到的只是勉强能用的汇编代码,而从汇编代码再反工程到C,真的是件很困难的事。程序简单还好办,复杂的就真是件费力的事了。放弃吧。
如果是自己写的程序,只要整个设计还记得,那就重新写一遍吧。
以上就是关于如何反编译android应用并重新打包全部的内容,包括:如何反编译android应用并重新打包、怎样反编译 Android APK、用C语言编写了一个程序,源代码和工程文件都弄丢了,只剩下.exe的二进制程序文件。怎么反编译出.c等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)