|
一想到写图文就瑟瑟发抖,耗费大量时间,还。。。还没人看
Hmmm,一句话叫 Android日不动就去IOS日,总有一个能日的他服服帖帖
废话不多说,本次教程包括基础环境搭建和使用HOOK实现修改WeChat运动步数
因为代码量以及分析量巨大 所以一篇讲不完 分开讲
PS:真实原因 我。。。我懒啊
教程目录:
(一)环境搭建以及实现步数修改
(二)实现自动抢红包
(三)实现消息防撤回
实现环境:
1.越狱iPhone一台以及Mac一台(黑苹果也行)
2.Xcode(貌似只有Mac版)
3.Frida(HOOK工具)
4.了解Objective-C 以及JS
5.Class-Dump (Dump Header)
6.砸壳工具(因为从App Store下载的应用都是加过一层保护壳的,也就是加密的)
7.MonkeyDev
8.Hopper(或者IDA)
首先iPhone越狱 这个就不多讲了 大家都会得嘛
安装Frida 这个也不讲了 请看我之前的帖子:安卓逆向——Frida Hook 入门教学
https://www.52hb.com/thread-39372-1-1.html
(出处: 吾爱汇编论坛)
此处只需要安装即可 不需要下载Frida-Server
在iPhone安装Frida 越狱后打开Cydia
然后添加安装源:https://build.frida.re 成功后搜索Frida 点击安装即可
然后iPhone USB连接电脑 终端输入frida-ps -Uai
这样就可以看到手机里的所有进程了
Class-Dump 下载:http://stevenygard.com/projects/class-dump/ 选择相应版本安装
砸壳工具下载:https://github.com/AloneMonkey/frida-ios-dump
或者更简单的去PP助手下载已经砸壳的软件即可
MonkeyDev安装:https://github.com/AloneMonkey/MonkeyDev 跟着教程走 没啥难点
Xcode 百度下载安装 或者用App Store下载 挺大的。。。。
Hopper 用于反编译分析 也可以用IDA 看自己喜欢
下面开干
砸壳好的 然后在解压 得到一下几个文件 Payload里面是我们需要分析的WeChat主文件
class-dump 头文件 终端输入class-dump -H XXX.app即可 也就是WeChat
然后进入文件夹 搜索相关StepCount(步数)最终找到这个头文件:WCDeviceStepObject.h
[C] 纯文本查看 复制代码 //
// Generated by class-dump 3.5 (64 bit) (Debug version compiled Sep 17 2017 16:24:48).
//
// class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2015 by Steve Nygard.
//
#import <MMCommon/MMObject.h>
@class NSMutableArray;
@interface WCDeviceStepObject : MMObject
{
unsigned int beginTime;
unsigned int endTime;
unsigned int m7StepCount;
unsigned int hkStepCount;
NSMutableArray *allHKSampleSource;
}
@property(retain, nonatomic) NSMutableArray *allHKSampleSource; // @synthesize allHKSampleSource;
@property(nonatomic) unsigned int hkStepCount; // @synthesize hkStepCount;
@property(nonatomic) unsigned int m7StepCount; // @synthesize m7StepCount;
@property(nonatomic) unsigned int endTime; // @synthesize endTime;
@property(nonatomic) unsigned int beginTime; // @synthesize beginTime;
- (void).cxx_destruct;
@end
我们可以看到与步数相关的有两个
@property(nonatomic) unsigned int hkStepCount; // @synthesize hkStepCount;
@property(nonatomic) unsigned int m7StepCount; // @synthesize m7StepCount;
暂时不能确定是哪个 先去看看分析 将Payload里的WeChat拖进Hopper或者IDA
可以看到伪OC代码
[C] 纯文本查看 复制代码 unsigned long -[WCDeviceStepObject m7StepCount](void * self, void * _cmd) {
r0 = self->m7StepCount;
return r0;
}
[C] 纯文本查看 复制代码 unsigned long -[WCDeviceStepObject hkStepCount](void * self, void * _cmd) {
r0 = self->hkStepCount;
return r0;
}
发现其都返回R0 这样就没办法直接判断谁是的了 只能都HOOK 才能判断出来
接下来编写HOOK代码 我们用Frida 去做 其实使用MonkeyDev会快很多 简单很多 贴一下代码吧 不做解释
[C] 纯文本查看 复制代码 CHDeclareClass(WCDeviceStepObject)
CHOptimizedMethod0(self, unsigned int, WCDeviceStepObject, m7StepCount){
//返回类型unsigned int
return 18888;
}
CHConstructor{
NSLog(INSERT_SUCCESS_WELCOME);
CHHook0(WCDeviceStepObject,m7StepCount);
}
还是来看frida怎么做
JS 代码实现部分
[Java] 纯文本查看 复制代码 if (ObjC.available)
{
try
{
var className = "WCDeviceStepObject";//类名
var funcName = "- m7StepCount";//方法名 主要方法名一定要全 注意名字前面的"-"
var hook = eval('ObjC.classes.' + className + '["' + funcName + '"]');
console.log("[*] Class Name: " + className);
console.log("[*] Method Name: " + funcName);
Interceptor.attach(hook.implementation, {
onEnter: function(args) {//函数索引是从0开始算的
console.log("param:"+args[0]+" type:"+typeof args[0]);
},
onLeave: function(retval) {
console.log("retval:"+retval+" type:"+typeof retval);//retval 永远是一个对象
newretval=ptr("0x5000");//注意此处为NativePointer,并非实际的步数值 真实值为unsigned int型 retval.replace(newretval);
console.log("New retval-> type:"+typeof args[0]+" value:"+newretval);
send(newretval);
}
});
}
catch(err)
{
console.log("[!] Exception2: " + err.message);
}
}
else
{
console.log("Objective-C Runtime is not available!");
}
最后全部代码:
[Python] 纯文本查看 复制代码 import frida
import sys
session = frida.get_usb_device().attach(59390)//PID frida-ps-Uai
script_string = """
if (ObjC.available)
{
try
{
var className = "WCDeviceStepObject";
var funcName = "- m7StepCount";
var hook = eval('ObjC.classes.' + className + '["' + funcName + '"]');
console.log("[*] Class Name: " + className);
console.log("[*] Method Name: " + funcName);
Interceptor.attach(hook.implementation, {
onEnter: function(args) {
console.log("param:"+args[0]+" type:"+typeof args[0]);
},
onLeave: function(retval) {
console.log("retval:"+retval+" type:"+typeof retval);
newretval=ptr("0x5000");
retval.replace(newretval);
console.log("New retval-> type:"+typeof args[0]+" value:"+newretval);
send(newretval);
}
});
}
catch(err)
{
console.log("[!] Exception2: " + err.message);
}
}
else
{
console.log("Objective-C Runtime is not available!");
}
"""
script = session.create_script(script_string)
def on_message(message, data):
if message['type'] == 'error':
print("[!] " + message['stack'])
elif message['type'] == 'send':
print("[i] " + message['payload'])
else:
print(message)
script.on('message', on_message)
script.load()
sys.stdin.read()
保存为XX.py 然后终端运行一下 就OK了
上效果图 PS:我那天去西天顺便取了经
下一篇讲使用Frida 实现自动抢红包
不求别的 麻烦各位大佬 进来看看可好
|
评分
-
参与人数 16 | 威望 +1 |
HB +61 |
THX +13 |
收起
理由
|
嗜血狂魔
| |
+ 1 |
+ 1 |
[吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩! |
少年灬无双
| |
+ 2 |
+ 1 |
|
虚心学习
| |
|
+ 1 |
[吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少! |
temp
| |
+ 1 |
+ 1 |
|
一个人的你好
| |
+ 1 |
|
|
VipDongle
| |
+ 1 |
|
|
消逝的过去
| |
|
+ 1 |
|
冷亦飞
| |
|
+ 1 |
|
lies
| |
|
+ 1 |
|
帅呆鹏
| |
+ 1 |
|
|
轮回
| |
+ 5 |
+ 1 |
|
售野生奥特曼
| |
+ 5 |
+ 1 |
[快捷评语] - 2018,狗年发发发,狗年旺旺旺! |
syzh802618
| |
+ 3 |
+ 1 |
[快捷评语] - 2018,狗年发发发,狗年旺旺旺! |
insane
| |
+ 5 |
+ 1 |
惊险大佬!~~~~~~~~~~ |
李沉舟
| |
+ 6 |
+ 1 |
[快捷评语] - 2018,狗年发发发,狗年旺旺旺! |
Shark恒
| + 1 |
+ 30 |
+ 1 |
不错不错,回头也学一学ios内容 |
查看全部评分
|