前言
之前尝试 NTQQ 使用 NodeJs 运行,想起wechat-web-devtools-linux有个skyline模块;
这个模块是运行在nwjs环境的,试试看能不能换成nodejs。
[Windows] 分析使用nodejs启动NTQQ
文章目录[隐藏] 前言 分析 伪造QQNT.dll 总结 前言 上篇实现了Linux平台使用nodejs启动的 […]
实践
把node.dll和nw.dll都做了转发,但是启动会崩溃。
崩溃代码:
__int64 __fastcall sub_7FFC1E826EE2(__int64 *a1) { __int64 v2; // rdi __int64 v3; // rax __int64 v4; // rax _QWORD *v5; // rcx _QWORD *v7; // [rsp+28h] [rbp-40h] BYREF char v8[24]; // [rsp+30h] [rbp-38h] BYREF v2 = *(_QWORD *)(*a1 + 8); v8::HandleScope::HandleScope(v8, v2); v3 = *(_QWORD *)(*a1 + 40); // Value::QuickIsNullOrUndefined 根据AI判断,是指针压缩处理 if ( (*(_DWORD *)(*a1 + 40) & 3) != 1 // if (!I::HasHeapObjectTag(obj)) return false; || *(_WORD *)(*(unsigned int *)(v3 - 1) + (v3 & 0xFFFFFFFF00000000ui64) + 7) != 67 || (*(_DWORD *)(v3 + 23) & 0xFFFFFFFE) != 10 ) { sub_7FFC1E826F8E(&v7, v2, a1); v4 = *a1; v5 = v7; if ( !v7 ) v5 = (_QWORD *)(v4 + 16); *(_QWORD *)(v4 + 24) = *v5; } return v8::HandleScope::~HandleScope(v8); }
其中 (_WORD *)(*(unsigned int *)(v3 - 1) + (v3 & 0xFFFFFFFF00000000ui64) + 7)
计算得到的地址实际上指向无效内存区域。
第一部分判断:
// (*(_DWORD *)(*a1 + 40) & 3) != 1 V8_INLINE static bool HasHeapObjectTag(const internal::Address value) { return (value & kHeapObjectTagMask/*3*/) == static_cast<Address>(kHeapObjectTag/*1*/); }
第二部分判断:
// *(_WORD *)(*(unsigned int *)(v3 - 1) + (v3 & 0xFFFFFFFF00000000ui64) + 7) != 67 if (I::GetInstanceType(obj) != I::kOddballType/*67*/) return false; // (_WORD *)(*(unsigned int *)(v3 - 1) + (v3 & 0xFFFFFFFF00000000ui64) + 7) // *(unsigned int *)(v3 - 1) + (v3 & 0xFFFFFFFF00000000ui64) ReadTaggedPointerField(obj, kHeapObjectMapOffset/*0*/) // xxx + 7 // 开压缩就是8,不开是12 return ReadRawField<uint16_t>(map, kMapInstanceTypeOffset/*8*/); // = map + 7
第三部分判断(感觉不太对):
// (*(_DWORD *)(v3 + 23) & 0xFFFFFFFE) != 10 I::GetOddballKind(obj) == kExternalOneByteRepresentationTag
分析得出,编译开了V8_COMPRESS_POINTERS
实际用nodejs官方版本开了之后还是会崩溃,怀疑是nwjs版本混入了其它东西,暂时没有头绪。。。。。
写了一个hello.node,看汇编代码似乎差不多(待仔细比较),能跑,更怪了。。。