C# 获取线程';C语言中外部进程的起始地址#

C# 获取线程';C语言中外部进程的起始地址#,c#,windows,memory-address,C#,Windows,Memory Address,我已经设置了一个简单的C#程序。 我已经从kernel32.dll导入了 我已经获得了一个类的外部进程 我如何获得该特定主题的for线程#0 上述代码的结果是: -157479632 -157479632 -157479632 -157479632 0 -157479632 -157479632 -157479632 -157479632 -157479632 -157479632 -157479632 为什么有些0和其他0是相同的,都是负数?在thread对象(struct\u ETHREA

我已经设置了一个简单的C#程序。 我已经从
kernel32.dll
导入了

我已经获得了一个类的外部进程

我如何获得该特定主题的for线程#0

上述代码的结果是:

-157479632
-157479632
-157479632
-157479632
0
-157479632
-157479632
-157479632
-157479632
-157479632
-157479632
-157479632
为什么有些0和其他0是相同的,都是负数?

在thread对象(struct
\u ETHREAD
)中存在两个不同的起始地址-
起始地址-
这是线程通过
LdrInitializeThunk
遍历DLL后开始执行的地址。还存在第二个地址-
Win32StartAddress
。这个地址的含义-当我们通过win32函数(或它的外壳)创建线程时-win32级别将公共线程
StartAddress
设置为
ntdll.RtlThreadThreadStart
(此函数的名称取决于windows版本,比如xp-另一个名称),实际的lpStartAddress作为参数传递给
create[Remothe]thread
RtlThreadThreadStart
已经调用了实际的lpStartAddress。lpStartAddress并存储在
Win32StartAddress

因为大多数通过win32创建的线程都创建[Remothe]线程
——它们都具有相同的
起始地址
(对于另一个
起始地址
,我们需要直接调用底层api,如
RtlCreateUserThread
。同样在系统进程中,
起始地址
是内核中的实际线程起始地址)

当你使用代码时

foreach (ProcessThread thread in process.Threads) {
    Console.WriteLine(thread.StartAddress);
}
您得到的是
起始地址
——在大多数情况下,您给出的地址都是相同的,这是绝对正常的。在某些情况下,您可能会得到0或其他不正确的值-因为在某些版本中,windows
StartAddress
与其他成员联合保存,并且可以被覆盖

要获取
Win32StartAddress
必须使用
thread\u QUERY\u LIMITED\u INFORMATION
thread\u QUERY\u INFORMATION
打开线程句柄,并使用
ThreadQuerySetWin32StartAddress

    PVOID pv;
    ZwQueryInformationThread(hThread, ThreadQuerySetWin32StartAddress, &pv, sizeof(pv), 0);
关于
全部否定?


因为您打印的线程地址-指针不正确。将其打印为有符号整数。但是您必须以十六进制打印它作为指针,并且使用
%p
格式,这是不可能的。它曾经在Windows的前一个主要版本5中工作。又名WindowsXP和2003。内部内核更改破坏了它。避免问XY问题,因为不可能知道它为什么重要。@Hans Passant~什么。您可以从以下代码中学到更多:Process[]processs=Process.getprocesss();ForEach(进程,委托(进程p){ForEach(p.Threads中的ProcessThread){Console.WriteLine(p.Id+“:“+thread.StartAddress);});Console.ReadLine();我想可能是特权不够。也许我需要
处理\查询\信息
?但问题是,当我调用
线程.StartAddress
时,我没有机会使用任何特权枚举。@Anthony McGrath,好吧,很有趣。。。我的计算机上的每个进程都显示一个
线程。StartAddress
-157479632
(10%的进程的
线程。StartAddress
的值为0)----但是,ID为4和0的进程显示的值看起来正常,分别为
4:2024627296
0:2021639600
进程ID 4是
系统
,ID 0是
系统空闲进程
,这对我帮助很大,但是我仍然没有在C#@Acid中使用
ZwQueryInformationThread
-我不知道C#但是如果你能从
kernel32.dll
调用say
WriteProcessMemory
OpenProcess
-在什么问题上从
ntdll.dll
调用这个api?首先,你必须通过<代码> OpenTox<代码>线程> <代码> THealthQuyRyLimeDeDebug <代码>,然后调用<代码> ZWQueRealEngultStudio /你如何调用另一个本地API?我已经切换到用C++编写我的程序!谢谢你的帮助
    PVOID pv;
    ZwQueryInformationThread(hThread, ThreadQuerySetWin32StartAddress, &pv, sizeof(pv), 0);