这是什么样的排序算法?

时间:2014-04-25 03:29:47

标签: c algorithm sorting quicksort strcmp

我反编译了一个应用程序并发现了什么似乎是某种排序算法我只是不知道它是哪一个可以有人让我知道它的实际名称?

传递到strcmpi包装器的任何内容都是在某个区域中除以2知道一些疯狂的东西......我认为它是qsort(quicksort),因为它是C的标准库。但是我&# 39;我不确定。

int __cdecl SomeKindOfSortAlgorithm(int a1, int a2, int a3, signed int a4, int (__cdecl *a5)(unsigned int, unsigned int), int a6)
{
  int v6; // esi@1
  int result; // eax@1
  int v8; // ebp@2
  int v9; // edi@2

  v6 = 0;
  result = 0;
  *(unsigned int *)a6 = 0;
  if ( !a3 )
    return result;
  v8 = a2;
  v9 = a2 + a4 * (a3 - 1);
  if ( a2 > (unsigned int)v9 )
  {
LABEL_9:
    if ( result > 0 )
      v6 += a4;
    return v6;
  }
  while ( 1 )
  {
    v6 = v8 + a4 * (v9 - v8) / a4 / 2;
    result = a5(a1, v8 + a4 * (v9 - v8) / a4 / 2);
    if ( result < 0 )
    {
      if ( v6 == a2 )
        goto LABEL_9;
      v9 = v6 - a4;
      goto LABEL_8;
    }
    if ( result <= 0 )
      break;
    v8 = v6 + a4;
LABEL_8:
    if ( v8 > (unsigned int)v9 )
      goto LABEL_9;
  }
  *(unsigned int *)a6 = 1;
  if ( v6 == a2 )
  {
LABEL_15:
    result = a2;
  }
  else
  {
    while ( 1 )
    {
      v6 -= a4;
      if ( a5(a1, v6) )
        break;
      if ( v6 == a2 )
        goto LABEL_15;
    }
    result = v6 + a4;
  }
  return result;
}

这是比较功能

int __cdecl StrCmpiWrapper(const char *Str1, const char **a2)
{
  return _strcmpi(Str1, *a2);
}

以下是您使用它的方式。

  int ChatMsgBuffer;
  int v4; // eax@1
  int v5; // eax@5
  int v8; // [sp+10h] [bp-4h]@1

  v4 = SomeKindOfSortAlgorithm(
         ChatMsgBuffer,
         textFile->Pointer,
         textFile->TotalElements,
         4,
         (int (__cdecl *)(unsigned int, unsigned int))StrCmpiWrapper,
         (int)&v8);

  if ( !v8 && v4 )
  {
      //Allocate memory .. copy it and other stuff here.
  }

以下是bsearch C标准的反编译方式

int __cdecl bsearch(int a1, int a2, unsigned int a3, int a4, int (__cdecl *a5)(_DWORD, _DWORD))
{
  unsigned int v5; // ebx@1
  int v6; // eax@2

  v5 = a3;
  if ( !a3 )
    return 0;
  while ( 1 )
  {
    v6 = a5(a1, a2 + (v5 >> 1) * a4);
    if ( v6 < 0 )
    {
      v5 >>= 1;
      goto LABEL_6;
    }
    if ( !v6 )
      return a2 + (v5 >> 1) * a4;
    a2 += (v5 >> 1) * a4 + a4;
    v5 = v5 - (v5 >> 1) - 1;
LABEL_6:
    if ( !v5 )
      return 0;
  }
}

答案可以在https://reverseengineering.stackexchange.com/questions/4139/c-what-kind-of-sorting-algorithm-is-this/

找到

1 个答案:

答案 0 :(得分:3)

看起来像二进制搜索给我。请注意,没有任何项目的交换,因此它不太可能是一种排序。看起来它在字符串的排序数组中找到第一次出现的字符串a1,或者a1将被插入的位置。

请注意表达式:

v6 = v8 + a4 * (v9 - v8) / a4 / 2;

这是找到v8v9之间的中点。然后,您可以调用字符串比较,并根据比较结果是小于,等于还是更大来调用不同的行为。