C++ 反调试(NtSetInformationThread)

先上代码:

// Test_Console.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <afx.h>  
#include <tchar.h>
#include <afxwin.h>
#include <Windows.h>
#include <vector>
#include <iostream>
#include <assert.h>
#include <psapi.h>
#include <tlhelp32.h>
#include <WtsApi32.h>
#include <locale.h>
#include <ShObjIdl.h>
#include <stdio.h>
#include <fstream>
#include <string>
#include<thread>

using namespace std;

#pragma region 依赖 

typedef enum _THREADINFOCLASS { 
	ThreadBasicInformation, 
	ThreadTimes, 
	ThreadPriority, 
	ThreadBasePriority, 
	ThreadAffinityMask, 
	ThreadImpersonationToken, 
	ThreadDescriptorTableEntry, 
	ThreadEnableAlignmentFaultFixup, 
	ThreadEventPair_Reusable, 
	ThreadQuerySetWin32StartAddress, 
	ThreadZeroTlsCell, 
	ThreadPerformanceCount, 
	ThreadAmILastThread, 
	ThreadIdealProcessor, 
	ThreadPriorityBoost, 
	ThreadSetTlsArrayAddress, 
	ThreadIsIoPending, 
	ThreadHideFromDebugger, 
	ThreadBreakOnTermination, 
	MaxThreadInfoClass 
} THREADINFOCLASS;

typedef NTSTATUS(WINAPI *NtSetInformationThreadPtr)(
		HANDLE threadHandle,
		THREADINFOCLASS threadInformationClass,
		PVOID threadInformation,
		ULONG threadInformationLength
	);
	
// 反调试函数
void HideFromDebugger(){
    HMODULE hNtDll = LoadLibrary(TEXT("ntdll.dll"));
    NtSetInformationThreadPtr NtSetInformationThread = (NtSetInformationThreadPtr)GetProcAddress(hNtDll,"NtSetInformationThread");
    NTSTATUS status = NtSetInformationThread(GetCurrentThread(),ThreadHideFromDebugger,NULL,0);
}

// 线程函数
void myThread(){
	HideFromDebugger();
	while(1){
		cout << "hello" << endl;

		Sleep(1000);
	}
}

#pragma endregion


int _tmain(int argc, _TCHAR* argv[])
{
	// 创建线程
	thread thr(myThread);
	thr.join();
	

	getchar();
	return 0;
}

在这里插入图片描述
注意:这个函数一定要加上 WINAPI ,如果不加的话运行程序时就会出现以下错误:
在这里插入图片描述解释起来就是,编译器不认识你定义的函数指针,因为你调用的dll函数是一个远函数,而且是一个C函数,你得告诉编译器它是个c函数才行。

效果图

1.正常打开,程序正常运行:
在这里插入图片描述

2.使用 vs 调试程序,在以下两处下断点,
在这里插入图片描述
启动调试,在 HideFromDebugger(); 正常断下,
在这里插入图片描述
再次点击 继续 按钮,本应该在第二个断点处断下,但是程序调试结束了:
在这里插入图片描述
3.使用 x32dbg 附加进程,这里为了方便出发断点,我把代码做了一点修改:
(这样就可以在 x32dbg 里下 api 断点了)

void myThread(){
	HideFromDebugger();
	while(1){
		//cout << "hello" << endl;
		MessageBox(NULL,"","",NULL);	// 改成 MessageBox

		Sleep(10000);					// 改成 10s
	}
}

当调试器出发 MessageBoxA 断点时,程序退出:
在这里插入图片描述

每天进步一点点 = =
在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值