Windows中获取线程起始地址
来源:互联网 发布:易语言挂机软件源码 编辑:程序博客网 时间:2024/05/16 10:30
偶尔碰到了一个小需求,要验证一个线程起始于某个模块,可以限制对代码的执行,起始于特定的线程。
线程的起始地址StartAddress,保存在了 _ETHREAD 结构中,无法从Ring3获取。
kd> dt _ethread 80553740 ntdll!_ETHREAD +0x000 Tcb : _KTHREAD +0x1c0 CreateTime : _LARGE_INTEGER 0x0 +0x1c0 NestedFaultCount : 0y00 +0x1c0 ApcNeeded : 0y0 +0x1c8 ExitTime : _LARGE_INTEGER 0x0 +0x1c8 LpcReplyChain : _LIST_ENTRY [ 0x0 - 0x0 ] +0x1c8 KeyedWaitChain : _LIST_ENTRY [ 0x0 - 0x0 ] +0x1d0 ExitStatus : 0 +0x1d0 OfsChain : (null) +0x1d4 PostBlockList : _LIST_ENTRY [ 0x0 - 0x0 ] +0x1dc TerminationPort : (null) +0x1dc ReaperLink : (null) +0x1dc KeyedWaitValue : (null) +0x1e0 ActiveTimerListLock : 0 +0x1e4 ActiveTimerListHead : _LIST_ENTRY [ 0x0 - 0x0 ] +0x1ec Cid : _CLIENT_ID +0x1f4 LpcReplySemaphore : _KSEMAPHORE +0x1f4 KeyedWaitSemaphore : _KSEMAPHORE +0x208 LpcReplyMessage : (null) +0x208 LpcWaitingOnPort : (null) +0x20c ImpersonationInfo : (null) +0x210 IrpList : _LIST_ENTRY [ 0x0 - 0x0 ] +0x218 TopLevelIrp : 0 +0x21c DeviceToVerify : (null) +0x220 ThreadsProcess : (null) +0x224 StartAddress : (null) +0x228 Win32StartAddress : (null) +0x22c ...... ......
有一个Native的函数,可以获取到线程的其实地址。该Native函数是 NtQueryInformationThread,第二个参数设置为ThreadQuerySetWin32StartAddress,即可获取线程的起始地址。
DWORD WINAPI GetThreadStartAddress(HANDLE hThread){NTSTATUS ntStatus;HANDLE hDupHandle;DWORD dwStartAddress;pNtQIT NtQueryInformationThread = (pNtQIT)GetProcAddress(GetModuleHandle("ntdll.dll"), "NtQueryInformationThread");if(NtQueryInformationThread == NULL) return 0;HANDLE hCurrentProcess = GetCurrentProcess();if(!DuplicateHandle(hCurrentProcess, hThread, hCurrentProcess, &hDupHandle, THREAD_QUERY_INFORMATION, FALSE, 0)){SetLastError(ERROR_ACCESS_DENIED);return 0;}ntStatus = NtQueryInformationThread(hDupHandle, ThreadQuerySetWin32StartAddress, &dwStartAddress, sizeof(DWORD), NULL);CloseHandle(hDupHandle);if(ntStatus != STATUS_SUCCESS) return 0;return dwStartAddress;}
0 0
- Windows中获取线程起始地址
- keil中STM32设置DEBUG起始地址
- linux/Windows中JAVA获取IP地址
- 如何获取 程序加载后的内存起始地址
- 如何获取 程序加载后的内存起始地址
- linux中为什么要随机函数栈的起始地址
- Keil C中如何更改程序的起始地址
- Windows中获取MAC地址的几种方法
- Windows XP中轻松获取未使用的IP地址
- Windows中获取MAC地址的几种方法
- Java中获取windows、Linux和windows7的MAC地址
- Java中获取windows、Linux和windows7的MAC地址
- Windows中获取MAC地址的几种方法
- Linux和Windows中获取动态库中某函数地址
- Windows下获取网卡地址
- Windows C 获取mac地址
- c++ windows 获取mac地址
- 中获取ip地址
- Loadrunner实现文件读写功能
- Delphi的几种类型转换
- WCF大数据量传输配置
- Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
- 2015年第六届蓝桥杯C/C++程序设计本科B组决赛
- Windows中获取线程起始地址
- 应用正则表达式实现input标签自动控制输入数字
- Android 干货客户端开发总结
- usaco堆积木(记得国王游戏的简化版,思路一样)
- jeval-java计算公式工具包
- [iOS]从URL远程请求图片
- Node.js + Web Socket 打造即时聊天程序嗨聊
- 多表左连接查询-MS-SQLServer/基础类
- main函数的多种写法