我正在寻求帮助,将这个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;
}
但是在编译时我得到了非法的间接。有人可以帮忙吗?此外,如果有人能够详细解释功能正在做什么,将不胜感激?我已经列出了我的意见,想知道他们是否正确。
答案 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[]
中存储的内容。如果它确实在第一个参数中传递了一个随机地址,它可能会使程序崩溃,当然也不会做任何有用的事情。