1.一种构造合法堆栈返回值绕过函数调用检测的方法,其特征在于,包括:构造递归调用往堆栈中多次压入进程的d3d9.dll模块的代码段中的任一连续两条汇编指令序列pop ebp,retn的地址,其中压入地址的次数大于或等于堆栈检测调用的层数;在往堆栈中多次压入上述地址后,构造系统函数CreateDeviceEx需要的参数并压入堆栈,并往堆栈中再次压入上述地址后,跳转到系统函数CreateDeviceEx。
2.如权利要求1所述的构造合法堆栈返回值绕过函数调用检测的方法,其特征在于,往堆栈中压入的地址的获取方式为:在进程的d3d9.dll模块的代码段中查找连续的值为
0x5D,0xC3的指令的地址,其中0x5D,0xC3是汇编指令序列pop ebp,retn所对应的16进制数值。
3.如权利要求1或2所述的构造合法堆栈返回值绕过函数调用检测的方法,其特征在于,所述构造合法堆栈返回值绕过函数调用检测的方法具体为:初始化i=n;
Void func(void)
{
将进程的d3d9.dll模块的代码段中的任一连续两条汇编指令序列pop ebp,retn的地址压入堆栈;
将i的值减一;
如果:i>=0
跳转到func();
否则
构造系统函数CreateDeviceEx需要的参数压入堆栈,并往堆栈中再次压入上述地址后,跳转到系统函数CreateDeviceEx;
}
其中,n为堆栈检测调用的层数。
4.如权利要求1或2所述的构造合法堆栈返回值绕过函数调用检测的方法,其特征在于,所述构造合法堆栈返回值绕过函数调用检测的方法具体为:初始化i=0;
Void func(void)
{
将进程的d3d9.dll模块的代码段中的任一连续两条汇编指令序列pop ebp,retn的地址压入堆栈;
将i的值减一;
如果:i<=n
跳转到func();
否则
构造系统函数CreateDeviceEx需要的参数压入堆栈,并往堆栈中再次压入上述地址后,跳转到系统函数CreateDeviceEx;
}
其中,n为堆栈检测调用的层数。
5.如权利要求1或2所述的构造合法堆栈返回值绕过函数调用检测的方法,所述递归调用往堆栈中压入地址的次数大于等于5。
6.一种构造合法堆栈返回值绕过函数调用检测的系统,其特征在于,包括递归模块、递归跳出模块,其中:所述递归模块,用于构造递归调用往堆栈中多次压入进程的d3d9.dll模块的代码段中的任一连续两条汇编指令序列pop ebp,retn的地址,其中压入地址的次数大于或等于堆栈检测调用的层数;
所述递归跳出模块,用于在所述递归模块往堆栈中多次压入上述地址后,构造系统函数CreateDeviceEx需要的参数并压入堆栈,并往堆栈中再次压入上述地址后,跳转到系统函数CreateDeviceEx。
7.如权利要求6所述的构造合法堆栈返回值绕过函数调用检测的系统,其特征在于,往堆栈中压入的地址的获取方式为:在进程的d3d9.dll模块的代码段中查找连续的值为
0x5D,0xC3的指令的地址,其中0x5D,0xC3是汇编指令序列pop ebp,retn所对应的16进制。
8.如权利要求6或7所述的构造合法堆栈返回值绕过函数调用检测的系统,其特征在于,所述系统的具体实现方式为:初始化i=n;
Void func(void)
{
将进程的d3d9.dll模块的代码段中的任一连续两条汇编指令序列pop ebp,retn的地址压入堆栈;
将i的值减一;
如果:i>=0
跳转到func();
否则
构造系统函数CreateDeviceEx需要的参数压入堆栈,并往堆栈中再次压入上述地址后,跳转到系统函数CreateDeviceEx;
}
其中,n为堆栈检测调用的层数。
9.如权利要求6或7所述的构造合法堆栈返回值绕过函数调用检测的系统,其特征在于,所述系统的具体实现方式为:初始化i=0;
Void func(void)
{
将进程的d3d9.dll模块的代码段中的任一连续两条汇编指令序列pop ebp,retn的地址压入堆栈;
将i的值减一;
如果:i<=n
跳转到func();
否则
构造系统函数CreateDeviceEx需要的参数压入堆栈,并往堆栈中再次压入上述地址后,跳转到系统函数CreateDeviceEx;
}
其中,n为堆栈检测调用的层数。
10.如权利要求6或7所述的构造合法堆栈返回值绕过函数调用检测的方法,所述递归调用往堆栈中压入地址的次数大于等于5。