Я использую IDA pro, hex-ray для декомпиляции некоторого кода DLL.
получить код, как показано ниже:
void __stdcall IsDotInLine(double a1, double a2, double a3, double a4, double a5, double a6, double a7)
{
int v7; // edx@1
int v8; // ecx@1
double v9; // st7@10
char v10; // [sp+14h] [bp-88h]@1
double v11; // [sp+54h] [bp-48h]@10
double v12; // [sp+5Ch] [bp-40h]@10
double v13; // [sp+64h] [bp-38h]@10
double v14; // [sp+6Ch] [bp-30h]@6
double v15; // [sp+74h] [bp-28h]@6
double v16; // [sp+7Ch] [bp-20h]@1
double v17; // [sp+84h] [bp-18h]@1
double v18; // [sp+8Ch] [bp-10h]@1
double v19; // [sp+94h] [bp-8h]@1
memset(&v10, -858993460, 0x88u);
sub_100014D3((int)&v15);
v16 = a3;
v18 = a5;
v19 = a4;
v17 = a6;
sub_10001550(&v16);
v16 = v16 - a7;
v18 = v18 + a7;
v17 = v17 - a7;
v19 = v19 + a7;
if ( a1 >= v16 )
{
if ( a1 <= v18 )
{
if ( a2 >= v17 )
{
if ( a2 <= v19 )
{
v15 = a6 - a4;
v14 = a3 - a5;
if ( v15 > 0.000000001 || v15 < -0.000000001 || v14 > 0.000000001 || v14 < -0.000000001 )
{
v13 = -v15 * a3 - v14 * a4;
v11 = fabs(v15 * a1 + v14 * a2 + v13);
v9 = sqrt(v15 * v15 + v14 * v14);
v12 = v11 / v9;
}
}
}
}
}
chkesp(v8, v7);
}
После моего анализа, кроме некоторого функционального кода.
Я думаю, что код, подобный этому типу, бесполезен, по крайней мере, в этой функции я не могу понять, как использовать функцию «sub_100021C0».
Может кто-нибудь получить представление об этом коде, каков эффект «sub_100021C0»?
спасибо, прикрепил код
int __thiscall sub_100014D3(int this)
{
return sub_100021C0(this);
}
int __thiscall sub_100021C0(int this)
{
int v1; // ecx@1
int v2; // edx@1
int v3; // eax@1
int v5; // [sp+4Ch] [bp-4h]@1
v5 = this;
*(_DWORD *)this = 0;
*(_DWORD *)(this + 4) = 0;
v1 = v5;
*(_DWORD *)(v5 + 8) = 0;
*(_DWORD *)(v1 + 12) = 0;
v2 = v5;
*(_DWORD *)(v5 + 16) = 0;
*(_DWORD *)(v2 + 20) = 0;
v3 = v5;
*(_DWORD *)(v5 + 24) = 0;
*(_DWORD *)(v3 + 28) = 0;
return v5;
}
Это, вероятно, конструктор / инициализатор любого класса. Обратите внимание на this
указатель передается в качестве первого аргумента, и v1
через v5
просто псевдонимы для этого. Таким образом, он устанавливает (предположительно) каждый член структуры или класса по адресу this
до 0.
memset
строка над вызовом этой функции устанавливает все локальные переменные (включая членов класса) в 0xcccccccc
, который является дозорным значением, используемым некоторыми компиляторами для обозначения «неинициализированный», если вы компилируете в режиме отладки. Таким образом, вызываемая функция необходима для инициализации значений.
Я предполагаю, что есть структура, которая выглядит примерно так struct Line { double x1, y1, x2, y2; };
с конструктором, который инициализирует их в 0.
Других решений пока нет …