以下是IDA F5的一个构造函数
__int64 __fastcall sagem_bio::cmn::Block::Block(sagem_bio::cmn::Block *this, int a2)
{
sagem_bio::cmn::Block *v2; // rbx@1
sagem_bio::cmn::CallbackManager *v3; // rdi@1
_BYTE *v4; // rax@1
__int64 result; // rax@2
sagem_bio::cmn::CallbackManager *v6; // rax@3
sagem_bio::cmn::CallbackManager *v7; // rax@3
__int64 v8; // rax@3
__int64 v9; // rbp@3
v2 = this;
*((_QWORD *)this + 1) = 0LL; // char* cp1
*((_DWORD *)this + 4) = a2; // int型
*((_DWORD *)this + 5) = a2; // int型
*((_BYTE *)this + 24) = 1; // char/bool型 :isAttach
*(_QWORD *)this = (char *)&`vtable for'sagem_bio::cmn::Block + 16;
v3 = (sagem_bio::cmn::CallbackManager *)(unsigned int)(a2 + 8);
v4 = (_BYTE *)operator new[]((unsigned __int64)v3);
*((_QWORD *)v2 + 1) = v4; // cp1
if ( !v4 )
{
v6 = (sagem_bio::cmn::CallbackManager *)sagem_bio::cmn::CallbackManager::GetInstance(v3);// CallbackManager::m__Instance
v7 = sagem_bio::cmn::CallbackManager::GetContext(v6); sagem_bio::cmn::SGM_Report(
(__int64)v7,
0,
0x2Du,
"../../../ESCROW_FE/LIGHTV10/linux-64bits-gcc4-pic-multiprot/srcCMN/StandardLibrary/src/CMN_Block.cpp",
"Memory allocation failed.");
LODWORD(v8) = __cxa_allocate_exception(80LL);
v9 = v8;
sagem_bio::cmn::BasicException::BasicException(
v8,
"../../../ESCROW_FE/LIGHTV10/linux-64bits-gcc4-pic-multiprot/srcCMN/StandardLibrary/src/CMN_Block.cpp",
45LL,
2LL,
0LL);
__cxa_throw(v9, &`typeinfo for'sagem_bio::cmn::BasicException, sagem_bio::cmn::BasicException::~BasicException);
}
*((_BYTE *)v2 + 24) = 1;
*v4 = -103;
*(_BYTE *)(*((_QWORD *)v2 + 1) + 1LL) = -85;
*(_BYTE *)(*((_QWORD *)v2 + 1) + 2LL) = -51;
*(_BYTE *)(*((_QWORD *)v2 + 1) + 3LL) = -103;
*(_BYTE *)(*((_QWORD *)v2 + 1) + (unsigned int)(*((_DWORD *)v2 + 4) + 4)) = -103;
*(_BYTE *)(*((_QWORD *)v2 + 1) + (unsigned int)(*((_DWORD *)v2 + 4) + 5)) = -85;
*(_BYTE *)(*((_QWORD *)v2 + 1) + (unsigned int)(*((_DWORD *)v2 + 4) + 6)) = -51;
result = *((_QWORD *)v2 + 1);
*(_BYTE *)(result + (unsigned int)(*((_DWORD *)v2 + 4) + 7)) = -103;
return result;
}
问题1:红色字体的语句没有看懂,是说的虚函数表中的偏移吗?
问题2: v3 = (sagem_bio::cmn::CallbackManager *)(unsigned int)(a2 + 8);
把整型数转化成一个类的指针,是什么意思。如果上面语句中的类是这个构造函数类的基类,这个语句又怎么理解呢?
问题3:上面蓝色字体函数代码:
_QWORD *__fastcall sagem_bio::cmn::CallbackManager::GetInstance(sagem_bio::cmn::CallbackManager *this)
{
return &sagem_bio::cmn::CallbackManager::m__Instance;
}
接受的函数是是它类本身的指针,返回的是类中的一个变量,从函数名猜测可能是返回类的一个实例,那么在CallbackManager这个类中会返回什么实例呢,它本身的?还是它子类的?
新手,求耐心指导。
[峰会]看雪.第八届安全开发者峰会10月23日上海龙之梦大酒店举办!