静态分析第三发 so文件分析(小黄人快跑)
本文作者:i春秋作家——HAI_
0×00 工具
1.IDA pro
2.Android Killer
0×01 环境
小黄人快跑 下载地址http://download.csdn.net/download/qq_36869808/10179100
0×02 支付分析

和其他的支付不一样,没有使用原生的Toast,所以我们要进行进一步分析。
0×03 祭神器
之前隐藏了一个技能,当然不是我的哈,是神器的技能。这个技能厉害到不需要动态调试就可以查看LOG。也是感谢程序员的辛勤奉献,不知道是不是调试完之后忘记删除还是偷懒,不过这对做逆向的反而是一个好事情。换句话说,程序员自己给逆向分析人才留下了可以操作的后门地址。不多说了,直接祭出神器吧。
1.首先在这里连接Android模拟器

关于Android模拟器,下载了夜神还有海马玩,还有蓝叠。蓝叠是刚开始的时候的用的,卡鼠标,好处是游戏不卡。海马玩性能还好,游戏一般,但是不支持拖拽,不喜欢。夜神,不知道是在我的电脑上有问题还是普遍问题。游戏超级卡,而且需要通过夜神的应用商店进入。最后还是用蓝叠吧,卡就卡点,但是模拟真机性能没有问题。
2.第二步,点击安装
如果安装出现问题,直接安装在虚拟机就行,可以不通过Android Killer安装。

3.第三步,点击运行

4.第四步,点击日志

5.第五步,LOG界面一个简单的介绍

6.第六步,首先设置过滤筛选,然后点击开始

7.第七步,在游戏里点击购买,查看LOG

8.分析输出日志

在我们每次点击返回的时候都会输出一大串字符,每次都有,这里就是我们的终点了,这里就是程序员留下来的突破点了。
0×04 关键字分析
1.不细讲了,看https://bbs.ichunqiu.com/thread-30248-1-1.html这里就好了。

这里找到了这串字符,并且向上查看,发现了一个X类()。
sget-object v0, Lcom/gameloft/android/ANMP/GloftDMHM/Game;->N:Lcom/gameloft/android/ANMP/GloftDMHM/Game; new-instance v1, Lcom/gameloft/android/ANMP/GloftDMHM/x;
# 这里的意思就是new 了一个名为 x的类。
2.打开这个x()类

分析发现这里有一个GameInterface->doBilling,继续溯源。
3.搜索GameInterface

根据方法来进行判断,找到了一个NDK调用的方法,nativeBillingDone,意思就是购买完成,或者支付完成的意思。如果看了之前有关于NDK开发的,并且进行过尝试的,这里应该会认得,会简单一些。
4.搜索加载so的文件。

找到了文件名despicablemefree

关键字分析到这里就结束了,我们成功的找到了so文件,接下来就该到so文件的分析了。
0×05 so 文件静态分析
1.在export中搜索一下

2.双击,然后进行分析

这里的B是调用的意思,调用了addCash,cash是现金的意思,addcash就是增加金币的意思。
3.进入函数进行一个简单的分析(为了更加了解ARM汇编所以这里会进行一个详细分析)。

(1)STMFD SP!, {R3-R8,R10,LR} 这个看起来很复杂其实作用就是入栈
(2)CMP R0, #1 CMP指令的作用是把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,更新CPSR中条件标志位的值。CMP会进行一次减法运算,不存储结果,只更改条件标志位。这里是 把传入的R0和1进行比较。
(3)LDR R5, =(_GLOBAL_OFFSETTABLE - 0×209014)LDR的作用就是把数据送入R5,_GLOBAL_OFFSET_TABLE_的含义就是全局偏移量。
(4)MOV R6, R0 传入的参数给R6
(5)ADD R5, PC, R5 ; _GLOBAL_OFFSETTABLE ADD指令用于把两个操作数相加,并将结果存放到目的寄存器中。
(6) BNE loc_209028BNE指令是“不相等(或不为0)跳转指令”:
以上六条语句大意就是如果输入的值是1的话就把传入的参数给R6
然后接着往下看。
(7) LDR R3, =(off_A45CC4 – 0xA48944)
(8)MOV R2, #2,给R2赋值为2
(9) LDR R3, [R5,R3] ; unk_A56BE0把R5+R3的地址写入R3
(10) STR R2, [R3] 32位的大小送入寄存器,把R3的地址送入R2
(11)LDMFD SP!, {R3-R8,R10,PC} 出栈,也就是所谓的释放。
我们去看看如果条件不满足跳转到loc_209028的语句。
(1)CMP R0, #0比较,如何R0=0就执行一下语句。
(2)MOV R3, #1 R3赋值为1
(3)LDREQ R2, =(off_A45CC4 – 0xA48944) EQ的意识是如果相等的话就执行。
(4)MOVEQ R1, R0如何R1==R0,则执行mov R1,R0。
(5)LDREQ R2, [R5,R2] ;如果R2的地址==R5+R2则执行
(6)STREQ R3, [R2]如果R3的值和R2的相等,则执行
(7)BEQ loc_209074 如何R3==R2,跳转
(8)CMP R0, #3 BNE loc_20905C,如果R0!=3就跳转。
loc_20905C代码分析
CMP R0, #4, BNE loc_20907C如果不等于4则跳转到loc_20907C
loc_20907C分析
(1)CMP R0, #6 BEQ loc_209064如果R0==6则跳转
(2)LDR R0, [R4] BNE loc_2090D4如果R0!=R4就跳转。
loc_2090D4分析
(1)CMP R6, #8 BNE loc_209118,如果R6!=8就跳转
(2)MOV R1, #0x49C8 BL sub_208DAC如果8R==6,就会有一个很大的数字生成,这里可能就是初始化的数值,可以通过好几种方法来观察。
0×06 进行初始化修改。
1.返回Android killer,在何时的位置加上
const/16 v3, 0x9
invoke-static {v3}, Lcom/gameloft/android/ANMP/GloftDMHM/Game;->nativeBillingDone(I)V
2.然后进行测试即可,这个时候会发现初始的香蕉数量已经变成了18888
>>>>>>黑客入门必备技能 带你入坑,和逗比表哥们一起聊聊黑客的事儿,他们说高精尖的技术比农药都好玩!
静态分析第三发 so文件分析(小黄人快跑)的更多相关文章
- [置顶]
几行代码实现ofo首页小黄人眼睛加速感应转动
最新版的ofo 小黄车的首页小黄人眼睛随重力而转动,感觉有点炫酷,学习一下吧,以下代码是在xamarin android下实现 ofo首页效果图: xamarin android实现效果: 实现思路: ...
- 音频算法之小黄人变声 附完整C代码
前面提及到<大话音频变声原理 附简单示例代码>与<声音变调算法PitchShift(模拟汤姆猫) 附完整C++算法实现代码> 都稍微讲过变声的原理和具体实现. 大家都知道,算法 ...
- css3实现小黄人
效果就像这样: 不废话,直接上代码! hrml代码: <!DOCTYPE html> <html> <head lang="zh"> <m ...
- 纯CSS3画出小黄人并实现动画效果
前言 前两天我刚发布了一篇CSS3实现小黄人动画的博客,但是实现的CSS3动画是基于我在站酷网找到的一张小黄人的jpg格式图片,并自己用PS抠出需要实现动画的部分,最后才完成的动画效果.但是,其实我的 ...
- Python turtle模块小黄人程序
讲解Python初级课程的turtle模块,简单粗暴的编写了小黄人的程序.程序还需要进一步优化.难点就是要搞清楚turtle在绘制图形过程中的方向变化. import turtle t = turtl ...
- 小黄人IP营销的四种玩法思维导图
小黄人IP营销的四种玩法思维导图 ------------------------------ 本人微信公众帐号: 心禅道(xinchandao) 本人微信公众帐号:双色球预测合买(ssqyuce)
- CSS3实现小黄人动画
转载请注明出处,谢谢! 每次看到CSS3动画就心痒痒想试一下,记得一个多月前看了白树哥哥的一篇博客,突然开窍,于是拿他提供的demo试了一下,感觉很棒!下图为demo提供的动画帧设计稿. 自己也想说搞 ...
- CSS3小黄人
CSS3实现小黄人 效果图: 代码如下,复制即可使用: <!DOCTYPE HTML> <HTML> <head> <title>CSS3实现小黄人&l ...
- 微信小程序相关三、css写小黄人
小程序上课第三天,因为今天院里有活动,所以没去上课,第四天上午又因为要召开入党转正大会,又耽误了一上午,下午去上课,要了资料.这两天讲了一些零零碎碎的东西,做的实例有上面这个小黄人 都是用的css,基 ...
随机推荐
- 680C. Bear and Prime 100 数学
C. Bear and Prime 100 time limit per test:1 second memory limit per test:256 megabytes input:standar ...
- git 记住用户名和密码
git 记住用户名和密码 在使用 git 时,如果用的是 HTTPS 的方式,则每次提交,都会让输入用户名和密码,久而久之,就会感觉非常麻烦,那么该如何解决呢? 1. 使用 SSH,添加 ssh ke ...
- ubuntu系统中安装RoboMongo
1.下载RoboMongo RoboMongo官网下载链接.选择好相应版本. 2.解压文件 tar -xzf robomongo--linux-x86_64-.tar.gzcd robomongo-0 ...
- PTA第一次作业和第二次作业
PTA的第一次作业第一题: #include <stdio.h> int main (void) { int grade,i,N ,a=0,b=0,c=0,d=0,e=0; printf( ...
- springcloud-eureka简单实现
请参考 spring+cloud为服务实战 第三章 一.创建Eureka服务 1.使用Idea创建一个项目 结构如下: 2.pom.xml配置: <?xml version="1.0& ...
- 打开子页面及刷新父页面 window.open window.opener.reload()
//打开子页面 var url=children_url;window.open(url) //刷新parent页面 var url=parent_urlfunction refresh(url){ ...
- 优秀前端工程师必备: cookie的增删改查Demo!
1 cookie可以很好地解决微信浏览器登录状态的保存,具体教程看下面链接: https://www.cnblogs.com/autoXingJY/p/10456767.html 2 参考了w3c等的 ...
- 201709013工作日记--static理解 && abstract
1.关于viewHolder设置成static的讨论 一般情况下是尽量不要使用static关键字,因为static一旦有引用变量指向了变量,使用完毕后而没有设置null,就会造成内存泄露,而且很难排查 ...
- PrefixHeader.pch 在工程中的使用
1) 新建一个pch文件 2) 在 工程 Build Settings 中搜索 header 将Precompile Prefix Header 置为YES 2) 选中pch文件, 将右侧相对路径 ...
- java基础-day4
第04天 java基础语法 今日内容介绍 u Random u 数组 第1章 Random 1.1 产生整数随机数 1.1.1 Random的使用步骤 我们想产生1~100(包含1 ...