From 8788074d2101f6c5a81c8c45ffc650ed4f713fbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=B4=8B?= <244573118@qq.com> Date: Thu, 30 May 2019 20:14:01 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Install.sh | 42 +++++++++ Uninstall.sh | 38 +++++++++ WeChatIntercept.framework/Headers | 1 + WeChatIntercept.framework/Modules | 1 + WeChatIntercept.framework/Resources | 1 + .../Versions/A/Headers/WeChatIntercept.h | 80 ++++++++++++++++++ .../Versions/A/Modules/module.modulemap | 6 ++ .../Versions/A/Resources/Info.plist | 44 ++++++++++ .../Versions/A/WeChatIntercept | Bin 0 -> 15500 bytes WeChatIntercept.framework/Versions/Current | 1 + WeChatIntercept.framework/WeChatIntercept | 1 + insert_dylib | Bin 0 -> 24696 bytes 12 files changed, 215 insertions(+) create mode 100755 Install.sh create mode 100755 Uninstall.sh create mode 120000 WeChatIntercept.framework/Headers create mode 120000 WeChatIntercept.framework/Modules create mode 120000 WeChatIntercept.framework/Resources create mode 100644 WeChatIntercept.framework/Versions/A/Headers/WeChatIntercept.h create mode 100644 WeChatIntercept.framework/Versions/A/Modules/module.modulemap create mode 100644 WeChatIntercept.framework/Versions/A/Resources/Info.plist create mode 100755 WeChatIntercept.framework/Versions/A/WeChatIntercept create mode 120000 WeChatIntercept.framework/Versions/Current create mode 120000 WeChatIntercept.framework/WeChatIntercept create mode 100755 insert_dylib diff --git a/Install.sh b/Install.sh new file mode 100755 index 0000000..b0c12b2 --- /dev/null +++ b/Install.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +WeChat_path="/Applications/WeChat.app" + +if [ ! -d "$WeChat_path" ] +then + WeChat_path="/Applications/微信.app" + if [ ! -d "$WeChat_path" ] + then + echo -e "应用程序文件夹中未发现微信" + exit + fi +fi + +app_name="WeChat" +shell_path="$(dirname "$0")" +framework_name="WeChatIntercept" +app_bundle_path="${WeChat_path}/Contents/MacOS" +app_executable_path="${app_bundle_path}/${app_name}" +app_executable_backup_path="${app_executable_path}_backup" +framework_path="${shell_path}/${framework_name}.framework" +echo framework_path-----$framework_path +if [ ! -w "$WeChat_path" ] +then + echo -e "为了将ZY助手写入微信, 请输入密码 : " + sudo chown -R $(whoami) "$WeChat_path" +fi + +if [ ! -f "$app_executable_backup_path" ] || [ -n "$1" -a "$1" = "--force" ] +then + + cp "$app_executable_path" "$app_executable_backup_path" + result="y" +else + read -t 150 -p "已安装ZY助手,是否覆盖?[y/n]:" result +fi + +if [[ "$result" == 'y' ]]; then + cp -r $framework_path ${app_bundle_path} + ${shell_path}/insert_dylib --all-yes "${framework_path}/${framework_name}" "$app_executable_backup_path" "$app_executable_path" + echo "安装成功!" +fi diff --git a/Uninstall.sh b/Uninstall.sh new file mode 100755 index 0000000..7620039 --- /dev/null +++ b/Uninstall.sh @@ -0,0 +1,38 @@ +# !/bin/bash + +WeChat_path="/Applications/WeChat.app" + +if [ ! -d "$WeChat_path" ] +then + WeChat_path="/Applications/微信.app" + if [ ! -d "$WeChat_path" ] + then + echo -e "应用程序文件夹中未发现微信" + exit + fi +fi + +app_name="WeChat" +framework_name="WeChatIntercept" +app_bundle_path="${WeChat_path}/Contents/MacOS" +app_executable_path="${app_bundle_path}/${app_name}" +app_executable_backup_path="${app_executable_path}_backup" +framework_path="${app_bundle_path}/${framework_name}.framework" + +# 备份WeChat原始可执行文件 +if [ -f "$app_executable_backup_path" ] +then + rm "$app_executable_path" + rm -rf "$framework_path" + mv "$app_executable_backup_path" "$app_executable_path" + + if [ -f "$app_executable_backup_path" ] + then + echo "卸载失败,请到 /Applications/WeChat.app/Contents/MacOS 路径,删除 WeChatIntercept.framework、WeChat 两个文件文件,并将 WeChat_backup 重命名为 WeChat" + else + echo "卸载成功!" + fi + +else + echo "未发现ZY助手" +fi diff --git a/WeChatIntercept.framework/Headers b/WeChatIntercept.framework/Headers new file mode 120000 index 0000000..a177d2a --- /dev/null +++ b/WeChatIntercept.framework/Headers @@ -0,0 +1 @@ +Versions/Current/Headers \ No newline at end of file diff --git a/WeChatIntercept.framework/Modules b/WeChatIntercept.framework/Modules new file mode 120000 index 0000000..5736f31 --- /dev/null +++ b/WeChatIntercept.framework/Modules @@ -0,0 +1 @@ +Versions/Current/Modules \ No newline at end of file diff --git a/WeChatIntercept.framework/Resources b/WeChatIntercept.framework/Resources new file mode 120000 index 0000000..953ee36 --- /dev/null +++ b/WeChatIntercept.framework/Resources @@ -0,0 +1 @@ +Versions/Current/Resources \ No newline at end of file diff --git a/WeChatIntercept.framework/Versions/A/Headers/WeChatIntercept.h b/WeChatIntercept.framework/Versions/A/Headers/WeChatIntercept.h new file mode 100644 index 0000000..78407c1 --- /dev/null +++ b/WeChatIntercept.framework/Versions/A/Headers/WeChatIntercept.h @@ -0,0 +1,80 @@ +// +// WeChatIntercept.h +// WeChatIntercept +// +// Created by 张洋 on 2019/5/30. +// Copyright © 2019 张洋. All rights reserved. +// + +#import + +//! Project version number for WeChatIntercept. +FOUNDATION_EXPORT double WeChatInterceptVersionNumber; + +//! Project version string for WeChatIntercept. +FOUNDATION_EXPORT const unsigned char WeChatInterceptVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import +@interface MessageData : NSObject +- (id)initWithMsgType:(long long)arg1; + @property(retain, nonatomic) NSString *fromUsrName; + @property(retain, nonatomic) NSString *toUsrName; + @property(retain, nonatomic) NSString *msgContent; + @property(retain, nonatomic) NSString *msgPushContent; + @property(nonatomic) int messageType; + @property(nonatomic) int msgStatus; + @property(nonatomic) int msgCreateTime; + @property(nonatomic) int mesLocalID; + @property(nonatomic) long long mesSvrID; + @property(retain, nonatomic) NSString *msgVoiceText; + @property(copy, nonatomic) NSString *m_nsEmoticonMD5; +- (BOOL)isChatRoomMessage; +- (NSString *)groupChatSenderDisplayName; +- (id)getRealMessageContent; +- (id)getChatRoomUsrName; +- (BOOL)isSendFromSelf; +- (BOOL)isCustomEmojiMsg; +- (BOOL)isImgMsg; +- (BOOL)isVideoMsg; +- (BOOL)isVoiceMsg; +- (BOOL)canForward; +- (BOOL)IsPlayingSound; +- (id)summaryString:(BOOL)arg1; +- (BOOL)isEmojiAppMsg; +- (BOOL)isAppBrandMsg; +- (BOOL)IsUnPlayed; +- (void)SetPlayed; + @property(retain, nonatomic) NSString *m_nsTitle; +- (id)originalImageFilePath; + @property(retain, nonatomic) NSString *m_nsVideoPath; + @property(retain, nonatomic) NSString *m_nsFilePath; + @property(retain, nonatomic) NSString *m_nsAppMediaUrl; + @property(nonatomic) MessageData *m_refMessageData; + @property(nonatomic) unsigned int m_uiDownloadStatus; +- (void)SetPlayingSoundStatus:(BOOL)arg1; + @end +@interface MessageService : NSObject +- (void)onRevokeMsg:(id)arg1; +- (void)FFToNameFavChatZZ:(id)arg1; +- (void)OnSyncBatchAddMsgs:(NSArray *)arg1 isFirstSync:(BOOL)arg2; +- (void)FFImgToOnFavInfoInfoVCZZ:(id)arg1 isFirstSync:(BOOL)arg2; +- (id)SendTextMessage:(id)arg1 toUsrName:(id)arg2 msgText:(id)arg3 atUserList:(id)arg4; +- (id)GetMsgData:(id)arg1 svrId:(long)arg2; +- (void)AddLocalMsg:(id)arg1 msgData:(id)arg2; +- (void)TranscribeVoiceMessage:(id)arg1 completion:(void (^)(void))arg2; +- (BOOL)ClearUnRead:(id)arg1 FromID:(unsigned int)arg2 ToID:(unsigned int)arg3; +- (BOOL)ClearUnRead:(id)arg1 FromCreateTime:(unsigned int)arg2 ToCreateTime:(unsigned int)arg3; +- (BOOL)hasMsgInChat:(id)arg1; +- (id)GetMsgListWithChatName:(id)arg1 fromLocalId:(unsigned int)arg2 limitCnt:(NSInteger)arg3 hasMore:(char *)arg4 sortAscend:(BOOL)arg5; +- (id)GetMsgListWithChatName:(id)arg1 fromCreateTime:(unsigned int)arg2 limitCnt:(NSInteger)arg3 hasMore:(char *)arg4 sortAscend:(BOOL)arg5; + @end + +@interface MMServiceCenter : NSObject ++ (id)defaultCenter; +- (id)getService:(Class)arg1; + @end +@interface XMLDictionaryParser : NSObject ++ (id)sharedInstance; +- (id)dictionaryWithString:(id)arg1; + @end + diff --git a/WeChatIntercept.framework/Versions/A/Modules/module.modulemap b/WeChatIntercept.framework/Versions/A/Modules/module.modulemap new file mode 100644 index 0000000..c582c46 --- /dev/null +++ b/WeChatIntercept.framework/Versions/A/Modules/module.modulemap @@ -0,0 +1,6 @@ +framework module WeChatIntercept { + umbrella header "WeChatIntercept.h" + + export * + module * { export * } +} diff --git a/WeChatIntercept.framework/Versions/A/Resources/Info.plist b/WeChatIntercept.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..60f4b76 --- /dev/null +++ b/WeChatIntercept.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,44 @@ + + + + + BuildMachineOSBuild + 18F132 + CFBundleDevelopmentRegion + en + CFBundleExecutable + WeChatIntercept + CFBundleIdentifier + offcn.WeChatIntercept + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + WeChatIntercept + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSupportedPlatforms + + MacOSX + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 10E1001 + DTPlatformVersion + GM + DTSDKBuild + 18E219 + DTSDKName + macosx10.14 + DTXcode + 1021 + DTXcodeBuild + 10E1001 + NSHumanReadableCopyright + Copyright © 2019 张洋. All rights reserved. + + diff --git a/WeChatIntercept.framework/Versions/A/WeChatIntercept b/WeChatIntercept.framework/Versions/A/WeChatIntercept new file mode 100755 index 0000000000000000000000000000000000000000..bcf471fb0cedf0ce61d66a9aeb03890c474eee7a GIT binary patch literal 15500 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 literal 0 HcmV?d00001 diff --git a/WeChatIntercept.framework/Versions/Current b/WeChatIntercept.framework/Versions/Current new file mode 120000 index 0000000..8c7e5a6 --- /dev/null +++ b/WeChatIntercept.framework/Versions/Current @@ -0,0 +1 @@ +A \ No newline at end of file diff --git a/WeChatIntercept.framework/WeChatIntercept b/WeChatIntercept.framework/WeChatIntercept new file mode 120000 index 0000000..ff959d2 --- /dev/null +++ b/WeChatIntercept.framework/WeChatIntercept @@ -0,0 +1 @@ +Versions/Current/WeChatIntercept \ No newline at end of file diff --git a/insert_dylib b/insert_dylib new file mode 100755 index 0000000000000000000000000000000000000000..e9fa7fe138843da5bd044802bfe53d761f5068ec GIT binary patch literal 24696 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 Wsj4Vix_M?GrZU#vGaJyGeEvVx9wfs6 literal 0 HcmV?d00001