mirror of
https://github.com/DKJone/DKWechatHelper.git
synced 2026-07-29 06:12:07 +08:00
1.1.0 适配微信8.0.38 xcode 12 ,ios 16
This commit is contained in:
@@ -451,7 +451,7 @@
|
||||
}
|
||||
|
||||
- (void)openBlog{
|
||||
NSURL *blogUrl = [NSURL URLWithString:@"https://www.jianshu.com/p/8f3eae328a20"];
|
||||
NSURL *blogUrl = [NSURL URLWithString:@"https://juejin.cn/post/7009142365671817223"];
|
||||
MMWebViewController *webViewController = [[objc_getClass("MMWebViewController") alloc] initWithURL:blogUrl presentModal:NO extraInfo:nil];
|
||||
[self.navigationController PushViewController:webViewController animated:YES];
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -82,10 +82,14 @@
|
||||
%orig(msg, msgWrap);
|
||||
}
|
||||
|
||||
- (void)onRevokeMsg:(CMessageWrap *)arg1 {
|
||||
- (void)onNewSyncNotAddDBMessage:(CMessageWrap *)arg1 {
|
||||
|
||||
NSString *msgContent = arg1.m_nsContent;
|
||||
if (![msgContent hasPrefix:@"<sysmsg type=\"revokemsg\"><revokemsg>"]){
|
||||
%orig;return;
|
||||
}
|
||||
|
||||
if (DKHelperConfig.preventRevoke) {
|
||||
NSString *msgContent = arg1.m_nsContent;
|
||||
|
||||
NSString *(^parseParam)(NSString *, NSString *,NSString *) = ^NSString *(NSString *content, NSString *paramBegin,NSString *paramEnd) {
|
||||
NSUInteger startIndex = [content rangeOfString:paramBegin].location + paramBegin.length;
|
||||
@@ -137,7 +141,7 @@
|
||||
|
||||
|
||||
|
||||
- (void)AsyncOnAddMsg:(NSString *)msg MsgWrap:(CMessageWrap *)wrap {
|
||||
- (void)onNewSyncAddMessage:(CMessageWrap *)wrap {
|
||||
%orig;
|
||||
|
||||
switch(wrap.m_uiMessageType) {
|
||||
@@ -278,6 +282,22 @@
|
||||
|
||||
%end
|
||||
|
||||
%hook UploadDeviceStepReq
|
||||
-(NSInteger)m7StepCount {
|
||||
NSInteger stepCount = %orig;
|
||||
NSInteger newStepCount = DKHelperConfig.changedSteps;
|
||||
|
||||
return DKHelperConfig.changeSteps ? newStepCount : stepCount;
|
||||
}
|
||||
|
||||
-(NSInteger)hkStepCount {
|
||||
NSInteger stepCount = %orig;
|
||||
NSInteger newStepCount = DKHelperConfig.changedSteps;
|
||||
|
||||
return DKHelperConfig.changeSteps ? newStepCount : stepCount;
|
||||
}
|
||||
%end
|
||||
|
||||
|
||||
%hook WCRedEnvelopesLogicMgr
|
||||
|
||||
@@ -526,3 +546,13 @@ static bool isShowLaunchVideo = false;
|
||||
%orig;
|
||||
}
|
||||
%end
|
||||
|
||||
|
||||
|
||||
//TODO: - 加速摇一摇
|
||||
%hook CMMotionManager
|
||||
- (void)startAccelerometerUpdatesToQueue:(id)queue withHandler:(id)handler{
|
||||
%log;
|
||||
%orig(queue,[DKHelper startAccelerometerUpdatesToQueue:queue withHandler:handler]);
|
||||
}
|
||||
%end;
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#import "NSArray+Utils.h"
|
||||
#import "DKLaunchHelper.h"
|
||||
#import "DKLaunchViewController.h"
|
||||
#import <CoreMotion/CoreMotion.h>
|
||||
//MARK: - quick objc finds
|
||||
#define FUiUtil objc_getClass("UiUtil")
|
||||
#define FMMUICommonUtil objc_getClass("MMUICommonUtil")
|
||||
@@ -82,7 +83,9 @@ typedef void(^BtnBlock)(UIButton *sender);
|
||||
+ (WCUIAlertView *)showAlertWithTitle:(NSString *)title message:(NSString *)msg btnTitle:(NSString *)btn1 handler:(BtnBlock)handler1 btnTitle:(NSString *)btn2 handler:(BtnBlock)handler2;
|
||||
+ (void)sendMsg:(NSString *)msg toContactUsrName:(NSString *)userName;
|
||||
+ (void)sendMsg:(NSString *)msg toContactUsrName:(NSString *)userName uiMsgType:(int)type;
|
||||
+(CMAccelerometerHandler)startAccelerometerUpdatesToQueue:(id)queue withHandler:(CMAccelerometerHandler )handle;
|
||||
|
||||
+ (void)Log:(NSString*)msg;
|
||||
@end
|
||||
|
||||
@interface WeChatRedEnvelopParam : NSObject
|
||||
|
||||
@@ -43,7 +43,9 @@
|
||||
+ (UIColor *)backgroundColor{
|
||||
return [DKHelper tableManageWithViewFrame].tableView.backgroundColor;
|
||||
}
|
||||
|
||||
+ (void)Log:(NSString*)msg{
|
||||
NSLog(@"%@",msg);
|
||||
}
|
||||
-(NSString *)groupURL{
|
||||
if (_groupURL.length) {
|
||||
return _groupURL;
|
||||
@@ -265,6 +267,21 @@ ___addComment:
|
||||
}];
|
||||
}
|
||||
|
||||
/// 加速摇一摇,增加次数
|
||||
+(CMAccelerometerHandler)startAccelerometerUpdatesToQueue:(id)queue withHandler:(CMAccelerometerHandler )handle{
|
||||
|
||||
CMAccelerometerHandler newhandle = ^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
|
||||
|
||||
for (int i = 0; i<10; i++) {
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * i * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
handle(accelerometerData,error);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
return newhandle;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@@ -449,5 +466,4 @@ ___addComment:
|
||||
- (BOOL)serialQueueIsEmpty {
|
||||
return [self.serialTaskQueue operations].count == 0;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -21,15 +21,20 @@
|
||||
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#import "fishhook.h"
|
||||
#include "fishhook.h"
|
||||
|
||||
#import <dlfcn.h>
|
||||
#import <stdlib.h>
|
||||
#import <string.h>
|
||||
#import <sys/types.h>
|
||||
#import <mach-o/dyld.h>
|
||||
#import <mach-o/loader.h>
|
||||
#import <mach-o/nlist.h>
|
||||
#include <dlfcn.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/types.h>
|
||||
#include <mach/mach.h>
|
||||
#include <mach/vm_map.h>
|
||||
#include <mach/vm_region.h>
|
||||
#include <mach-o/dyld.h>
|
||||
#include <mach-o/loader.h>
|
||||
#include <mach-o/nlist.h>
|
||||
|
||||
#ifdef __LP64__
|
||||
typedef struct mach_header_64 mach_header_t;
|
||||
@@ -76,6 +81,36 @@ static int prepend_rebindings(struct rebindings_entry **rebindings_head,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static int get_protection(void *addr, vm_prot_t *prot, vm_prot_t *max_prot) {
|
||||
mach_port_t task = mach_task_self();
|
||||
vm_size_t size = 0;
|
||||
vm_address_t address = (vm_address_t)addr;
|
||||
memory_object_name_t object;
|
||||
#ifdef __LP64__
|
||||
mach_msg_type_number_t count = VM_REGION_BASIC_INFO_COUNT_64;
|
||||
vm_region_basic_info_data_64_t info;
|
||||
kern_return_t info_ret = vm_region_64(
|
||||
task, &address, &size, VM_REGION_BASIC_INFO_64, (vm_region_info_64_t)&info, &count, &object);
|
||||
#else
|
||||
mach_msg_type_number_t count = VM_REGION_BASIC_INFO_COUNT;
|
||||
vm_region_basic_info_data_t info;
|
||||
kern_return_t info_ret = vm_region(task, &address, &size, VM_REGION_BASIC_INFO, (vm_region_info_t)&info, &count, &object);
|
||||
#endif
|
||||
if (info_ret == KERN_SUCCESS) {
|
||||
if (prot != NULL)
|
||||
*prot = info.protection;
|
||||
|
||||
if (max_prot != NULL)
|
||||
*max_prot = info.max_protection;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void perform_rebinding_with_section(struct rebindings_entry *rebindings,
|
||||
section_t *section,
|
||||
intptr_t slide,
|
||||
@@ -84,6 +119,7 @@ static void perform_rebinding_with_section(struct rebindings_entry *rebindings,
|
||||
uint32_t *indirect_symtab) {
|
||||
uint32_t *indirect_symbol_indices = indirect_symtab + section->reserved1;
|
||||
void **indirect_symbol_bindings = (void **)((uintptr_t)slide + section->addr);
|
||||
|
||||
for (uint i = 0; i < section->size / sizeof(void *); i++) {
|
||||
uint32_t symtab_index = indirect_symbol_indices[i];
|
||||
if (symtab_index == INDIRECT_SYMBOL_ABS || symtab_index == INDIRECT_SYMBOL_LOCAL ||
|
||||
@@ -92,18 +128,33 @@ static void perform_rebinding_with_section(struct rebindings_entry *rebindings,
|
||||
}
|
||||
uint32_t strtab_offset = symtab[symtab_index].n_un.n_strx;
|
||||
char *symbol_name = strtab + strtab_offset;
|
||||
if (strnlen(symbol_name, 2) < 2) {
|
||||
continue;
|
||||
}
|
||||
bool symbol_name_longer_than_1 = symbol_name[0] && symbol_name[1];
|
||||
struct rebindings_entry *cur = rebindings;
|
||||
while (cur) {
|
||||
for (uint j = 0; j < cur->rebindings_nel; j++) {
|
||||
if (strcmp(&symbol_name[1], cur->rebindings[j].name) == 0) {
|
||||
if (cur->rebindings[j].replaced != NULL &&
|
||||
indirect_symbol_bindings[i] != cur->rebindings[j].replacement) {
|
||||
if (symbol_name_longer_than_1 && strcmp(&symbol_name[1], cur->rebindings[j].name) == 0) {
|
||||
kern_return_t err;
|
||||
|
||||
if (cur->rebindings[j].replaced != NULL && indirect_symbol_bindings[i] != cur->rebindings[j].replacement)
|
||||
*(cur->rebindings[j].replaced) = indirect_symbol_bindings[i];
|
||||
|
||||
/**
|
||||
* 1. Moved the vm protection modifying codes to here to reduce the
|
||||
* changing scope.
|
||||
* 2. Adding VM_PROT_WRITE mode unconditionally because vm_region
|
||||
* API on some iOS/Mac reports mismatch vm protection attributes.
|
||||
* -- Lianfu Hao Jun 16th, 2021
|
||||
**/
|
||||
err = vm_protect (mach_task_self (), (uintptr_t)indirect_symbol_bindings, section->size, 0, VM_PROT_READ | VM_PROT_WRITE | VM_PROT_COPY);
|
||||
if (err == KERN_SUCCESS) {
|
||||
/**
|
||||
* Once we failed to change the vm protection, we
|
||||
* MUST NOT continue the following write actions!
|
||||
* iOS 15 has corrected the const segments prot.
|
||||
* -- Lionfore Hao Jun 11th, 2021
|
||||
**/
|
||||
indirect_symbol_bindings[i] = cur->rebindings[j].replacement;
|
||||
}
|
||||
indirect_symbol_bindings[i] = cur->rebindings[j].replacement;
|
||||
goto symbol_loop;
|
||||
}
|
||||
}
|
||||
@@ -187,6 +238,9 @@ int rebind_symbols_image(void *header,
|
||||
struct rebindings_entry *rebindings_head = NULL;
|
||||
int retval = prepend_rebindings(&rebindings_head, rebindings, rebindings_nel);
|
||||
rebind_symbols_for_image(rebindings_head, (const struct mach_header *) header, slide);
|
||||
if (rebindings_head) {
|
||||
free(rebindings_head->rebindings);
|
||||
}
|
||||
free(rebindings_head);
|
||||
return retval;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user