# weibo code
新版本Weibo
[Image: https://quip.com/-/blob/3fcZuQjOv8SjSESIyd_d6A]
```
expand == true
cy# [[UIApp keyWindow] recursiveDescription]
@"<WBAppWindow: 0x15d28980; baseClass = UIWindow; frame = (0 0; 320 480); gestureRecognizers = <NSArray: 0x15d284f0>; layer = <UIWindowLayer: 0x15d28870>>
| <UILayoutContainerView: 0x15d26700; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0x15d26600>>
| | <UITransitionView: 0x15d25d80; frame = (0 0; 320 480); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x15d25c80>>
| | | <UIViewControllerWrapperView: 0x171abb40; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0x170b4eb0>>
| | | | <UILayoutContainerView: 0x170874e0; frame = (0 0; 320 480); autoresize = W+H; gestureRecognizers = <NSArray: 0x1708b020>; layer = <CALayer: 0x17087560>>
| | | | | <UINavigationTransitionView: 0x17088f70; frame = (0 0; 320 480); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x17088a60>>
| | | | | | <UIViewControllerWrapperView: 0x17176000; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0x17176070>>
| | | | | | | <UIView: 0x172b9000; frame = (0 0; 320 480); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x172b9060>>
| | | | | | | | <UIImageView: 0x172b9db0; frame = (0 0; 320 480); clipsToBounds = YES; autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x172b9e30>>
| | | | | | | | <WBMessageContentView: 0x172b9aa0; frame = (0 0; 320 480); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x172b9be0>>
| | | | | | | | | <WBTableView: 0x1661e800; baseClass = UITableView; frame = (0 0; 320 220); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x172b9120>; layer = <CALayer: 0x172b9090>; contentOffset: {0, 12068.5}; contentInset = {64, 0, 0, 0}; contentSize = {320, 50584}>
| | | | | | | | | | <UITableViewWrapperView: 0x172b9420; frame = (0 0; 320 220); autoresize = W+H; layer = <CALayer: 0x172b9490>>
| | | | | | | | | | | <WBMessageCell: 0x17398d20; baseClass = UITableViewCell; frame = (0 917; 320 49662); clipsToBounds = YES; opaque = NO; autoresize = W; layer = <CALayer: 0x17398ec0>>
| | | | | | | | | | | | <UITableViewCellScrollView: 0x17398ef0; frame = (0 0; 320 49662); autoresize = W+H; gestureRecognizers = <NSArray: 0x17399180>; layer = <CALayer: 0x173990c0>; contentOffset: {0, 0}>
cy# view =#0x1661e800
#"<WBTableView: 0x1661e800; baseClass = UITableView; frame = (0 0; 320 220); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x172b9120>; layer = <CALayer: 0x172b9090>; contentOffset: {0, 12068.5}; contentInset = {64, 0, 0, 0}; contentSize = {320, 50584}>"
cy# [view dataSource]
#"<WBMessagesTableViewController: 0x16581000>"
分析在下面的下面呢!!!!!!!!!!!!!!
cy# view =#0x1661e800
#"<WBTableView: 0x1661e800; baseClass = UITableView; frame = (0 0; 320 220); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x172b9120>; layer = <CALayer: 0x172b9090>; contentOffset: {0, 12068.5}; contentInset = {64, 0, 0, 0}; contentSize = {320, 50584}>"
cy# [view dataSource]
#"<WBMessagesTableViewController: 0x16581000>"
cy# controller = #0x16581000
#"<WBMessagesTableViewController: 0x16581000>"
cy# [controller prlmWrapper]
#"<WBMessagePRLMTableViewWrapper: 0x172bbda0>"
cy# prilmWrapper = #0x172bbda0
cy# [prilmWrapper tableView]
#"<WBTableView: 0x1661e800; baseClass = UITableView; frame = (0 0; 320 220); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x172b9120>; layer = <CALayer: 0x172b9090>; contentOffset: {0, 12068.5}; contentInset = {64, 0, 0, 0}; contentSize = {320, 50584}>"
```
[[prilmWrapper.delegate] respondsToSelector:@selector(showHeaderWhenRefresh:)]
WBMessagesTableViewController → MMSingleMessageViewController
{
- (void)viewDidLoad;
}
->>
MMBaseMessageViewController
{
- (void)scrollViewDidEndDragging:(id)arg1 willDecelerate:(_Bool)arg2;
- (_Bool)scrollViewShouldScrollToTop:(id)arg1;
- (void)scrollViewWillBeginDragging:(id)arg1;
- (void)scrollViewDidScroll:(id)arg1;
@property(retain, nonatomic) NSNumber *isScrollToBottom; // @synthesize isScrollToBottom=_isScrollToBottom;
- (void)viewDidLoad;
- (void)loadView;
}
实际操作过新浪微博iOS客户端的朋友就会知道,当上滑并松手时,才会“加载更多”。
这个操作在UIScrollViewDelegate中的触发函数是scrollViewDidEndDragging:willDecelerate:
分析 Mach-O 文件: [MMBaseMessageViewController scrollViewDidEndDragging:willDecelerate]
->>
[[MMBaseMessageViewController prlmWrapper] scrollViewDidEndDragging:willDecelerate]
接着 [MMBaseMessageViewController prlmWrapper]
->>
WBMessagePRLMTableViewWrapper *_prlmWrapper;
->>
@interface WBMessagePRLMTableViewWrapper : WBPRLMTableViewWrapper
->>
WBPRLMTableViewWrapper : PRLMTableViewWrapper
{
- (void)scrollViewDidEndDragging:(id)arg1 willDecelerate:(_Bool)arg2;
- (_Bool)scrollViewShouldScrollToTop:(id)arg1;
- (void)scrollViewWillBeginDragging:(id)arg1;
- (void)scrollViewDidScroll:(id)arg1;
}
->
WBMessagePRLMTableViewWrapper scrollViewDidEndDragging:willDecelerate
->
WBPRLMTableViewController.prlmWrapper
->
WBPRLMTableViewWrapper *prlmWrapper;
PRLMTableViewWrapper
{
- (void)scrollViewDidEndDragging:(id)arg1;
- (void)scrollViewDidScroll:(id)arg1;
}
[Image: https://quip.com/-/blob/INPoDbnlPrILy2ibFYNxrg]
```
__text:000000010093DF94 ; void __cdecl -[PRLMTableViewWrapper scrollViewDidEndDragging:](struct PRLMTableViewWrapper *self, SEL, id)
__text:000000010093DF94 __PRLMTableViewWrapper_scrollViewDidEndDragging__
__text:000000010093DF94 ; DATA XREF: __objc_const:00000001017AB128o
__text:000000010093DF94
__text:000000010093DF94 var_40 = -0x40
__text:000000010093DF94 var_30 = -0x30
__text:000000010093DF94 var_20 = -0x20
__text:000000010093DF94 var_10 = -0x10
__text:000000010093DF94
__text:000000010093DF94 STP D9, D8, [SP,#var_40]!
__text:000000010093DF98 STP X22, X21, [SP,#0x40+var_30]
__text:000000010093DF9C STP X20, X19, [SP,#0x40+var_20]
__text:000000010093DFA0 STP X29, X30, [SP,#0x40+var_10]
__text:000000010093DFA4 ADD X29, SP, #0x40+var_10
__text:000000010093DFA8 MOV X21, X2
__text:000000010093DFAC MOV X19, X0
__text:000000010093DFB0 ADRP X8, #selRef_tableView@PAGE
__text:000000010093DFB4 NOP
__text:000000010093DFB8 LDR X20, [X8,#selRef_tableView@PAGEOFF]
__text:000000010093DFBC MOV X1, X20
__text:000000010093DFC0 BL _objc_msgSend ; [PRLMTableViewWrapper tableView]
__text:000000010093DFC4 CMP X0, X21
__text:000000010093DFC8 B.NE loc_10093E134
```
[Image: https://quip.com/-/blob/uvJ0lU0nGQKMTMdMBRl9pA]最后推断函数是
[PRLMTableViewWrapper triggerLoadMore] 是更新函数
分析发包函数
-[MMInputManager sendButtonPressed:]
-(void)sendButtonPressed:(id)pressed;
->
[MMMessageUtility sendNewMessageWithText:inChat:callBack:]
+(void)sendNewMessageWithText:(id)text inChat:(id)chat callBack:(id)back;
->
→ MMBaseMessageViewController
{
-(void)sendImageMessages:(id)messages;
-(void)sendMessage:(id)message forward:(BOOL)forward;
}
最后推断
%hook MMMessageUtility
+(void)sendNewMessageWithText:(id)text inChat:(id)chat callBack:(id)back
{
//text 本次消息的内容
//inChat 之前的消息结构体
%orig;NSLog(@"~~~~~~~~~~~~~~~~today2");
//NSLog(@"text=%@",text);
NSLog(@"chat=%@",chat);
NSLog(@"back=%@",back);
}
%hook PRLMTableViewWrapper
-(void)triggerLoadMore 刷新得到数据
{
%orig;
NSLog(@"~~~~~~~~~~~~~~~~today4");
}
%end
继续 分析 triggerLoadMore 函数 发现是同步 应该就是它了
[Image: https://quip.com/-/blob/e6_y3P7e8VCl59Hv4GXNLg]
新版本Weibo
[Image: https://quip.com/-/blob/3fcZuQjOv8SjSESIyd_d6A]
```
expand == true
cy# [[UIApp keyWindow] recursiveDescription]
@"<WBAppWindow: 0x15d28980; baseClass = UIWindow; frame = (0 0; 320 480); gestureRecognizers = <NSArray: 0x15d284f0>; layer = <UIWindowLayer: 0x15d28870>>
| <UILayoutContainerView: 0x15d26700; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0x15d26600>>
| | <UITransitionView: 0x15d25d80; frame = (0 0; 320 480); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x15d25c80>>
| | | <UIViewControllerWrapperView: 0x171abb40; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0x170b4eb0>>
| | | | <UILayoutContainerView: 0x170874e0; frame = (0 0; 320 480); autoresize = W+H; gestureRecognizers = <NSArray: 0x1708b020>; layer = <CALayer: 0x17087560>>
| | | | | <UINavigationTransitionView: 0x17088f70; frame = (0 0; 320 480); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x17088a60>>
| | | | | | <UIViewControllerWrapperView: 0x17176000; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0x17176070>>
| | | | | | | <UIView: 0x172b9000; frame = (0 0; 320 480); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x172b9060>>
| | | | | | | | <UIImageView: 0x172b9db0; frame = (0 0; 320 480); clipsToBounds = YES; autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x172b9e30>>
| | | | | | | | <WBMessageContentView: 0x172b9aa0; frame = (0 0; 320 480); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x172b9be0>>
| | | | | | | | | <WBTableView: 0x1661e800; baseClass = UITableView; frame = (0 0; 320 220); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x172b9120>; layer = <CALayer: 0x172b9090>; contentOffset: {0, 12068.5}; contentInset = {64, 0, 0, 0}; contentSize = {320, 50584}>
| | | | | | | | | | <UITableViewWrapperView: 0x172b9420; frame = (0 0; 320 220); autoresize = W+H; layer = <CALayer: 0x172b9490>>
| | | | | | | | | | | <WBMessageCell: 0x17398d20; baseClass = UITableViewCell; frame = (0 917; 320 49662); clipsToBounds = YES; opaque = NO; autoresize = W; layer = <CALayer: 0x17398ec0>>
| | | | | | | | | | | | <UITableViewCellScrollView: 0x17398ef0; frame = (0 0; 320 49662); autoresize = W+H; gestureRecognizers = <NSArray: 0x17399180>; layer = <CALayer: 0x173990c0>; contentOffset: {0, 0}>
cy# view =#0x1661e800
#"<WBTableView: 0x1661e800; baseClass = UITableView; frame = (0 0; 320 220); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x172b9120>; layer = <CALayer: 0x172b9090>; contentOffset: {0, 12068.5}; contentInset = {64, 0, 0, 0}; contentSize = {320, 50584}>"
cy# [view dataSource]
#"<WBMessagesTableViewController: 0x16581000>"
分析在下面的下面呢!!!!!!!!!!!!!!
cy# view =#0x1661e800
#"<WBTableView: 0x1661e800; baseClass = UITableView; frame = (0 0; 320 220); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x172b9120>; layer = <CALayer: 0x172b9090>; contentOffset: {0, 12068.5}; contentInset = {64, 0, 0, 0}; contentSize = {320, 50584}>"
cy# [view dataSource]
#"<WBMessagesTableViewController: 0x16581000>"
cy# controller = #0x16581000
#"<WBMessagesTableViewController: 0x16581000>"
cy# [controller prlmWrapper]
#"<WBMessagePRLMTableViewWrapper: 0x172bbda0>"
cy# prilmWrapper = #0x172bbda0
cy# [prilmWrapper tableView]
#"<WBTableView: 0x1661e800; baseClass = UITableView; frame = (0 0; 320 220); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x172b9120>; layer = <CALayer: 0x172b9090>; contentOffset: {0, 12068.5}; contentInset = {64, 0, 0, 0}; contentSize = {320, 50584}>"
```
[[prilmWrapper.delegate] respondsToSelector:@selector(showHeaderWhenRefresh:)]
WBMessagesTableViewController → MMSingleMessageViewController
{
- (void)viewDidLoad;
}
->>
MMBaseMessageViewController
{
- (void)scrollViewDidEndDragging:(id)arg1 willDecelerate:(_Bool)arg2;
- (_Bool)scrollViewShouldScrollToTop:(id)arg1;
- (void)scrollViewWillBeginDragging:(id)arg1;
- (void)scrollViewDidScroll:(id)arg1;
@property(retain, nonatomic) NSNumber *isScrollToBottom; // @synthesize isScrollToBottom=_isScrollToBottom;
- (void)viewDidLoad;
- (void)loadView;
}
实际操作过新浪微博iOS客户端的朋友就会知道,当上滑并松手时,才会“加载更多”。
这个操作在UIScrollViewDelegate中的触发函数是scrollViewDidEndDragging:willDecelerate:
分析 Mach-O 文件: [MMBaseMessageViewController scrollViewDidEndDragging:willDecelerate]
->>
[[MMBaseMessageViewController prlmWrapper] scrollViewDidEndDragging:willDecelerate]
接着 [MMBaseMessageViewController prlmWrapper]
->>
WBMessagePRLMTableViewWrapper *_prlmWrapper;
->>
@interface WBMessagePRLMTableViewWrapper : WBPRLMTableViewWrapper
->>
WBPRLMTableViewWrapper : PRLMTableViewWrapper
{
- (void)scrollViewDidEndDragging:(id)arg1 willDecelerate:(_Bool)arg2;
- (_Bool)scrollViewShouldScrollToTop:(id)arg1;
- (void)scrollViewWillBeginDragging:(id)arg1;
- (void)scrollViewDidScroll:(id)arg1;
}
->
WBMessagePRLMTableViewWrapper scrollViewDidEndDragging:willDecelerate
->
WBPRLMTableViewController.prlmWrapper
->
WBPRLMTableViewWrapper *prlmWrapper;
PRLMTableViewWrapper
{
- (void)scrollViewDidEndDragging:(id)arg1;
- (void)scrollViewDidScroll:(id)arg1;
}
[Image: https://quip.com/-/blob/INPoDbnlPrILy2ibFYNxrg]
```
__text:000000010093DF94 ; void __cdecl -[PRLMTableViewWrapper scrollViewDidEndDragging:](struct PRLMTableViewWrapper *self, SEL, id)
__text:000000010093DF94 __PRLMTableViewWrapper_scrollViewDidEndDragging__
__text:000000010093DF94 ; DATA XREF: __objc_const:00000001017AB128o
__text:000000010093DF94
__text:000000010093DF94 var_40 = -0x40
__text:000000010093DF94 var_30 = -0x30
__text:000000010093DF94 var_20 = -0x20
__text:000000010093DF94 var_10 = -0x10
__text:000000010093DF94
__text:000000010093DF94 STP D9, D8, [SP,#var_40]!
__text:000000010093DF98 STP X22, X21, [SP,#0x40+var_30]
__text:000000010093DF9C STP X20, X19, [SP,#0x40+var_20]
__text:000000010093DFA0 STP X29, X30, [SP,#0x40+var_10]
__text:000000010093DFA4 ADD X29, SP, #0x40+var_10
__text:000000010093DFA8 MOV X21, X2
__text:000000010093DFAC MOV X19, X0
__text:000000010093DFB0 ADRP X8, #selRef_tableView@PAGE
__text:000000010093DFB4 NOP
__text:000000010093DFB8 LDR X20, [X8,#selRef_tableView@PAGEOFF]
__text:000000010093DFBC MOV X1, X20
__text:000000010093DFC0 BL _objc_msgSend ; [PRLMTableViewWrapper tableView]
__text:000000010093DFC4 CMP X0, X21
__text:000000010093DFC8 B.NE loc_10093E134
```
[Image: https://quip.com/-/blob/uvJ0lU0nGQKMTMdMBRl9pA]最后推断函数是
[PRLMTableViewWrapper triggerLoadMore] 是更新函数
分析发包函数
-[MMInputManager sendButtonPressed:]
-(void)sendButtonPressed:(id)pressed;
->
[MMMessageUtility sendNewMessageWithText:inChat:callBack:]
+(void)sendNewMessageWithText:(id)text inChat:(id)chat callBack:(id)back;
->
→ MMBaseMessageViewController
{
-(void)sendImageMessages:(id)messages;
-(void)sendMessage:(id)message forward:(BOOL)forward;
}
最后推断
%hook MMMessageUtility
+(void)sendNewMessageWithText:(id)text inChat:(id)chat callBack:(id)back
{
//text 本次消息的内容
//inChat 之前的消息结构体
%orig;NSLog(@"~~~~~~~~~~~~~~~~today2");
//NSLog(@"text=%@",text);
NSLog(@"chat=%@",chat);
NSLog(@"back=%@",back);
}
%hook PRLMTableViewWrapper
-(void)triggerLoadMore 刷新得到数据
{
%orig;
NSLog(@"~~~~~~~~~~~~~~~~today4");
}
%end
继续 分析 triggerLoadMore 函数 发现是同步 应该就是它了
[Image: https://quip.com/-/blob/e6_y3P7e8VCl59Hv4GXNLg]