0

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;
}
4

1 に答える 1

1

それはおそらく、それが何であれ、クラスのコンストラクター/イニシャライザーです。thisポインターが最初の引数として渡されていることに注意してください。v1スルーv5は単なるエイリアスです。そのため、(おそらく) アドレスの構造体またはクラスのすべてのメンバーthisを 0 に設定しています。

そのmemset関数の呼び出しの上の行は、すべてのローカル変数 (クラスのメンバーを含む) を に設定しています0xcccccccc。これは、デバッグ モードでコンパイルする場合に「初期化されていない」ことを意味するために一部のコンパイラで使用されるセンチネル値です。したがって、値を初期化するには、呼び出された関数が必要です。

struct Line { double x1, y1, x2, y2; };私の推測では、コンストラクターを 0 に初期化するような構造体があると思います。

于 2013-05-30T07:50:30.640 に答える