C++ 反调试(NtSetInformationThread)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++ 反调试(NtSetInformationThread),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2677字,纯文字阅读大概需要4分钟。
内容图文
![C++ 反调试(NtSetInformationThread)](/upload/InfoBanner/zyjiaocheng/590/f5be93c8332b429e8c82441506c3adf0.jpg)
参考 https://blog.csdn.net/Simon798/article/details/103161482
先上代码:
// 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;
}
?
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
注意:这个函数一定要加上 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
}
}
?
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
当调试器出发 MessageBoxA 断点时,程序退出:
每天进步一点点 = =
内容总结
以上是互联网集市为您收集整理的C++ 反调试(NtSetInformationThread)全部内容,希望文章能够帮你解决C++ 反调试(NtSetInformationThread)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。