宝峰科技

 找回密码
 注册

QQ登录

只需一步,快速开始

智能终端设备维修查询系统注册会员邮箱认证须知!
查看: 3540|回复: 0

[原创] C语言获取线程启动地址源代码

[复制链接]

该用户从未签到

apoer 发表于 2009-10-29 15:49:04 | 显示全部楼层 |阅读模式

欢迎您注册加入!这里有您将更精采!

您需要 登录 才可以下载或查看,没有账号?注册

x


  1. #define   WIN32_LEAN_AND_MEAN   
  2.   #define   _WIN32_WINNT   0x400   
  3.   #include   <stdio.h>   
  4.   #include   <tchar.h>   
  5.   #include   <locale.h>   
  6.   #include   <windows.h>   
  7.   #include   <psapi.h>   
  8.   #include   <Tlhelp32.h>   
  9.    
  10.   #pragma   comment   (lib,   "psapi.lib")   
  11.    
  12.   //   
  13.   //   Thread   Information   Classes   
  14.   //   
  15.    
  16.   typedef   enum   _THREADINFOCLASS   {   
  17.           ThreadBasicInformation,   
  18.           ThreadTimes,   
  19.           ThreadPriority,   
  20.           ThreadBasePriority,   
  21.           ThreadAffinityMask,   
  22.           ThreadImpersonationToken,   
  23.           ThreadDescriptorTableEntry,   
  24.           ThreadEnableAlignmentFaultFixup,   
  25.           ThreadEventPair_Reusable,   
  26.           ThreadQuerySetWin32StartAddress,   
  27.           ThreadZeroTlsCell,   
  28.           ThreadPerformanceCount,   
  29.           ThreadAmILastThread,   
  30.           ThreadIdealProcessor,   
  31.           ThreadPriorityBoost,   
  32.           ThreadSetTlsArrayAddress,   
  33.           ThreadIsIoPending,   
  34.           ThreadHideFromDebugger,   
  35.           ThreadBreakOnTermination,   
  36.           MaxThreadInfoClass   
  37.           }   THREADINFOCLASS;   
  38.    
  39.   typedef   struct   _CLIENT_ID   {   
  40.           HANDLE   UniqueProcess;   
  41.           HANDLE   UniqueThread;   
  42.   }   CLIENT_ID;   
  43.   typedef   CLIENT_ID   *PCLIENT_ID;   
  44.    
  45.   typedef   struct   _THREAD_BASIC_INFORMATION   {   //   Information   Class   0   
  46.           LONG           ExitStatus;   
  47.           PVOID         TebBaseAddress;   
  48.           CLIENT_ID   ClientId;   
  49.           LONG   AffinityMask;   
  50.           LONG   Priority;   
  51.           LONG   BasePriority;   
  52.   }   THREAD_BASIC_INFORMATION,   *PTHREAD_BASIC_INFORMATION;   
  53.    
  54.   extern   "C"   LONG   (__stdcall   *ZwQueryInformationThread)   (   
  55.           IN   HANDLE   ThreadHandle,   
  56.           IN   THREADINFOCLASS   ThreadInformationClass,   
  57.           OUT   PVOID   ThreadInformation,   
  58.           IN   ULONG   ThreadInformationLength,   
  59.           OUT   PULONG   ReturnLength   OPTIONAL   
  60.           )   =   NULL;   
  61.    
  62.    
  63.   extern   "C"   LONG   (__stdcall   *RtlNtStatusToDosError)   (   
  64.           IN     ULONG   status)   =   NULL;

  65. BOOL   ShowThreadInfo   (DWORD   tid)   
  66.           {   
  67.                   THREAD_BASIC_INFORMATION         tbi;   
  68.                   PVOID                                               startaddr;   
  69.                   LONG                                                 status;   
  70.                   HANDLE                                             thread,   process;   
  71.                     
  72.                   thread   =   ::OpenThread   (THREAD_ALL_ACCESS,   FALSE,   tid);   
  73.                   if   (thread   ==   NULL)   
  74.                           return   FALSE;   
  75.    
  76.                   status   =   ZwQueryInformationThread   (thread,     
  77.                           ThreadQuerySetWin32StartAddress,     
  78.                           &startaddr,     
  79.                           sizeof   (startaddr),     
  80.                           NULL);   
  81.    
  82.                   if   (status   <   0)   
  83.                   {   
  84.                           CloseHandle   (thread);   
  85.                           SetLastError   (RtlNtStatusToDosError   (status));   
  86.                           return   FALSE;   
  87.                   };   
  88.    
  89.                   _tprintf   (TEXT   ("线程   %08x   的起始地址为   %p\n"),     
  90.                           tid,     
  91.                           startaddr);   
  92.    
  93.                   status   =   ZwQueryInformationThread   (thread,     
  94.                           ThreadBasicInformation,     
  95.                           &tbi,     
  96.                           sizeof   (tbi),     
  97.                           NULL);   
  98.    
  99.                   if   (status   <   0)   
  100.                   {   
  101.                           CloseHandle   (thread);   
  102.                           SetLastError   (RtlNtStatusToDosError   (status));   
  103.                           return   FALSE;   
  104.                   };   
  105.    
  106.                   _tprintf   (TEXT   ("线程   %08x   所在进程ID为   %08x\n"),     
  107.                           tid,     
  108.                           (DWORD)tbi.ClientId.UniqueProcess);   
  109.    
  110.                   process   =   ::OpenProcess   (PROCESS_ALL_ACCESS,     
  111.                           FALSE,     
  112.                           (DWORD)tbi.ClientId.UniqueProcess);   
  113.    
  114.                   if   (process   ==   NULL)   
  115.                   {   
  116.                           DWORD   error   =   ::GetLastError   ();   
  117.                           CloseHandle   (thread);   
  118.                           SetLastError   (error);   
  119.                           return   FALSE;   
  120.                   };   
  121.    
  122.                   TCHAR   modname   [0x100];   
  123.                   ::GetModuleFileNameEx   (process,   NULL,   modname,   0x100);   
  124.    
  125.                   _tprintf   (TEXT   ("线程   %08x   所在进程映象为   %s\n"),     
  126.                           tid,     
  127.                           modname);   
  128.    
  129.                   GetMappedFileName(process,     
  130.                           startaddr,     
  131.                           modname,     
  132.                           0x100);   
  133.    
  134.                   _tprintf   (TEXT   ("线程   %08x   可执行代码所在模块为   %s\n"),     
  135.                           tid,     
  136.                           modname);   
  137.    
  138.                   CloseHandle   (process);   
  139.                   CloseHandle   (thread);   
  140.                   return   TRUE;   
  141.           };   
  142.    
  143.   int   main   (void)   
  144.           {   
  145.                   setlocale   (LC_ALL,   ".ACP");   
  146.    
  147.                   HINSTANCE   hNTDLL   =   ::GetModuleHandle   (TEXT   ("ntdll"));   
  148.    
  149.                   (FARPROC&)ZwQueryInformationThread     =   
  150.                           ::GetProcAddress   (hNTDLL,   "ZwQueryInformationThread");   
  151.    
  152.                   (FARPROC&)RtlNtStatusToDosError           =   
  153.                           ::GetProcAddress   (hNTDLL,   "RtlNtStatusToDosError");   
  154.    
  155.                   HANDLE   h   =   CreateToolhelp32Snapshot   (TH32CS_SNAPTHREAD,   0);   
  156.                   THREADENTRY32   te;   
  157.                   te.dwSize   =   sizeof   (te);   
  158.                   if   (Thread32First   (h,   &te))   
  159.                   {   
  160.                           do   
  161.                           {   
  162.                                   if   (ShowThreadInfo   (te.th32ThreadID))   
  163.                                   {   
  164.                                   }   
  165.                                   else   
  166.                                   {   
  167.                                           _tprintf   (TEXT("无法获得线程   %08x   的相关信息,错误代码为   %d\n"),     
  168.                                                   te.th32ThreadID,   GetLastError   ());   
  169.                                   };   
  170.                           }   while   (Thread32Next   (h,   &te));   
  171.                   };   
  172.                   CloseHandle   (h);   
  173.           };  
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

免责声明

本站中所有被研究的素材与信息全部来源于互联网,版权争议与本站无关。本站所发布的任何软件编程开发或软件的逆向分析文章、逆向分析视频、补丁、注册机和注册信息,仅限用于学习和研究软件安全的目的。全体用户必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。学习编程开发技术或逆向分析技术是为了更好的完善软件可能存在的不安全因素,提升软件安全意识。所以您如果喜欢某程序,请购买注册正版软件,获得正版优质服务!不得将上述内容私自传播、销售或者用于商业用途!否则,一切后果请用户自负!

QQ|Archiver|手机版|小黑屋|联系我们|宝峰科技 ( 滇公网安备 53050202000040号 | 滇ICP备09007156号-2 )

Copyright © 2001-2023 Discuz! Team. GMT+8, 2025-5-7 23:51 , File On Powered by Discuz! X3.49

快速回复 返回顶部 返回列表