重写IDA反编译功能

时间:2014-11-24 15:28:13

标签: c disassembly

我正在寻求帮助,将这个IDA反编译函数重写为C代码。

int random_generated_number;
sub_8049A96(&random_generated_number, 11); //Passes address of random_generated_number and int 11

int __cdecl sub_8049A96(int a1, int a2)
{
  int result;
  int i;

  for ( i = 0; i < a2; ++i ) // loop 11 times
    *(i + a1) = byte_8049C4E[rand() % 10u]; // Cast byte pointer (i + a1) = select rand number between 0 to 9. I don't really understand what *(i + a1) is doing. could you explain?
  result = a2 + a1; Set result = 11? is this correct?
  *(a2 + a1) = 0; // What is this doing?
  return result; Returns 11?
}

到目前为止,我已经提出了这个问题,

int test(int a1, int a2)
{
    int result;
    int i;

    char byte_8049C4E[48];

    for (i = 0; i < a2; ++i)
        *(i + a1) = byte_8049C4E[rand() % 10u];
    result = a2 + a1;
    *(a2 + a1) = 0;
    return result;
}

但是在编译时我得到了非法的间接。有人可以帮忙吗?此外,如果有人能够详细解释功能正在做什么,将不胜感激?我已经列出了我的意见,想知道他们是否正确。

1 个答案:

答案 0 :(得分:1)

我怀疑该函数会生成一串随机数字,并等同于:

/* write a string of len digits to s, and return a pointer to
   the end of the string (for further appending) */
char *test(char *s, int len)
{
    char *digits = "0123456789";

    for (i = 0; i < len; i++)
        s[i] = digits[rand() % 10];
    s[i] = '\0';
    return &s[i];
}

..虽然digits可能包含其他内容,但取决于byte_08049C4E[]中存储的内容。如果它确实在第一个参数中传递了一个随机地址,它可能会使程序崩溃,当然也不会做任何有用的事情。