吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7903|回复: 14
收起左侧

[Android 原创] Hook的两个小插曲

[复制链接]
听鬼哥说故事 发表于 2014-9-3 10:27
本帖最后由 听鬼哥说故事 于 2014-9-3 10:29 编辑

   看完了前面三篇文章后,这里我们来一个小插曲~~~~
    第一个小插曲,是前面文章一个CM精灵的分析,我们这里使用hook代码来搞定;
第二个小插曲,是现在一些游戏,都有了支付上限,例如每天只能花20块钱来购买。
好了,下面我们分开叙述~~~~

0x1:第一个小插曲

CM精灵分析的时候,打开软件能得到的最初始的信息,是软件的使用时间有限制,为30分钟,我们可以找到其上下文来继续查看一下。
软件分析方面,懒得再次打字叙述了,看下面的连接即可:

我们通过分析以后,可以得到:


图片1.png


通过查看a()Z方法,发现是一个返回值为boolean类型的方法,所以,也能看到确定的类和方法,那么我们就开始写hook代码,hook代码简单来说,使用框架的话是很简单的:

1.确定hook
2.确定hook类中的关键call方法
3.hook方法来怎么做

那好,有这三条流程以后,我们继续下去。
这里是确定需要hook方法所在的类:


MS.hookClassLoad("net.aisence.Touchelper.TouchelperLicense", new MS.ClassLoadHook()


这里是确定需要hook的方法名和方法的传入参数


hookvalid=arg0.getMethod("a", null);



然后就是hook那个方法,我们这里只需要它的返回值为true即可:


[Java] 纯文本查看 复制代码
final MS.MethodPointer old = new MS.MethodPointer();
                                        
                                        MS.hookMethod(arg0, hookvalid, new MS.MethodHook() {

                                                @Override
                                                public Object invoked(Object arg0, Object... arg1)
                                                                throws Throwable {
                                                        // TODO Auto-generated method stub
                                                        

                                                        System.out.println("是否注册 hook --->");
                                                        boolean aa=(Boolean) old.invoke(arg0,arg1);
                                                        
                                                        aa=true;
                                                        
                                                        System.out.println("是否注册了呢?-->"+aa);
                                                        
                                                        return aa;  
                                                        
                                                }
                                        }, old);



好了,我们运行安装插件,然后重启手机打开软件:
在点击播放一个脚本的时候,会有如下信息:


图片2.png


0x2:第二个小插曲
游戏中想花钱也不行,人家限定了每天只能花多少,所以,我们可以推测,游戏获取手机的信息,然后判断你是不是支付了太多,那么一般常见的信息就是imeiimsi了。这两个单词的概念,不懂的同学搜索一下,一个是手机imei,一个是sim卡的imsi,相当于人的身份证。
好了,那么我们先从imei入手:
先写下我们开发中正常获取imei的代码:


[Java] 纯文本查看 复制代码
TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(this.TELEPHONY_SERVICE);

String imei=mTelephonyMgr.getDeviceId();
            
                System.out.println("现在的Imei为-->"+imei);



好了,正常软件开发来获取手机的imei是这样写的,使用系统的API即可。
然后我们需要分析下TelephonyManager 所在的类,由上面的引用import为:

import android.telephony.TelephonyManager;


所以,我们可以知道完整的类路径,同时又知道方法,那么我们就开始编写hook代码了:
按照前文的三部曲:

好了,然后我们安装,开始测试吧,刚好在前面我们写的正常获取的工程里面测试,通过各种打印信息,我们可以知道结果的。

[Java] 纯文本查看 复制代码
1.MS.hookClassLoad("android.telephony.TelephonyManager", new MS.ClassLoadHook() 


2.hookimei=arg0.getMethod("getDeviceId", null);


3.System.out.println("hook imei----------->");

        String imei=(String) old1.invoke(arg0, arg1); 

                 imei="999996015409081";
                                     
                return imei;  



好了,然后我们安装,开始测试吧,刚好在前面我们写的正常获取的工程里面测试,通过各种打印信息,我们可以知道结果的。


图片3.png



上面的打印是我们hook代码中的信息,最后一行的代码是我们测试获取imei工程中的打印,说明一切正常,我们达到了所需目的!
IMEI的获取没问题了,那么我们就开始操作IMSI吧,按照上面的思路走起~

1.MS.hookClassLoad("android.telephony.TelephonyManager", new MS.ClassLoadHook()

2.hookimsi=arg0.getMethod("getSubscriberId", null);

3. System.out.println("hook imsi----------->");
String imsi=(String) old1.invoke(arg0, arg1);
imsi="460001200505666";
return imsi;  



测试截图:


图片4.png


带入正常游戏的测试,暂时手上没有合适的包来测试,这里不再叙述,有需求的朋友可以自行测试即可。
这个插件,其实也可以做成一个界面形式的,将ImeiImsi可以做成自己想要修改的数值,有兴趣的,自己写下。

相关附件资料:


http://pan.baidu.com/s/1gd9rV2r



前面三课没有学习的,自行翻阅,一步一步来,按照文中所有的叙述操作即可,然后自己再思考扩展一下,这样才是我们这几课程的目的。


此系列文章暂时停一下,等大家掌握好基础,将这几课程的全部搞明白了,再继续发布~





免费评分

参与人数 3热心值 +3 收起 理由
CtoneGao + 1 谢谢@Thanks!
爱吃桃的猪 + 1 入门的导师,非常感谢
catty870807 + 1 鬼哥出品,必属精品,收藏学习了,谢谢!!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 听鬼哥说故事 发表于 2014-9-5 10:00
ldmsoft 发表于 2014-9-5 00:14
不得不顶,想问问为什么这个库需要重启才能用?

因为是cydia的插件,cydia在开机时候会检测自己的一个表,查看哪些东西是它的插件,然后加载,不重启的话就肯定无法识别的。
索马里的海贼 发表于 2014-9-3 10:31
灵魂深处 发表于 2014-9-3 10:38
MMAKI 发表于 2014-9-3 11:56 来自手机
很好,继续支持
心断空 发表于 2014-9-3 13:05
活捉大牛
小试锋芒 发表于 2014-9-3 18:18
期待之四,最后整成一片精华。
Thend 发表于 2014-9-4 14:55
期待后续文章
taintitly 发表于 2014-9-4 17:40
这么好的文章居然没有人来顶
ldmsoft 发表于 2014-9-5 00:14
不得不顶,想问问为什么这个库需要重启才能用?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 01:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表