首先,直接运行Reveal发现它弹出了这个弹框。
看到这个页面,这是一个app启动时的页面,一般是写到类下的applicationWillFinishLaunching方法里边。
我们打开Hopper Disassembler然后把Reveal拖入,等待它分析完后。
发现调用了ptrace函数,那我们就先对ptrace函数做下处理。
处理的时候,可以参考https://www.chenghu.me/?p=1350这篇文章,把ptrace函数的传参1F修改为0A。
改完之后,我们就可以使用Hopper Disassembler的动态调试功能,或者Interface Inspector的界面调试。
首先,去找我们之前猜测的applicationWillFinishLaunching方法。
发现调用了 sub_10000e010(self) 这个子程序。
跟过去发现有两处调用了sub_10000e010这个子程序
猜测这就是弹框的地方,直接在sub_10000e010这个子程序的头部retn,然后跑起来。
发现之前的弹窗果然没有了。
但是有了新的问题,点菜单栏和退出的时候会闪退(异常退出)。
通过动态调试发现,它会执行ud2这个命令。
百度一下这个指令:
UD2是一种让CPU产生invalid opcode exception的软件指令. 内核发现CPU出现这个异常, 会立即停止运行.
void sub_100192ff0(int arg0) {
var_C0 = r13;
var_50 = arg0;
*0x1004d5798 = *0x1004d5798 + 0x1;
*0x1004d57b0 = *0x1004d57b0 + 0x1;
if (*0x1004bab68 != 0xffffffffffffffff) {
swift_once(0x1004bab68, sub_100208920);
}
*0x1004d57b8 = *0x1004d57b8 + 0x1;
r14 = sub_100023780();
sub_100008a80();
r15 = sub_100208980(r14, sub_100208920);
if (r15 != 0x0) {
rbx = sub_100010860();
sub_100008a70();
if (rbx != 0x0) {
*0x1004d57c0 = *0x1004d57c0 + 0x1;
*0x1004d57c8 = *0x1004d57c8 + 0x1;
r14 = var_50;
[r14 retain];
if (*(int8_t *)(rbx + 0x30) == 0x0) {
*0x1004d57d0 = *0x1004d57d0 + 0x1;
swift_unknownRetain(r15);
rbx = sub_1000251e0();
swift_unknownRelease(r15);
if ((rbx & 0x1) != 0x0) {
swift_unknownRelease(r15);
[r14 release];
*0x1004d57a0 = *0x1004d57a0 + 0x1;
rbx = 0x0;
}
else {
*0x1004d57d8 = *0x1004d57d8 + 0x1;
swift_unknownRetain(r15);
*0x1004d57e0 = *0x1004d57e0 + 0x1;
*0x1004d57e8 = *0x1004d57e8 + 0x1;
rbx = [sub_1002df34d() retain];
rdx = *0x1004bef18;
if (rdx == 0x0) {
rdx = sub_100008a10();
*0x1004bef18 = rdx;
}
r12 = static (rbx, type metadata for Swift.String);
sub_1001656b0(r12, type metadata for Swift.String, rdx);
xmm0 = intrinsic_movaps(xmm0, var_200);
var_210 = intrinsic_movaps(var_210, xmm0);
var_68 = var_1F0;
rbx = var_1E8;
xmm0 = intrinsic_movaps(xmm0, var_1E0);
var_220 = intrinsic_movaps(var_220, xmm0);
var_78 = var_1D0;
r13 = var_1C8;
xmm0 = intrinsic_movaps(xmm0, var_1C0);
var_230 = intrinsic_movaps(var_230, xmm0);
var_80 = var_1B0;
r14 = var_1A8;
var_90 = var_1A0;
var_29 = var_198;
xmm0 = intrinsic_movaps(xmm0, var_190);
var_240 = intrinsic_movaps(var_240, xmm0);
var_98 = var_180;
var_2A = var_178;
xmm0 = intrinsic_movaps(xmm0, var_170);
var_250 = intrinsic_movaps(var_250, xmm0);
var_A0 = var_160;
var_2B = var_158;
var_2C = var_148;
var_2D = var_138;
xmm0 = intrinsic_movaps(xmm0, var_130);
var_260 = intrinsic_movaps(var_260, xmm0);
var_2E = var_118;
xmm0 = intrinsic_movaps(xmm0, var_110);
var_270 = intrinsic_movaps(var_270, xmm0);
var_2F = var_F8;
var_30 = var_F7;
var_31 = var_F6;
var_32 = var_E8;
var_40 = var_D8;
var_48 = var_C8;
var_58 = var_150;
var_60 = var_140;
var_70 = var_120;
var_88 = var_100;
var_A8 = var_F0;
var_B0 = var_E0;
var_B8 = var_D0;
if (r12 >= 0x0) {
sub_100008a70();
}
else {
swift_unknownRelease(r12 & 0x7fffffffffffffff);
}
xmm0 = intrinsic_movaps(xmm0, var_210);
var_3B0 = intrinsic_movaps(var_3B0, xmm0);
intrinsic_movaps(var_390, intrinsic_movaps(xmm0, var_220));
intrinsic_movaps(var_370, intrinsic_movaps(xmm0, var_230));
intrinsic_movaps(var_340, intrinsic_movaps(xmm0, var_240));
intrinsic_movaps(var_320, intrinsic_movaps(xmm0, var_250));
intrinsic_movaps(var_2E0, intrinsic_movaps(xmm0, var_260));
intrinsic_movaps(var_2C0, intrinsic_movaps(xmm0, var_270));
sub_1000d2370(&var_3B0);
xmm0 = intrinsic_movaps(xmm0, var_200);
xmm1 = intrinsic_movaps(xmm1, var_1F0);
intrinsic_movaps(xmm2, var_1E0);
intrinsic_movaps(xmm3, var_1D0);
intrinsic_movaps(xmm4, var_1C0);
intrinsic_movaps(xmm5, var_1B0);
intrinsic_movaps(xmm6, var_1A0);
intrinsic_movaps(xmm7, var_190);
intrinsic_movaps(xmm8, var_180);
intrinsic_movaps(xmm9, var_170);
var_460 = intrinsic_movaps(var_460, xmm0);
intrinsic_movaps(var_450, xmm1);
intrinsic_movaps(var_440, xmm2);
intrinsic_movaps(var_430, xmm3);
intrinsic_movaps(var_420, xmm4);
intrinsic_movaps(var_410, xmm5);
intrinsic_movaps(var_400, xmm6);
intrinsic_movaps(var_3F0, xmm7);
intrinsic_movaps(var_3E0, xmm8);
intrinsic_movaps(var_3D0, xmm9);
sub_100052670(&var_460);
rax = sub_1000165c0(&var_200, var_1E8);
rcx = *(*(var_1E8 + 0xfffffffffffffff8) + 0x88) + 0xf;
(*(*(var_1E8 + 0xfffffffffffffff8) + 0x30))(rsp - (rcx & 0xfffffffffffffff0), rax, var_1E8, rcx & 0xfffffffffffffff0);
r13 = (*var_1E0)(var_1E8, var_1E0);
(*(*(var_1E8 + 0xfffffffffffffff8) + 0x20))(rsp - (rcx & 0xfffffffffffffff0), var_1E8);
sub_1000108a0(&var_200);
rbx = var_50;
[rbx release];
swift_unknownRelease_n(r15, 0x2);
if ((r13 & 0x1) == 0x0) {
rax = [rbx action];
rbx = 0x1;
if ((rax != 0x0) && ((ObjectiveC.== infix(rax, @selector(openNewDocumentWindowAndInspectDemoApp:)) & 0x1) != 0x0)) {
*0x1004d57a8 = *0x1004d57a8 + 0x1;
r14 = sub_10000de70();
if (r14 != 0x0) {
rbx = ObjectiveC._convertObjCBoolToBool([r14 sampleApplicationIsLaunching] & 0xff);
[r14 release];
rbx = rbx ^ 0x1;
}
else {
rbx = 0x0;
}
}
}
else {
*0x1004d57a0 = *0x1004d57a0 + 0x1;
rbx = 0x0;
}
}
}
else {
swift_unknownRelease(r15);
[r14 release];
*0x1004d57a0 = *0x1004d57a0 + 0x1;
rbx = 0x0;
}
}
else {
swift_unknownRelease(r15);
asm { ud2 };
loc_1001936d4();
}
}
else {
sub_100008a70();
asm { ud2 };
loc_1001936ca(rdi);
}
return;
}
看到了unknownRelease这种关键字,估摸着这软件可能校验什么自己不正常后自己调用ud2指令直接异常。
发现调用这些校验的也是菜单的东西,于是我直接把这个校验子程序的首部retn掉。
发现还有一堆这样的校验子程序,基本上每个菜单下边都有这种检测的调用。全部retn掉,不让它执行异常,然后就可以正常的打开和使用了。