跟着鬼哥学so修改,四,实例第一篇

跟着鬼哥学so修改,四,实例第一篇

图/文  听鬼哥说故事

---------------------------------------------分割线--------------------------------------------

这篇文章是前段时间的文章,最近这个系列的so分析刚好可以做为一个实例教程,所以就补充拿回来了。

前三篇没看的,请继续关注博客,看完前面三篇。

趁热打铁,加深对so的分析过程,于是就有了这篇文章的补充························

另,此文章需要对android反编译逆向有一定基础,简单了解so的作用,有任何疑惑,可去群里和论坛或自行google搜索解决。

文章受www.pd521.com 站长邀请,首发在其论坛,大家可以过去关注,很多基础资料,方便新手学习。

请大家自己动手去练习!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

---------------------------------------------分割线--------------------------------------------

今天我们来分析的是小黄人快跑,小黄人的形象从电影上面一直都蛮好的,现在都拍到了第二部了,所以我们找到这个游戏来进行分析。

第一层次分析:

拿到游戏,首先我们得先安装看看有什么地方是值得破解的。

通过观察,我们发现游戏中主要的消费方式在香蕉和金币上面,既然这样,那么我们就先看看支付上面是否可以直接破解内购。购买截图如下图所示:

和游戏支付的方式,那么就查询相关资料,例如以前我的教程中对onPayFailed方法的修改,对onBillingFinish方法的修改,在这里可能是对移动支付进行了升级,没法直接那样操作。既然这样,那么我们就查看下Logcat,看看有无有价值的信息。

通过多次测试,我们发现在点击进入游戏支付的时候有这行输出,那么好,我们就跟进观察这行代码,这行代码后面肯定是启动支付流程的相关代码。

对于smali代码不熟悉的同学,那么直接使用jd-gui打开jar文件查看吧,如下:

搜索找到我们发现的特征字符,如下:

搜索找到我们发现的特征字符,如下:

我们可以发现,doBilling方法,按照名称来想,我们也感觉就是购买的时候使用的,所以我们追寻它去。

全文搜索doBilling效果不太理想,所以我们可以直接找GameInterface这个类的相关调用方式了。

好了,到了这个类,根据接口名称,我们可以猜到,这个是支付的回调函数。回调函数的意思,也就是判断是否支付了,然后返回相关数据,由其他算法来进行香蕉或金币数量的增加。

Game.nativeBillingDone,看到这个native方法,我们就需要对so文件进行分析操作了,我们找到Game类,看看是调用的哪个so文件,搜索system.loadlibrary:

晓得了so的名称,那么我们就挂起ida,java可以直接调用使用的肯定都是export导出函数,所以我们在export中搜索nativeBillingDone:

然后看到这个方法:

B是调用方法的意思,这里调用addCash方法,所以我们更清楚的明白,这个就是增加金币阿,名字都这么通俗易懂了,再猜不到就对不起人家作者了。

先大致浏览一下方法是干什么的:

好,大致看懂第一段代码后,我们往下翻翻:

通过图片中的文字说明,我们也简单能够明白,我们需要做的,就是先测试一下,将这个addcash(int)方法的传入参数设置为8会怎么样,是不是会增加金币。所以我们回到最初分析的时候,看这里:

通过图片中的文字说明,我们也简单能够明白,我们需要做的,就是先测试一下,将这个addcash(int)方法的传入参数设置为8会怎么样,是不是会增加金币。所以我们回到最初分析的时候,看这里:

阿门,感谢作者,看到这行输出,这个是我们点击支付界面的返回按钮产生的,因为支付过程中会将游戏声音暂停,所以才会产生这个情况,方便开发者观察数据。

起来,我们是可以通过自己在主类Game.smali中自己寻找其他地方的,能看到log只是更加方便了我们的分析速度而已,我们手动寻找代码也是可以的。所以没有发现log,只是在时间上面花费会多一点,其他影响是不大的。

好,那么我们就直接找到这行log的打印地方,在它上面调用nativeBillingDone方法:

第一行,设置v1=8,第二行,调用我自己的方法打印int数据看是否赋值成功,同学们可以忽略掉的,第三行调用natveBillingDone方法。

然后回编译,打包测试.....................

发现初始化金币真的为18888,然后点击商店,支付页面,按返回键:

好了,到了这里,我们的第一层次的目的就完成了。

需要说明的是,IDA的使用,同学们自己查资料,ARM语法,自己查资料即可,网上有很多教程的,自己动手,掌握更深入。

第二层次分析:

进行完第一层次分析后,我们知道已经分析对了位置。So文件中的算法也找对了,那么,我们初始化多增加点金币多好,于是,我们继续开始分析

关键点就在addcash方法中的这一行对R1复制的代码上面,我们打开16进制看一眼:

只有四个字节,通过这4个字节实现将18888赋值给R1,4个字节最大的数字为0xffff,要看这个函数接收的是无符号,还是有符号类型的int16,现在最大数值可能就是0xffff对应换算到十进制为65535。

好,那么我们就看看怎么来修改数据吧,立即数,我们就可以直接操作修改字节了。

C8 19 04 E3  ,这行代码原本为MOV R1, #0x49C8

关于指令命令本人也不太熟悉,所以直接慢慢试着改一下

因为那个本身的立即数,通过观察发现原本的指令刚好反过来为E3 04 19 C8  ,那么对照0x49C8,我直接修改为如上图所示:

发现直接修改成功了,好了,这样就更给力了,我们直接使用010Editor或者UE,操作so文件

前面蓝色部分为内存地址,我们使用ctrl + g
命令跳转地址,直接对应修改这四个字节码即可。

然后重新打包,测试。。

结果自己可以看到,一切正常,初始化65535。。

支付页面,返回,增加金币。。

我们这次测试的是香蕉的增加方式,所以还有金币的增加噢,这个就留给感兴趣的同学们自己尝试了,自己动手,多多练习~~~

此文仅供交流,请勿做其他商业使用。。

排版看的不舒服的,直接看文档即可,相关附件地址:

链接:http://pan.baidu.com/s/1eQILJkI 密码:7kyr

其实此游戏还有很多方式去破解的,这里只是介绍一两种而已,大家可以自行补充~

转载请注明出处~~~~~~~~~~

时间: 2024-10-01 06:51:37

跟着鬼哥学so修改,四,实例第一篇的相关文章

跟着鬼哥学so修改,二,进行篇

图/文  听鬼哥说故事 继续上文的内容---------------------------------- 0x1:测试文件的编写 经过上一篇文章的基础学习,现在我们开始进行是用的部分. 既然我们可以在so中定义String字符串了,那么我们当然也可以定义int类型的数据了,那么,我们在此定义一个getCoin方法,返回值为int类型.如下: JNIEXPORT jint JNICALL Java_com_ggndktest1_JniGg_getCoin (JNIEnv * env, jobje

跟着鬼哥学so修改,一,准备篇

图/文 听鬼哥说故事 闲话少说,so的修改,重要性大家都知道,这里从头编写so文件,分析so文件,修改so文件,打算做一个系列的教程,当然,主要是看时间允许. android的sdk配置以及ndk环境下载,请同学们自行google即可. 翻墙也不会,工具也不会用,搜索也懒得搞,请直接略过本文即可. 0x1:新建立一个安卓工程 0x2:编写调用so代码和方法定义 在MainActivity.java同目录下创建一个JniGg.java文件,用于调用so 0x3:生成文件头.h文件 在这个目录可以看

跟着鬼哥学so修改,三,答案篇

几篇分析好的文章: http://www.pd521.com/thread-114-1-1.html     xxoo http://www.pd521.com/thread-113-1-1.html    myoldid  (回复,1,2,3) 进行软件的分析,这个过程就不需要多说了,大家自己看就是了,下面是分析完毕后的思路进行. 细节方面不再叙述: smali层关键点: native层关键点: 0x1: 修改smali层,将传入参数v0设置为int数值 1. 0x2: 针对这个apk来说,搜

跟着鬼哥学so修改,三,作业篇

作业: 通过前面两篇文章的学习,请自行分析此应用,将当前用户类型修改为Gold Vip 用户. 有两种以上的方式可以修改的,有兴趣的同学请进行分析,写一下分析记录,可另起文章发布其过程与思路. 明天或者后天,再发布一下分析过程,以及原代码,大家再对比学习一下即可. -------------------------------------------------------- 下载地址: http://pan.baidu.com/s/1jG22HMY

跟着鬼哥学PyQtPart.2

<span style="font-family: Arial, Helvetica, sans-serif;">0x1:</span><span style="font-family: 宋体;">简述</span> 经过第一篇的简单布局以后,我们来考虑是否可以放上一个按钮,来执行相关的动作呢?答案是肯定可以的,经过测试,已经简单整理一个按钮的点击事件响应,来执行反编译动作.这里将学习过程记录一下. 0x2:思考过程

跟着鬼哥学so改动,二,进行篇

图/文  听鬼哥说故事 继续上文的内容---------------------------------- 0x1:測试文件的编写 经过上一篇文章的基础学习,如今我们開始进行是用的部分. 既然我们能够在so中定义String字符串了,那么我们当然也能够定义int类型的数据了.那么.我们在此定义一个getCoin方法,返回值为int类型. 例如以下: JNIEXPORT jint JNICALL Java_com_ggndktest1_JniGg_getCoin (JNIEnv * env, jo

跟着鬼哥学PyQtPart.4

中秋假期转眼已经过去两天了,我们的学习也在不断向前,经过前面三篇文章的学习,我们已经可以做出来一个简单的反编译apk的工具了. 为了更方便的使用我们自己编写的工具,所以我们对于第三篇文章中的search_file button来进行处理,我们使用拖拽文件到QLineEdit控件上面来显示文件路径,而不用打开window来选择了,这样对我们的操作来说更加方便一点. 0x1:拖拽事件的处理 拖拽事件,经过一晚上的查询以及翻看Java已经写好的工具,终于找到dragEnterEvent和dropEve

跟着鬼哥学PyQt Part.1

中秋几天不出去玩了,留在家里把PyQt的相关资料学习一下,这里仅记录一下学习的相关记录,留下存档,便于以后翻阅.主要的目的是编写一个反编译和回编译的工具,稍后可以慢慢随着需求补充上一些搜索和修改的功能,处理一些游戏的自动破解,类似MM和一些其他支付都有特征可参考. 感觉可能会对初学者有一些参考,于是就整理一下发到博客里面.文中都是学习中的留下的笔记,所以肯定会有很多书籍中的代码,在此感谢那些作者,让后学者少走弯路. 0x1:PyQt的介绍: PyQt是一个创建GUI应用程序的工具包,它是Pyth

CSDN学院“跟着龙哥学JavaWeb”的笔记

笔记内容都来源于""跟着龙哥学JavaWeb"课程中的讲解. 其实很多年前有接触,只是重新看看有什么更值得学习的. 既想搭建个服务器,又想做个APP端,那还是工作挺多的. 1 Web概述 C/S VB,VC++,Java,C# 特点: 在服务器端主要就是一个数据库,把所有业务逻辑以及界面的渲染操作交给客户端完成. 优点:较安全,用户节目很丰富,用户体验不错等. 缺点:每次升级都需要重新安装,针对于不同的操作系统开发,可移植性差. B/S JSP,ASP,PHP,基于浏览器访问