本方法来源于NCK视频
关于里面的YzDbg可以切换X86和X64模式觉得很有意思
MessageBox(NULL, "1", "1", NULL);
HANDLE hTarget, hNewTarget;
//将当前进程的伪句柄柄转换为真实句柄赋值给自己,句柄的真实值保存在hTarget这个变量中
DuplicateHandle((HANDLE)-1, (HANDLE)-1, (HANDLE)-1, &hTarget, 0, 0, DUPLICATE_SAME_ACCESS);
// 为句柄hTarget设HANDLE_FLAG_PROTECT_FROK_CLOSE属性,设值是HANDLE_FLAG_PROTECT_FROM_CLOSE / 这一句执行之后, 句柄hTarget将禁止关闭
SetHandleInformation(hTarget, HANDLE_FLAG_PROTECT_FROM_CLOSE, HANDLE_FLAG_PROTECT_FROM_CLOSE);
//再一次将句柄hTarget复制给当前进程,复制后的结果保存在hNewTarget中
//其实这一句复制并没有意义,意义在于最后一个参数设置的DUPLICATE_CLOSE_SOURCE
//意思是这一句执行之后·就关闭句柄hTarget,我们之前调用了SetHandleInformation禁止关闭,那么这一句执行时候一定会报错
//什么情况下才会报错呢,当被调试器调试的时候才会报错
DuplicateHandle((HANDLE)-1, (HANDLE)hTarget, (HANDLE)-1, &hNewTarget, 0, 0, DUPLICATE_CLOSE_SOURCE);
system("pause");
直接查看64位的ntdll
相当于64位ntdll模块的NtDuplicateObject导出函数被HOOK了
https://www.cnblogs.com/this-543273659/archive/2013/03/04/2943380.html
基于DuplicateHandle的反调试并查看SharpOD如何反反调试
原文:https://www.cnblogs.com/fengtao918/p/14386680.html