POP EDI ; value of edi is 0x7C816D4F kernel32.7C816D4F
PUSH EAX ;value of eax is 0
INC EBP ;value of ebp was 0x12FFF0
IN EAX,DX ;value of DX is 0xEB94
AAS
IN AL,0BF
DEC ESP
我认为这是一条特权指令(IN )是从用户模式调用的,因此不允许执行,因此执行失败。
IN用于反VM代码,但它需要特定的值(EAX中的VMXh端口值等),但在我的情况下未使用。 br />
我的问题是,它是否是某种反调试工具,或者文件已损坏,并且可以在非VM机器(在我的情况下为XP)上运行。
最后,如果加壳程序使用了我上面提到的方法,即从用户模式调用IN以防逆转示例如何在真实计算机上运行(因为在这种情况下,特权指令也将在用户模式下调用)。
#1 楼
由于提供的上下文不多,所以回答不容易,但是有几种可能性:解压缩存根在执行上述代码之前的某个时候检测到了VM,并且由于检测到VM,解压存根导致上面的垃圾代码被执行。
解压存根在执行上面的代码之前设置了一个异常处理程序,并且异常处理程序期望并捕获特权指令异常。
此代码永远不会执行,您正在查看错误的内存。
#2 楼
我想我从以下位置得到了答案:https://stackoverflow.com/questions/89607/what-is-a-privileged-instruction
该帖子中的答案摘要:
原因可能是堆栈损坏或函数指针调用混乱,这通常在使用指向无效数据的函数指针时发生。如果您的代码浪费了返回堆栈,或者您使用的是旧的编译器/库,也会发生这种情况。
为exe编程的人可能正在使用本地数组,并且该数组位于顶部附近。函数声明。他的边界检查可能已经疯了,并覆盖了返回地址,并且它指出了仅允许内核执行的某些指令。
评论
前三个字符拼写为“ _PE”。我怀疑它是已执行的代码。标准硬件未定义端口0xBF。
–彼得·弗里
2015年1月1日4:50在
感谢Jason的回答:1>此代码位于AEP上,并且没有TLS代码,因此我怀疑是否可以进行VM检测。 2>没有SEH例程会限制默认值,即SEH链中只有一个条目。3>必须运行此代码,因为这些是AEP上的说明。
– rebel87
2015年3月2日在4:59
感谢彼得的评论,请您详细说明一下您是如何得出这个结论的。
– rebel87
2015年3月2日,下午5:07
@ rebel87:aas是在现代编译代码中非常罕见的操作码; dec esp也是这样-从堆栈指针中仅减去1。看到像这样的“随机”拆卸是立即的危险信号。
–杂件
15年3月4日在10:13
@Jongware感谢您的回答,我会牢记这一点,即罕见的操作码可疑...
– rebel87
15年3月4日在10:31