‘壹’ 求教安卓apk反编译,添加广告教程
工具:
apktool,作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看
dex2jar,作用:将apk反编译成java源码(classes.dex转化成jar文件)
jd-gui,作用:查看APK中classes.dex转化成出的jar文件,即源码文件
反编译流程:
一、apk反编译得到程序的源代码、图片、XML配置、语言资源等文件
下载上述工具中的apktool,解压得到3个文件:aapt.exe,apktool.bat,apktool.jar ,将需要反编译的APK文件放到该目录下,
打开命令行界面(运行-CMD) ,定位到apktool文件夹,输入以下命令:apktool.bat d -f test.apk test
(命令中test.apk指的是要反编译的APK文件全名,test为反编译后资源文件存放的目录名称,即为:apktool.bat d -f [apk文件 ] [输出文件夹])
获取成功之后,发现在文件夹下多了个test文件,点击便可以查看该应用的所有资源文件了。
如果你想将反编译完的文件重新打包成apk,那你可以:输入apktool.bat b test(你编译出来文件夹)便可
之后在之前的test文件下便可以发现多了2个文件夹:
build
dist(里面存放着打包出来的APK文件)
二、Apk反编译得到Java源代码
下载上述工具中的dex2jar和jd-gui ,解压
将要反编译的APK后缀名改为.rar或则 .zip,并解压,得到其中的额classes.dex文件(它就是java文件编译再通过dx工具打包而成的),将获取到的classes.dex放到之前解压出来的工具dex2jar-0.0.9.15 文件夹内,
在命令行下定位到dex2jar.bat所在目录,输入dex2jar.bat classes.dex,
在改目录下会生成一个classes_dex2jar.jar的文件,然后打开工具jd-gui文件夹里的jd-gui.exe,之后用该工具打开之前生成的classes_dex2jar.jar文件,便可以看到源码了
‘贰’ 如何实现APK的反编译得到APK的源码
最新的反编译不用此方法, 有最新的一键自动反编译工具:
这段时间在学android应用开发,在想既然是用Java开发的应该很好反编译从而得到源代码吧,google了一下,确实很简单,以下是我的实践过程。
在此郑重声明,贴出来的目的不是为了去破解人家的软件,完全是一种学习的态度,不过好像通过这种方式也可以去汉化一些外国软件。
注:本Android反编译教程,在Windows7-Ultimate-64bit操作系统上,测试通过!
下述所需的反编译工具包 下载
一、反编译Apk得到Java源代码
首先要下载两个工具:dex2jar和JD-GUI
前者dex2jar是将apk中的classes.dex转化成Jar文件,而JD-GUI是一个反编译工具,可以直接查看Jar包的源代码。以下是下载地址:
dex2jar:http://laichao.googlecode.com/files/dex2jar-0.0.7-SNAPSHOT.zip
JD-GUI:http://laichao.googlecode.com/files/jdgui.zip
具体步骤:
首先将apk文件,将后缀改为zip,解压,得到其中的classes.dex,它就是java文件编译再通过dx工具打包而成的;
解压下载的dex2jar,将classes.dex复制到dex2jar.bat所在目录。在命令行下定位到dex2jar.bat所在目录(在DOS命令下CD 目录)
运行
dex2jar.bat classes.dex
生成
classes.dex.dex2jar.jar
生成jar文件的截图如下:
运行JD-GUI(jd-gui.exe),打开上面生成的jar包,即可看到源代码了
HelloAndroid源码(编译前的apk源码对照)如下:
二、反编译apk生成程序的源代码和图片、XML配置、语言资源等文件
如果是汉化软件,这将特别有用。首先还是下载工具,这次用到的是apktool
下载地址:http://code.google.com/p/android-apktool/downloads/list
下载:apktool1.4.1.tar.bz2 和 apktool-install-windows-r04-brut1.tar.bz2(两个包都下载)
具体步骤:
将下载的两个包解压到同一个文件夹下,应该会有三个文件:aapt.exe,apktool.bat,apktool.jar
在命令行下定位到apktool.bat文件夹,输入以下命令:apktool d C:\*.apk C:\*文件夹,如下图:
命令行解释:apktool d [apk文件 ] [输出文件夹]
反编译的文件如下(AndroidManifest.xml为例):
特别注意:你要反编译的文件一定要放在C盘的根目录里(其实不用放在C盘根目录也行)
例如:在D盘目录D:\apktool1.4.1
cd /d D:\apktool1.4.1 //切换到D盘目录,包含HelloAndroid.apk以及aapt.exe,apktool.bat,apktool.jar三个文件
apktool.bat d -f HelloAndroid.apk HelloAndroid // apktool反编译命令,注意 d和
-f 的写法
将反编译完的文件重新打包成apk,很简单,输入apktool b c:\***文件夹(你编译出来文件夹)即可,命令如下:这个主意你文件所在盘
打包apk后的文件在目录C:\HelloAndroid下,生成了两个文件夹:
build
dist
其中,打包生成的HelloAndroid.apk,在上面的dist文件夹下,Ok
最后,再介绍一款刚出来的反编译工具 Androidfby ,它是一款对上述步骤进行了封装的图形界面工具,下载地址
但是,针对部分签名的apk,无法实现反编译,但本博客方法则仍然可以反编译成功!仅供参考使用
另外,作为应用开发者,肯定不希望自己的代码被反编译的,下一遍博客将讲述如何通过混淆代码防止被别人反编译
Android如何防止apk程序被反编译
作为Android应用开发者,不得不面对一个尴尬的局面,就是自己辛辛苦苦开发的应用可以被别人很轻易的就反编译出来。
Google似乎也发现了这个问题,从SDK2.3开始我们可以看到在android-sdk-windows\tools\下面多了一个proguard文件夹
proguard是一个java代码混淆的工具,通过proguard,别人即使反编译你的apk包,也只会看到一些让人很难看懂的代码,从而达到保护代码的作用。
下面具体说一说怎么样让SDK2.3下的proguard.cfg文件起作用,先来看看android-sdk-windows\tools\lib\proguard.cfg的内容:
[html] view
plainprint?
1. -optimizationpasses 5
2. -dontusemixedcaseclassnames
3. -
4. -dontpreverify
5. -verbose
6. -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
7.
8. -keep public class * extends android.app.Activity
9. -keep public class * extends android.app.Application
10. -keep public class * extends android.app.Service
11. -keep public class * extends android.content.BroadcastReceiver
12. -keep public class * extends android.content.ContentProvider
13. -keep public class * extends android.app.backup.BackupAgentHelper
14. -keep public class * extends android.preference.Preference
15. -keep public class com.android.vending.licensing.ILicensingService
16.
17. -keepclasseswithmembernames class * {
18. native <methods>;
19. }
20.
21. -keepclasseswithmembernames class * {
22. public <init>(android.content.Context, android.util.AttributeSet);
23. }
24.
25. -keepclasseswithmembernames class * {
26. public <init>(android.content.Context, android.util.AttributeSet, int);
27. }
28.
29. -keepclassmembers enum * {
30. public static **[] values();
31. public static ** valueOf(java.lang.String);
32. }
33.
34. -keep class * implements android.os.Parcelable {
35. public static final android.os.Parcelable$Creator *;
36. }
从脚本中可以看到,混淆中保留了继承自Activity、Service、
Application、BroadcastReceiver、ContentProvider等基本组件以及
com.android.vending.licensing.ILicensingService,
并保留了所有的Native变量名及类名,所有类中部分以设定了固定参数格式的构造函数,枚举等等。(详细信息请参考<proguard_path>/examples中的例子及注释。)
让proguard.cfg起作用的做法很简单,就是在eclipse自动生成的default.properties文件中加上一句“proguard.config=proguard.cfg”就可以了
完整的default.properties文件应该如下:
[html] view
plainprint?
1. # This file is automatically generated by Android Tools.
2. # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
3. #
4. # This file must be checked in Version Control Systems.
5. #
6. # To customize properties used by the Ant build system use,
7. # "build.properties", and override values to adapt the script to your
8. # project structure.
9.
10. # Project target.
11. target=android-9
12. proguard.config=proguard.cfg
大功告成,正常的编译签名后就可以防止代码被反编译了。反编译经过代码混淆的apk得到的代码应该类似于下面的效果,是很难看懂的:
如果您使用的是2.3之前的SDK版本也没关系,把上面的proguard.cfg文件复制一份放到项目中,然后进行相同的操作即可
‘叁’ re从零开始的反编译教程
写在开头,引用很喜欢的一句话: 要么学!要么不学!学和不学之间没有中间值 不学就放弃,学就要去认真的学! --致选择
为了回溯编译过程(或对程序进行逆向工程),我们使用各种工具来撤销汇编和编译过程,这些工具就叫反汇编器和反编译器。反汇编器撤销汇编过程,因此我们可以得到汇编语言形式的输出结果。反编译器则以汇编语言甚至是机器语言为输入,其输出结果为高级语言。
数组的表示方式是:在基本类型前加上前中括号“[”,例如int数组和float数组分别表示为:[I、[F;对象的表示则以L作为开头,格式是 LpackageName/objectName;
(注意必须有个分号跟在最后),例如String对象在smali中为: Ljava/lang/String; ,其中 java/lang 对应 java.lang 包,String就是定义在该包中的一个对象。或许有人问,既然类是用 LpackageName/objectName; 来表示,那类里面的内部类又如何在smali中引用呢?
答案是:在 LpackageName/objectName/subObjectName 的 subObjectName 前加 $ 符号。
方法的定义一般为: Func-Name (Para-Type1Para-Type2Para-Type3...)Return-Type
注意参数与参数之间没有任何分隔符,同样举几个例子就容易明白
无序列表的使用,在符号"-"后加空格使用。如下:
https://www.jianshu.com/p/1c54c1ccf5cc
https://www.cnblogs.com/onelikeone/p/7594177.html
解决:点击进去jd-gui,删除试一试。再不行换最新版本
解析结束后进行编译报错
解决方法: https://blog.csdn.net/fuchaosz/article/details/104800802
Failed parse ring installPackageLI: Targeting R+ (version 30 and above) requires the resources.arsc of installed APKs to be stored uncompress
解决方法:
降低gradle里版本,若出现
signatures do not match the previously installed version; ,
使用adb install命令在手机上安装app时,遇到这个报错。原因是新装的app和手机上现有的旧版app冲突了。
解决方法:删除手机上原来的app,再重新安装即可。
可是转念一想如果反编译的apk都是Version 30 R+以上,难道我解压后挨个改一遍gradle?太彻淡了,一定有解决方法,所以有了下面探究出现这个问题的解决方法:既然报错是资源文件高版本不支持,而且没有4位对齐,那么不编译资源文件就好了
APK签名工具之jarsigner和apksigner:
https://blog.csdn.net/xzytl60937234/article/details/89088215?utm_medium=distribute.pc_relevant.none-task-blog-js_landingword-1&spm=1001.2101.3001.4242
利用apktool反编译apk,并且重新签名打包:
https://blog.csdn.net/qq_21007661/article/details/109851522?utm_medium=distribute.pc_relevant.none-task-blog-js_title-4&spm=1001.2101.3001.4242
验证apktool能否使用
apktool -r d apk名字.apk,不反编译资源文件,为什么这么做,先挖个坑
错误提示没有4位对齐和不支持30版本以上的资源文件。所有尝试不编译资源文件
解决4位对齐的方法:
查看当前目录,生成了新文件:abc.keystor
使用JarSigner对apk进行签名,命令如下
jarsigner -verbose -keystore abc.keystore -signedjar testx.apk src.apk abc.keystore
直接反编译的apk产生上述错误
但是只编译资源文件的apk安装时
发现没有使用V2进行签名,这时候进行V2签名, (apksigner,默认同时使用V1和V2签名 )
所以先对只编译资源文件的apk进行V2尝试看能否成功
重复1(进行apktool -r d apk名字.apk)-->2 -->3 -->4( 不使用jarsigner而使用apksigner )
将生成的abc.keystore和打包回的apk( apktoolapp-debugdist 里的app-debug.apk)放入 C:Users aowei.lianAppDataLocalAndroidSdkuild-tools30.0.3 下,因为Android studio的SDK下有apksigner.bat.
对jarsigner只是apk进行了V1签名;在Android7.0引入了V2签名,因此,当进入sdk25.0.0及后续版本,会发现一个apksigner.bat执行脚本。
我们可以通过apksigner进行V2签名,当然,apksigner默认是同时支持V1与V2的,于是:
学习了公钥和密钥的使用和区别,使用私钥的加密算法称为对称加密算法,这种算法实现是接收方和发送方公用一道密钥,优点是效率高,缺点是安全性差,如果被第三人得知密钥则信息泄露,由此衍生了公钥加密算法,也就是非对称加密算法,这个算法是接收方给发送方公钥,发送方用公钥加密后发给接收方,接受方再用私钥解密。这样即使所有人知道公钥也不会造成信息泄露。缺点是效率非常低。
此外了解了RSA签名的大致过程,发送方拥有公钥和私钥,对信息进行摘要然后把摘要通过密钥进行签名,然后把签名和信息一起发出去,那么如何验证该信息就是发送方发出的呢,这时候就使用到了公钥验证,通过公钥对信息进行解签,然后使用一样的摘要算法得到摘要,如果得到的摘要和解签后的内容一致则说明是发送方发出。
总结就是公钥加密,私钥解密。公钥验证,私钥签名
RSA 密码体制是一种公钥密码体制,公钥公开,私钥保密,它的加密解密算法是公开的。由公钥加密的内容可以并且只能由私钥进行解密,而由私钥加密的内容可以并且只能由公钥进行解密。也就是说,RSA 的这一对公钥、私钥都可以用来加密和解密,并且一方加密的内容可以由并且只能由对方进行解密。
因为公钥是公开的,任何公钥持有者都可以将想要发送给私钥持有者的信息进行加密后发送,而这个信息只有私钥持有者才能解密。
它和加密有什么区别呢?因为公钥是公开的,所以任何持有公钥的人都能解密私钥加密过的密文,所以这个过程并不能保证消息的安全性,但是它却能保证消息来源的准确性和不可否认性,也就是说,如果使用公钥能正常解密某一个密文,那么就能证明这段密文一定是由私钥持有者发布的,而不是其他第三方发布的,并且私钥持有者不能否认他曾经发布过该消息。故此将该过程称为“签名”。
Android 签名机制 v1、v2、v3
进入JDK/bin, 输入命令
参数:
进入Android SDK/build-tools/SDK版本, 输入命令
参数:
例如:
最后安装加 -t :
附上参考链接:
https://blog.csdn.net/A807296772/article/details/102298970
配置NDK的时候如果按钮是灰色的,手动配置
直接在javac后面指定编码是UTF-8就是了。
需要注意的是要加上* -classpath .其中classpath后面的一个黑点是不能省略的。
编译好后如何导入so库
成功运行后发现lib目录下已经apk编进去so了
https://www.52pojie.cn/thread-732298-1-1.html
本节所有到的工具和Demo
IDA
链接: https://pan..com/s/15uCX8o6tTSSelgG_RN7kBQ
Demo
链接: https://pan..com/s/1vKC1SevvHfeI7f0d2c6IqQ
找到so并打开它 因为我的机型是支持arm的所以我这里打开的是armeabi文件夹下的so 如果机型是x86模式的那么这里要打开x86模式下的libJniTest.so
编译过程:
按住键盘组合键 shift + f12 打开字符串窗口 这个窗口将会列举出so中所包含的所有字符串 因为上节课我们只编写了一个字符串 所以这里只有一个hello 52pojie! 如果打开的是x86的so这里还会有一些.so 但是字符串只有这一个
鼠标点在hello 52pojie!字符串上,打开 Hex mp窗口,修改hello 52pojie!对应内存地址的内容
关于字符对应的16进制可以在网络搜索ascii码表 找到字符所对应的16进制
因为我要把hello 52pojie!修改成hello world! 是不是只要找到每个字符所对应的hex修改就好了
这里我看到 hello 52pojie!对应的hex是:68 65 6C 6C 6F 20 35 32 70 6F 6A 69 65 21
我在ascii码表上找到world所对应的十六进制是:77 6F 72 6C 64
所以hello world! 对应的十六进制是:68 65 6C 6C 6F 20 77 6F 72 6C 64 21
注意编辑的时候光标暂停的位置只有先输入字母才能更改成功,修改好后 右键Apply changes应用
退出后保存
此时已经so修改完毕
大功告成,hello 52pojie! --> hello world!
‘肆’ 如何反编译一个exe文件,并修改里面一句代码
1、首先打开浏览器,网络搜索“反编译工具ILSpy”,选择一个安全的网站进行下载。
‘伍’ 反汇编的高手来看!我想看的视频被加密了 有没有高手能够提取视频出来
你等多久
‘陆’ 侠隐阁反编译解包方法教程
战棋RPG游戏侠隐阁已经在steam平台发售一胡正御段时间,游戏目前开放第一章全部内容,有玩家已经成功解包了部分游戏内容,下面给大家分享玩家“一川草满城风”带来的解包方法
(一)反编译工具
dnSpy 是一款针对 .NET 程序的逆向工程工具,基于 ILSpy 发展而来的 .net 程序集的编辑,反编译,调试神器。该项目包含了反编译器,调试器和汇编编辑器等功能组件,而且可以通过自己编写扩展插件的形式轻松实现扩展。该项目使用 dnlib 读取和写入程序集,以便处理有混淆代码的程序(比如恶意程序)而不会崩溃。为了方便吧友,我推荐一个下载地址吧(留言或者私聊我)。unity的源码都存放在dll中,那么反编译的工作就是把从dll 中提取出源码,基本上我们的代码都在Assembly-CSharp.dll这个文件中,将游戏安装路径 PathOfwuxia_DataManagedAssembly-CSharp.dll文件拖动到dnspy反编译工具中就实现了破解,我们就能看见c#源码啦,爽!
举个例子,在Heluo.Data中CharacterInfoData里面能看见一个清销函数GetPredictionDamage用来计算预估伤害,我们点开这个函数裤岩跳到SkillData能看见具体计算方式,比如用到了攻击方攻击(CharacterProperty.Attack)和倍率(coefficient))。
(二)资源提取工具
相比于Disunity与UnityAssetsExplorer工具,AssetStudio 拥有可视化界面,可以批量导出贴图,模型,字体,音频等,可以预览,最新版支持Unity5.x,所以在这使用AssetStudio作为资源提取工具。为了方便吧友,这里我推荐一个下载地址(留言或者私聊我)。使用方法:点击菜单 File 中的“Load folder”,载入 unity 游戏的 Assets -bin -data 文件夹。也可以选择“Load file”,载入 .unity3d 或者 .boundle ,.assets文件。
我们加载PathOfWuxiaAssetBundlesconfig,如下图所示。点一下Asset list,现在就能为所欲为了,啦啦啦。举个例子,点下Skill我们能看见所有技能的数据。
‘柒’ 求安卓软件反编译修改教程
1、baksmali:classes.dex反编译为smali格式
(smali:smali格式编译打包为classes.dex,但由于smali格式类似汇编,比较难阅读,所以用dex2jar进行辅助 )
2、dex2jar:classes.dex转为jar包
3、jdgui:jar反编译并阅读
操作顺序:
apk用zip解开,里面的classes.dex分别用baksmali处理为smali,用dex2jar处理成jar,然后用jdgui看代码,找好java文件中要改的位置后,在smali里找对应的位置修改,改完了用smali再编译为classes.dex,覆盖原来apk里的同名文件,最后重新签名。注意安装时要先删除原来手机里的版本,因为签名不同。
‘捌’ 跪求android apk反编译详细教程,本人着实愚笨,看不懂网上滴步骤
一、更改apk文件的后缀名,如:LianyunHelper3.0.11.apk改成LianyunHelper3.0.11.zip
二、用zip解压缩LianyunHelper3.0.11.zip文件
三、从解压缩的文件夹中取出classes.dex文件并放到dex2jar.bat所在目录
四、运行cmd命令,进入dex2jar.bat所在的目录,输入dex2jar.bat classes.dex即可生成classes.dex.dex2jar.jar文件
五、用jd-gui工具打开classes.dex.dex2jar.jar文件,即可看到源码
六、将AndroidManifest.xml文件放到AXMLPrinter2.jar所在目录,运行cmd命令,进入 AXMLPrinter2.jar所在目录,输入java -jar AXMLPrinter2.jar AndroidManifest.xml > AndroidManifest.txt。