MoMo一句代码自动抢红包

本文为笔者原创教程, 如需转载, 请注明出处.

MoMo一句代码自动抢红包_第1张图片
IMG_1028.JPG

打开USBSSH, 用localhost连接越狱设备

显示运行的app

 root# ps -e

找到momo的位置:

 2115 ??         0:40.35 /var/containers/Bundle/Application/FC49F816-34B6-41EE-B067-4C4417841D93/MomoChat.app/MomoChat

接着用cycript找到document的位置:

root# cycript -p 2115
cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
#"file:///var/mobile/Containers/Data/Application/BB4BBD52-3E22-443C-A67B-C644BBB1F4EA/Documents/"

接着把dumpdecrypted.dylib放进document里面:

 /Users/mac > scp /Users/mac/Desktop/dumpDecryted/dumpdecrypted.dylib  [email protected]:/var/mobile/Containers/Data/Application/BB4BBD52-3E22-443C-A67B-C644BBB1F4EA/Documents/
dumpdecrypted.dylib                                                                                                          100%  193KB   1.8MB/s   00:00

砸壳的时候, 在9.的系统需要切到mobile目录下. 砸壳就是把应用在app store上加的壳砸开, 方便我们导出头文件, 然后切到刚才的document下:

root# su mobile
/var/root mobile$
/var/root mobile$ cd /var/mobile/Containers/Data/Application/BB4BBD52-3E22-443C-A67B-C644BBB1F4EA/Documents/

开始砸壳:

~/Containers/Data/Application/BB4BBD52-3E22-443C-A67B-C644BBB1F4EA/Documents mobile$ 

DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/FC49F816-34B6-41EE-B067-4C4417841D93/MomoChat.app/MomoCha

mach-o decryption dumper

DISCLAIMER: This tool is only meant for security research purposes, not for application crackers.

[+] detected 64bit ARM binary in memory.
[+] offset to cryptid found: @0x1000c4d48(from 0x1000c4000) = d48
[+] Found encrypted data at address 00004000 of length 41566208 bytes - type 1.
[+] Opening /private/var/containers/Bundle/Application/FC49F816-34B6-41EE-B067-4C4417841D93/MomoChat.app/MomoChat for reading.
[+] Reading header
[+] Detecting header type
[+] Executable is a plain MACH-O image
[+] Opening MomoChat.decrypted for writing.
[+] Copying the not encrypted start of the file
[+] Dumping the decrypted data into the file
[+] Copying the not encrypted remainder of the file
[+] Setting the LC_ENCRYPTION_INFO->cryptid to 0 at offset d48
[+] Closing original file
[+] Closing dump file

可以看到我们砸壳出来之后的文件MomoChat.decrypted :

~/Containers/Data/Application/BB4BBD52-3E22-443C-A67B-C644BBB1F4EA/Documents mobile$ ls

MomoChat.decrypted  db           profile_1000472917682.dat  u.1000472917682.sqlite   u.36529596.sqlite   user.1000472917682.conf
app.conf        dumpdecrypted.dylib  profile_36529596.dat       u.1000472917682_main.sqlite  u.36529596_main.sqlite  user.36529596.conf

拿到砸壳之后的二进制文件, 接下来我们就可以对二进制文件进行class-dump, class-dump教程在前面有写到, 接下来就是丢进hopper里边进行反汇编分析.在hopper分析之余, 我们打开reveal, 找到红包的位置, 从图中我们获取到重要的线索, 红包的view名称:MLDetailExtraMessageView,这是我们重要的入口.以及所在的控制器, 都是很关键的线索.

使用reveal查看红包的位置,一目了然:

MoMo一句代码自动抢红包_第2张图片
Snip20170426_2.png

打开我们dump出来的头文件, 跳到: MLDetailExtraMessageView.h

这里肯定有我们需要的一些东西:

其中有两个方法引起了笔者的注意,如下:

- (void)setupWithMessage:(id)arg1 lineNumber:(long long)arg2;   // IMP=0x000000010032c218
- (void)touchUpInside:(id)arg1; // IMP=0x000000010032c0b4

上面方法后面的IMP, 是函数的偏移地址, 可以在class-dump过程中添加-A, 即可打印出地址, 不用到hopper里面查找.

首先在第一个方法里面, 肯定是用来给红包这个view赋值的, 它有两个入参, 第一个参数估计是一个装有红包数据的model, 于是我们可以挂上lldb, 用USBSSH连上越狱设备, 具体方法可以看之前的教程帖子.打断点在第一个方法上:

(lldb) br s -a 0x100420218
Breakpoint 1: where = MomoChat`_mh_execute_header + 3308504, address = 0x0000000100420218
Process 2316 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100420218 MomoChat`_mh_execute_header + 3326488
MomoChat`_mh_execute_header:
->  0x100420218 <+3326488>: stp    d9, d8, [sp, #-0x70]!
    0x10042021c <+3326492>: stp    x28, x27, [sp, #0x10]
    0x100420220 <+3326496>: stp    x26, x25, [sp, #0x20]
    0x100420224 <+3326500>: stp    x24, x23, [sp, #0x30]
(lldb) p (char *)$x1
(char *) $1 = 0x00000001024bcd69 "setupWithMessage:lineNumber:"
(lldb) po $x2

(lldb) po $x3
1

所以我们可以还原出含有入参的原函数:

- (void)setupWithMessage:(MLGroupMessage *)arg1 lineNumber:(long long)arg2; 

由上可以知道, 红包的数据肯定是装在了MLGroupMessage模型里面, 点进它的头文件看看:


@interface MLGroupMessage : NSObject

...
@property(copy, nonatomic) NSString *contentString; // @synthesize contentString=_contentString;
@property(retain, nonatomic) MDActionItem *actionItem; // @synthesize actionItem=_actionItem;
@property(copy, nonatomic) NSString *eventIcon; // 
此处省略好多文字
...

东西很多, 暂时先放着.

接下来我们来看下第二个函数,点击红包的函数:

- (void)touchUpInside:(id)arg1;    // IMP=0x000000010032c0b4

我们到hopper里边看看, 这个函数到底干了嘛:

MoMo一句代码自动抢红包_第3张图片
Snip20170427_3.png

简单还原成正常的oc函数就是下面这个, 是的, 就是这么少点东西:

[MLContext handleActionItem:self.actionItem];

我们从dump出的文件中找到原函数:

+ (void)handleActionItem:(id)arg1;  // IMP=0x0000000100af9c04

lldb打个断点在handleActionItem这个方法上, 看看它的入参是什么:

(lldb) br s -a 0x100BEDC04
Breakpoint 4: where = MomoChat`_mh_execute_header + 11490756, address = 0x0000000100bedc04
Process 2316 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 4.1
    frame #0: 0x0000000100bedc04 MomoChat`_mh_execute_header + 11508740
MomoChat`_mh_execute_header:
->  0x100bedc04 <+11508740>: stp    x22, x21, [sp, #-0x30]!
    0x100bedc08 <+11508744>: stp    x20, x19, [sp, #0x10]
    0x100bedc0c <+11508748>: stp    x29, x30, [sp, #0x20]
    0x100bedc10 <+11508752>: add    x29, sp, #0x20            ; =0x20
(lldb) po $x2

很好, 我们又成功组装了一个函数:

+ (void)handleActionItem:(MDActionItem *)arg1;

所以说上面的self.actionItem的类型其实就是MDActionItem, 而这个MDActionItem又是从哪来的呢, 那肯定是在上一步初始化时, 通过MLGroupMessage这个红包数据模型转化过来, 接下来就是搞清楚他们之间的关系, 即可完成自动抢红包啦. 抢红包流程简单点来说, 就是当红包这个view出现时, 立即去调用打开红包的函数, 而现在我们已经搞清楚了红包的出现, 以及红包调用的函数, 接下继续分析:

回到MLGroupMessage这个头文件里边, 我们轻易地找到了MDActionItem这个属性, 啊哈~!

@property(retain, nonatomic) MDActionItem *actionItem; // @synthesize actionItem=_actionItem;

这未免有点太直接了吧, 一下子就找到了他们之间的关系. 于是可以构建自动抢红包的思路啦, 我们通过hook住- (void)setupWithMessage:(MLGroupMessage *)arg1 lineNumber:(long long)arg2;
这个方法: 如下:

%hook
- (void)setupWithMessage:(MLGroupMessage *)arg1 lineNumber:(long long)arg2;{
  %orig;
[MLContext handleActionItem: arg1.actionItem];
}
%end

就一句代码就完成了自动抢红包, 有木有很神奇!
后面的安装细节就不表了.走到上面这步的, 应该都是有经验的小伙伴了.
本文为笔者原创教程, 如需转载, 请注明出处.

你可能感兴趣的:(MoMo一句代码自动抢红包)