11649827 发表于 2023-2-8 01:12

拒绝Smali语法,使用java代码修改并重签名安装“春节解题领红包之3”程序

本帖最后由 11649827 于 2023-2-9 17:16 编辑

提前声明一点:这里只是分享一下解题的实际操作过程,以便大佬们看到了帮忙解决一下存在的问题。这里用到了AndroidStudio软件和一些辅助软件,其实这个红包程序不进行修改也能得到正确结果,直接修改smali代码也更快捷,我这用很古板的方法,主要是需要使用Smali语法,不是最佳的做法,仅仅提出这个思路。{:301_1009:}
下面开始阐述这个过程:

[*]下载”【2023春节】解题领红包之三.apk“,并解压到文件夹中。 Happy_New_Year_2023_Challenge.rar

[*]用压缩软件打开apk文件,复制出安装包中的classes.dex文件(打不开apk文件可以修改.apk为.zip)。



[*]将dex文件转换为jar文件,这里需要使用到d2j-dex2jar这个工具,工具的下载可以在互联网上查找,将dex文件拖到工具上即可完成转换得到classes-dex2jar.jar文件。这一步如果有提示报错,无法完成转换,通常是java代码中的false和0的问题,在互联网上也有解决方法,或者重新编译工具。


[*]使用recaf工具或者其他工具编辑jar文件,删除其中的android依赖和com.google包(goolgle包需要用压缩包软件拆包删除),这步的目的是避免在项目中由于存在两份相同的依赖,软件后续无法完成编译的操作,按保存,之后点击导出程序,保存这个新的jar文件。


[*]打开AndroidStudio,新建空白安卓项目,修改保存路径,点击完成创建。


[*]将左上角的Android改为项目,并展开到项目下的的libs文件夹中,将修改后的jar包拖入其中。之后右键jar包,选择Add as Library...,并选择创建库到main中。


[*]之后可以在lib目录下展开jar包,查看里面的class文件,这就是java源代码生成的文件,可以看到java源代码。
[*]找到MainActivity.class和MainActivity$$ExternalSyntheticLambda0.class,带$$符号的是子类,点击反编译为java代码。
[*]这时如果想要修改MainActivity的代码,就需要将这个类和它的子类代码的包在src的main中进行创建“com.zj.wuaipojie2023_3”.


[*]新建同名MainActivity的.java文件和同名子文件,之后将反编译的源代码(里面包含了MainActivity和子类的代码,需要将子类的代码放入子类的同名.java文件中),如果出现androidx报错,那么就是前面未删除安卓依赖库。


[*]使用代码提示,修复代码中的错误,完成前期的准备。
[*]修改代码的逻辑,保存项目选择已修改的源文件点击编译,然后等待编译成功。


[*]编译后的class文件在\build\intermediates\javac\debug\classes\com\zj\wuaipojie2023_3目录,压缩包软件打开原未作修改的classes-dex2jar.jar,然后将编译后的class文件替换进去。
[*]将替换过class文件的jar文件转换为dex文件,这里需要使用到d2j-jar2dex这个工具,之后将生成的classes-dex2jar-jar2dex.dex修改文件名为classes.dex,替换掉原包,签名安装。


[*]最后打开修改后的软件,听到一声只因,获得flag{},到这就已经完成了整个过程。
这种方法最后有一个重要的问题没有解决,就是不清楚如何动态调试修改的java源代码(不是调试smali代码,看不懂smali代码),有人清楚的可以指导一下如何实现。{:301_1010:}

zzhd 发表于 2023-2-8 19:21

感谢分享

yippee 发表于 2023-2-8 20:08

谢谢图文并茂的分享

11649827 发表于 2023-2-10 14:17

对于有验证包签名的应用,也同上面一样先行修改对应的验证类,然后再进行后续操作,例如“春节解题领红包之4”,修改后既可以正常安装运行。

正己 发表于 2023-2-15 18:03

你就直接把关键的凯撒那块扣出来,然后直接用as自带的调试工具就可以了

11649827 发表于 2023-2-15 22:44

正己 发表于 2023-2-15 18:03
你就直接把关键的凯撒那块扣出来,然后直接用as自带的调试工具就可以了

没听懂怎么操作,现在是假设类依赖了很多其他类,然后将一个类的源码进行替换,这样生成的.class文件可以用来替换掉jar中对应的文件,但调试工具并不能调试这源代码,因为项目的代码是一个空包,只是借用这个项目生成的文件,所以不能直接调试这个项目的包,调试的话啥都没有,而原包是需要手动替换了对应代码才能运行,这好像as并没有这种替换工具。

正己 发表于 2023-2-16 13:11

11649827 发表于 2023-2-15 22:44
没听懂怎么操作,现在是假设类依赖了很多其他类,然后将一个类的源码进行替换,这样生成的.class文件可以 ...

你就idea写个main方法,甚至不需要as,然后把反编译后的java代码复制到main里,看缺什么就补什么,然后直接动态调试

11649827 发表于 2023-2-16 13:58

正己 发表于 2023-2-16 13:11
你就idea写个main方法,甚至不需要as,然后把反编译后的java代码复制到main里,看缺什么就补什么,然后直 ...

额,想法不同,我想表达的是一种方法,这不局限于破解软件密码之类的,而是通过破解替换jar,让原来不能运行的软件可以运行起来,或者达到修改版的效果。
例如:现在有一款类似植物大战僵尸的小游戏,在游玩前需要点击广告来游玩,现在可以用java修改它的代码去除广告,然后我想要自己定制关卡和地图,假如有50关,我想要添加51、52关,地图的大小变小,河道放两边,同时僵尸仅在这几关开启快走模式,移动速度增加。
这按照开发流程来说,需要大量改动或添加游戏逻辑,就需要有源代码,光是简单破解和修改是没法达到的,在这样的情况下能用java代码编辑软件是很好的方法。

正己 发表于 2023-2-16 16:21

11649827 发表于 2023-2-16 13:58
额,想法不同,我想表达的是一种方法,这不局限于破解软件密码之类的,而是通过破解替换jar,让原来不能 ...

https://github.com/Efaker/FakerAndroid
这个可以试看看
页: [1]
查看完整版本: 拒绝Smali语法,使用java代码修改并重签名安装“春节解题领红包之3”程序