след. код на самом деле код выполняет jmp eax; вопрос: на всех процах будет работать ? (проверял на p4); _asm { // mov eax,ENTRY_POINT; jmp short next; test [edx],eax; add [eax],al; add [eax+0xFFE0FFFF],cl; push_ip: sub dword ptr[esp],0x15; ret; next: call push_ip; };
А что дизассемблер показывает на месте jmp short next? Вообще если это msvc то вполне возможно - он встроенный ассемблер может и переврать.
IDA почти так и показывает: sub_10005893 proc near .text:10005893 jmp short loc_100058A4 .text:10005895 test [edx], eax .text:10005897 db 0 ; add [eax],al ???? .text:10005898 db 0 .text:10005899 add [eax-1F0001h], cl .text:1000589F loc_1000589F: .text:1000589F sub dword ptr [esp+0], 15h .text:100058A3 retn .text:100058A4 loc_100058A4: .text:100058A4 call loc_1000589F .text:100058A4 sub_10005893 endp кривой переход происходит по инструкции ret (можно посмотреть в softice) работает вполне исправно только непонятно что будет на другом процессоре (amd например)
уточнение: по инстр. retn происходит переход в середину инструкции jmp short next (EB 0F) 0F + код след. инструкции test [edx],eax = jnz near $+2; (дальше аналогично) А код затем чтобы IDA не увидела jmp eax; (примерно так...)