Error: memory read failed for 0x0

对某APP砸壳后直接重签名,运行就报如下错误,目前毫无头绪,大佬们给点意见

5501DD51-8B66-450B-B250-344A4DA0FF9A

需求: 重签名后可以正常运行
日志: 看不见任何堆栈
代码: 没写任何代码
操作步骤: 砸壳,拖入MonkeyDev,运行
任何其他描述: 运行后就直接出现如上图报错
环境: MonkeyDev

longjmp

感谢,我去试试,完了在来回复:grinning:

static void (*orig_exit)(int);
void fake_exit(int status) {
NSLog(@“fake exit”);
NSLog(@"%@",[NSThread callStackSymbols]); // 这句可以得到和 crash log 一样的调用栈展示

}

static void (*orig_longjmp)(int);
void fake_longjmp(int status) {
NSLog(@“fake orig_longjmp”);
NSLog(@"%@",[NSThread callStackSymbols]); // 这句可以得到和 crash log 一样的调用栈展示

}

static void (*orig_atexit)(int);
void fake_atexit(int status) {
NSLog(@“fake atexit”);
NSLog(@"%@",[NSThread callStackSymbols]); // 这句可以得到和 crash log 一样的调用栈展示
}

attribute((constructor)) static void entry(){

rebind_symbols((struct rebinding[1]){{"exit", fake_exit, (void*)&orig_exit}},1);

//
rebind_symbols((struct rebinding[1]){{“atexit”, fake_atexit, (void*)&orig_atexit}},1);
//
rebind_symbols((struct rebinding[1]){{“longjmp”, fake_longjmp, (void*)&orig_longjmp}},1);
}

大佬,用上面你给的代码试了试,还是没有打印出堆栈,我感觉对方应该不是用的exit,而是直接写了个C数组的溢出(猜测)导致的crash

现在还是不清楚怎么找到这个crash点

问题已解决 :grinning:

你好,我也遇到同样的问题了,请问你是怎么解决的?

PS:昨天正好在看你的掘金文章 :smiley:

请教下如何解决的呢?

实不相瞒,时间过得有点就,忘记了。。。
不过大概就是哪些常用的防护,找到对应的crash点就可以了。