我们不希望一些API调用被截获,常用的方法是检测API的开头处是否有断点,但是这样对于硬件断点就没有办法了.我想了一个方法,已经验证.请各位看看,讨论讨论.
说明: 我们要查看是否有 \\.\NTICE的设备在系统中.
我们需要调用
h = CreateFile("\\\\.\\NTICE", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
看看是不是能打开这个设备. 当Cracker截获这个调用,很容易发现我们的企图.
但是,
我们可以这样构造,首先我们给\\.\NTICE定义一个ID, 比如 0xfefefefe, 注意,这个ID一定要是一个非法的内存,可以用IsBadReadPtr or IsBadWritePtr检验一下先. 然后我们调用 CreateFile(0xfefefefe, ....);
这时候当CreateFile访问0xfefefefe的时候,就是说CreateFile想用这个字符串了,我们可以捕获这个异常,然后修改CreateFile运行过程中的寄存器,使CreateFile能正常工作.
这样我们就能检测到这个设备是否在使用了.而Cracker在CreateFile上设置断点,不会事先知道我们要干什么.
static int _OnHandleException(DWORD dwID, LPEXCEPTION_POINTERS p)
{
BOOL bFindOurID = false;
int* pn = (int*)&(p->ContextRecord->Edi);
for (int i = 0; i < 12; i++)
{
int ids = *(pn + i);
if (ids == dwID)
{
*(pn + i) = "\\\\.\\NTICE";
bFindOurID = true;
}
};
if (bFindOurID)
return EXCEPTION_CONTINUE_EXECUTION;
else
return EXCEPTION_CONTINUE_SEARCH;
}
static HANDLE _SafeOpenFile(DWORD dwID0xfefefefe)
{
HANDLE h = NULL;
__try
{
h = CreateFile((const char*)dwID0xfefefefe, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
}
__except(_OnHandleException(dwID0xfefefefe, GetExceptionInformation()))
{
}
return h;
}
欢迎指教.
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)