自学内容网 自学内容网

UnityAPK反编译基础修改,C#反编译

前言

几年前做了一个项目是VR单机的,无需联网。最近接到需求,需要修改其中的版本号,版本号当时写到UI界面上了,没做版本管理。

再加上之前管理比较混乱导致最终版本的源码丢了,现在手头的工程里跟最终版本有点出入。

那么现在手里就一个apk安装包,如何修改其中的版本号?

想到之前有用到反编译的方式去查看源码,那时没总结流程,借此次机会总结下,防止后面遗忘。

方法

整套流程一共分三步:

  • apk拆包
  • 反编译DLL
  • 封包签名

开始上手

apk拆包

什么是APK?

APK是Android Package的缩写,它是Android操作系统使用的一种应用程序包文件格式。APK文件相当于Windows中的.exe文件或Mac OS中的.app文件,它包含了运行Android应用程序所需的所有代码、资源、资产、库等。

找到apk。

将文件后缀apk修改为zip,此时可以看到apk包变成了压缩文件。

使用解压软件解压。可以看到内部文件结构。

APK文件本质上是一个压缩包,它使用了ZIP文件格式来打包Android应用程序的资源和代码。APK文件的结构类似于一个标准的ZIP文件,包含了一个清单文件(manifest)、应用程序代码(.dex文件)、资源文件(如图像、声音和布局)、以及其他必要的库文件。

每个目录的作用:

  1. assets:这个文件夹用来存放程序的所有资源文件,比如图像、音频、视频等。这些资源在应用程序中被引用,并且在运行时由应用程序访问。

  1. lib:这个文件夹存放应用程序所需的所有本地库(.so文件)。这些库通常是用C或C++编写的,用于提供应用程序的某些功能,比如图形渲染、物理引擎等。

  1. META-INF:这个文件夹用于存放一些元数据文件,比如证书和签名信息。这些文件对于验证应用程序的身份和完整性至关重要。
    • MANIFEST.MF:一个清单文件,包含了APK的元数据,应用程序的版本号、签名证书等。

  1. res:这个文件夹存放应用程序的所有资源文件,这些资源是应用程序的用户界面构建的一部分。这些资源包括XML布局文件、图像、字符串和其他界面元素。

  1. AndroidManifest.xml:这是一个XML格式的文件,包含了应用程序的所有必需信息,如应用程序的包名、所需权限、定义的活动(Activities)、服务(Services)、广播接收器(BroadcastReceivers)和内容提供者(ContentProviders)。

  1. classes.dex:这个文件包含了应用程序的字节码。在Android中,Java源代码被编译成.class文件,然后这些.class文件被转换成.dex格式,最终打包成classes.dex文件。这个文件是应用程序运行时执行的代码。

  1. resources.arsc:这是一个编译后的资源文件,包含了应用程序的所有字符串资源、尺寸定义、样式和其他资源定义。这个文件是由Android资源编译器从res文件夹中的原始资源文件生成的。

进入assets\bin\Data\Managed,找到Assembly-CSharp.dll,将Assembly-CSharp.dll单独拷贝一份留作备份。

Assembly-CSharp.dll 是Unity在编译项目时默认生成的一个程序集,它包含了项目中所有的C#脚本。程序集是代码编译后的一个逻辑单元,它把相关的代码和类型组合在一起,生成PE文件(例如可执行文件.exe和类库文件.dll)在Unity中,如果没有进行自定义操作,所有在Assets文件夹中编写的脚本在编译时都会默认编译到Assembly-CSharp.dll中

接下来我们就要对这个Assembly-CSharp.dll进行反编译。

反编译DLL

反编译C#、.Net的工具有很多,比如.Net ReflectordnSpyJetBrains dotPeek

这里我使用dnSpy

Dnspy地址:

https://github.com/dnSpy/dnSpy

仓库界面下载最后的Releases版本。

这里只有window平台的,选择64位的进行下载。

解压后双击dnSpy.exe

进入软件后将Assembly-CSharp.dll文件拖拽进去。

可以看到DLL已经被导入,并且可以看到一些信息。

找到需要修改的脚本,因为我有旧的工程,很方便的就能知道修改哪个脚本。

需要修改的地方在Awake函数中。

右键编辑类(或者编辑方法也可以)

修改内容

最后点击编译。

到这里还没结束,需要将修改过的DLL进行保存,点击这个按钮。

确认路径,这里我直接保存到原来的Assembly-CSharp.dll路径中。

可以看到时间是最新的。

反编译的操作就已经执行好了,下面进行打包和签名。

打包签名

修改好DLL后就可以将这个包还原成apk格式的了。

将文件夹打包成zip压缩包

修改zipapk格式

到这一步为止并没有完全成功,如果此时安装该程序,会提示

这是因为上面修改过程中破坏了原有的签名信息。APK文件的签名是Android系统用来验证应用来源和完整性的一种安全机制。当我们解压、修改并重新打包APK时,原有的签名会丢失,导致系统无法验证其安全性,因此会拒绝安装。

所以我们需要重新对修改后的apk进行签名。

这里用到Lucky Patcher(幸运修改器)

Lucky Patcher 是一个为 Android 设备设计的第三方工具,它能够进行多种操作,包括但不限于去除广告、修改应用权限、备份和恢复应用、绕过高级应用的许可证验证等。

通俗点来说这个工具可以去广告,解锁一些简单的内购、重签名等服务。

下载地址:

https://github.com/AndroidAppz/LuckyPatcher/releases/tag/6.5.9

📢注意,需要ROOT权限。如果没有ROOT权限,那么使用模拟器进行操作。

将apk导入到Lucky Patcher,选择重建

选择测试证书重签名

选择移除完整性检查和签名验证,然后点击Re-sign

等待打包完成。

重签名成功,找到这个apk安装即可。

需要注意的

到这里,完成了一个基础的反编译apk,并且修改打包的流程,当然这套流程有很多条件。

  1. 只针对unity打包的apk进行反编译,如果是原生apk或者其他框架打包出来的另说。
  2. 只针对未加密、加壳的apk进行操作,如果是加密了,那反编译后有可能是乱码,甚至找不到DLL。

最后,本篇所用到的工具获取可以关注公众号,回复关键词:unity反编译

本篇仅供学习,请勿用于非法用途。


原文地址:https://blog.csdn.net/weixin_43935971/article/details/142992979

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!