【软件逆向-关于UWOP_EPILOG的猜测】此文章归类为:软件逆向。
以下是当UNWIND_INFO.version为2时的一些猜测
对UNWIND_INFO.UnwindCodes的要求:
需要存在UWOP_EPILOG,并且它们都在最前面。
UWOP_EPILOG的个数需要是偶数,以满足对齐要求。用于对齐的UWOP_EPILOG紧跟在其他UWOP_EPILOG之后,它的UNWIND_CODE.OpInfo和UNWIND_CODE.CodeOffset需要为0,UNWIND_CODE.UnwindOp需要为UWOP_EPILOG。
UWOP_EPILOG的有效个数,可以是1个。(再用上面的方式,补充到2个)
当UNWIND_CODE.UnwindOp等于UWOP_EPILOG时,UNWIND_CODE其他字段含义:
总体来说:第一个UNWIND_CODE负责指定epilog的大小,其余的UNWIND_CODE负责依次指定所有epilog的起始位置。
如果第一个UNWIND_CODE.OpInfo为1,则表示第一个UNWIND_CODE也参与epilog起始位置的指定(仅使用CodeOffset构成一个8位的偏移,偏移的方式如下所述)。否则需要为0。
第一个之外的UNWIND_CODE,他们的OpInfo做为高4位,和CodeOffset共同组成12位的偏移。此偏移相对于RUNTIME_FUNCTION.EndAddress(也就是函数结束位置)向上偏移,指明了epilog的起始位置
展开过程:
PC = 当前RIP
如果PC小于UNWIND_INFO.SizeOfProlog,说明在prolog部分,按照版本1的逻辑执行即可。(检查从哪个UNWIND_CODE开始执行时,不检查UWOP_EPILOG,直接跳过)
如果PC在任意一个epilog里,则按照版本1的逻辑执行,但只检查pop操作,并且不验证最后一个语句是否为retn(因为有时最后是jmp语句)。
否则,就按照版本1的逻辑,把所有UNWIND_CODE都执行一遍。(遇到UWOP_EPILOG,无操作,直接跳过)
最后于 5小时前
被smwbkx编辑
,原因: 做些改正
更多【软件逆向-关于UWOP_EPILOG的猜测】相关视频教程:www.yxfzedu.com