Code: Select all
int test_vmp_stk(int arg)
{
int loc[2];
loc[arg - 0x0B] = 0x50;
return arg + loc[0];
}
int main()
{
int x = test_vmp_stk(0x0B);
printf("Test stk (ret = 0x%08x) \n", x);
return 0;
}
Так вот после виртуализации функции test_vmp_stk программа выдаёт некорректные значения (случайные).
Асм код функции такой:
Code: Select all
.text:00401000 ; int __cdecl test_vmp_stk(int arg)
.text:00401000 ?test_vmp_stk@@YAHH@Z proc near ; CODE XREF: _main+12p
.text:00401000
.text:00401000 var_34 = dword ptr -34h
.text:00401000 loc = dword ptr -8
.text:00401000 arg = dword ptr 4
.text:00401000
.text:00401000 8B 44 24 04 mov eax, [esp+arg]
.text:00401004 C7 44 84 CC 50 00 00 00 mov [esp+eax*4+var_34], 50h
.text:0040100C 8B 4C 24 F8 mov ecx, [esp+loc]
.text:00401010 83 EC 08 sub esp, 8
.text:00401013 03 C1 add eax, ecx
.text:00401015 83 C4 08 add esp, 8
.text:00401018 C3 retn
.text:00401018 ?test_vmp_stk@@YAHH@Z endp
Проверял на версиях: 1.7, 2.11, 3.0.0.290
Я конечно понимаю из-за чего такая бяка возникает, но пусть автор VMP сам расскажет.