我使用IDA pro,hex-rays来反编译一些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;
}
答案 0 :(得分:1)
这可能是任何类的构造函数/初始化程序。请注意,this
指针作为第一个参数传递,而v1
到v5
只是其中的别名。因此,它(可能)将地址this
的结构或类的每个成员设置为0.
对该函数的调用之上的memset
行将所有局部变量(包括类的成员)设置为0xcccccccc
,这是一些编译器用来表示“未初始化”的标记值“如果你在调试模式下编译。因此,调用函数是初始化值所必需的。
我的猜测是,有一个类似于struct Line { double x1, y1, x2, y2; };
的结构,其构造函数将它们初始化为0。