逆向微信Mac客户端:微信情话助手初版
前言
上一篇文章《用了這個(gè),我追到了自己的女神:Mac版QQ半自動發(fā)送情話》 發(fā)布后,有幾個(gè)朋友私信問說QQ過時(shí)了女神不用了,能不能整個(gè)微信的?有別的大神已經(jīng)開發(fā)了微信網(wǎng)頁版的自動發(fā)消息,可以登錄網(wǎng)頁版微信的朋友可以去試一試把發(fā)送部分改掉就可以了,我因?yàn)椴荒艿卿浘W(wǎng)頁版微信所以用不了,今天來嘗試用逆向Mac微信解決一下這個(gè)問題。
最新版的插件直接看這篇文章逆向Mac版微信-情話助手終版(女神邀請我恰飯了~)
最新版的插件直接看這篇文章逆向Mac版微信-情話助手終版(女神邀請我恰飯了~)
最新版的插件直接看這篇文章逆向Mac版微信-情話助手終版(女神邀請我恰飯了~)
想學(xué)習(xí)逆向過程的可以往下看
開始
工具
- Xcode(蘋果開發(fā)工具)
- IDA (逆向神器,反編譯工具 )
- Class-dump (導(dǎo)出可執(zhí)行文件的Class Header)
過程
1.Dump 出頭文件
首先利用Class-Dump拿到微信的頭文件
打開終端執(zhí)行:
執(zhí)行之后就能獲取到很多頭文件了
英文好的都知道消息是Message,我就搜索一下,直接就找到了一個(gè)MessageService文件。
打開發(fā)現(xiàn),發(fā)送消息的方法是在這個(gè)文件
有發(fā)送文本,發(fā)送定位,發(fā)送GIF等等方法,我們使用發(fā)送文本的方法就可以了。
2.反編譯
選擇微信APP文件,右鍵顯示包內(nèi)容,找到圖中二進(jìn)制可執(zhí)行文件
扔Hopper Disassembler里邊開始反編譯,在漫長的等待后得到編譯結(jié)果。
配合第一步中的頭文件一頓常規(guī)查找分析之后,得到以下幾個(gè)方法:
- 登錄按鈕事件: MMLoginOneClickViewController 中的
-(void)onLoginButtonClicked:(id)arg1; - 授權(quán)狀態(tài)查詢 WeChat 下的
-(BOOL)IsAuthOK; - 服務(wù)層處理中心-獲取消息服務(wù) : MMServiceCenter中的
-(id)getService:(Class)arg1; - 發(fā)送信息服務(wù): MessageService中的
-(id)SendTextMessage:(id)arg1 toUsrName:(id)arg2 msgText (id)arg3 atUserList:(id)arg4;
3.hook 微信
注入Mac App 的步驟和注入iOS步驟差不多,會iOS的可以直接跳下去看最后的Hook代碼。
FQHelper.h
內(nèi)容如下:
FQHelper.m
內(nèi)容如下:
hook 代碼
原理就是:替換登錄按鈕事件,點(diǎn)擊登錄按鈕事件之后,每5秒查詢一次授權(quán)狀態(tài),授權(quán)成功的時(shí)候發(fā)送消息
Wechat+hook.h
Wechat+hook.m
#import "Wechat+hook.h" #import "WeChatHeader.h" #import "FQHelper.h" #import <CommonCrypto/CommonDigest.h> #import <AppKit/AppKit.h> #import <objc/runtime.h>@implementation NSObject (WeChatHook) + (void)hookWeChat{hookMethod(objc_getClass("MMLoginOneClickViewController"), @selector(onLoginButtonClicked:), [self class], @selector(hook_onLoginButtonClicked:));} - (void)hook_onLoginButtonClicked:(NSButton *)btn {NSLog(@"點(diǎn)擊了登錄按鈕");[self hook_onLoginButtonClicked:btn];[self getAuthState]; }- (void)getAuthState{WeChat *wechat = [objc_getClass("WeChat") sharedInstance];if ([wechat IsAuthOK]) {NSLog(@"授權(quán)成功");dispatch_async(dispatch_get_main_queue(), ^{// 獲取發(fā)送用戶NSString *currentUserName = [objc_getClass("CUtility") GetCurrentUserName];// 獲取發(fā)送消息服務(wù)MessageService *service = [[objc_getClass("MMServiceCenter") defaultCenter] getService:objc_getClass("MessageService")];NSPasteboard *pb = [NSPasteboard generalPasteboard];if ([[pb types] containsObject:NSPasteboardTypeString]) {NSString *s = [pb stringForType:NSPasteboardTypeString];// do something[service SendTextMessage:currentUserName toUsrName:@"你女神的微信號" msgText:s atUserList:nil];}});}else{NSLog(@"授權(quán)失敗");dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{dispatch_async(dispatch_get_main_queue(), ^{[self getAuthState];});});} } @end在xcode的targets->BuildPhases里添加一個(gè)腳本。
腳本內(nèi)容:
定義好目標(biāo)app的路徑,備份好原有二進(jìn)制文件。將編譯好的framework文件拷貝到目標(biāo)app目錄,用insert_dylib這個(gè)工具進(jìn)行注入。insert_dylib工具我放在demo項(xiàng)目根目錄中
7.編輯schema的excutable,選擇應(yīng)用程序里的微信
8.運(yùn)行程序,測試一下。
登錄微信后,立即發(fā)送成功。運(yùn)行一次后,已經(jīng)注入成功,以后打開微信都會發(fā)送,剪貼板第一條信息。
使用教程
使用教程大致和QQ差不多,請參考上一篇文章《用了這個(gè),我追到了自己的女神:Mac版QQ半自動發(fā)送情話》,執(zhí)行過程:開機(jī)自動啟動情話執(zhí)行腳本.app->執(zhí)行python獲取一句情話并啟動微信->點(diǎn)擊微信登錄按鈕后->遍歷查詢是否登錄完成->登錄完成發(fā)送情話
按照上一篇文章步驟,以下只敘述修改點(diǎn)。
結(jié)束語
因?yàn)槭亲詣影l(fā)送,爬取完情話最好自己先看一遍,把不合適的話刪掉,不然小心女神拉黑你。
看完的朋友麻煩點(diǎn)個(gè)關(guān)注,點(diǎn)個(gè)贊,需要的朋友可以點(diǎn)個(gè)收藏。這個(gè)教程感覺還是寫的麻煩了,寫的過程也有了點(diǎn)新的想法,回邊再研究研究看看能不能把教程再精簡一下,下一篇出一個(gè)使用方法更簡單的終極版插件。
如有問題可留言解決。
總結(jié)
以上是生活随笔為你收集整理的逆向微信Mac客户端:微信情话助手初版的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android模拟器转方向,androi
- 下一篇: 一探B站后台架构, 他山之石, 何以攻玉