首页
社区
课程
招聘
[求助]如何枚举宿主进程所有线程?
发表于: 2010-5-7 15:24 12083

[求助]如何枚举宿主进程所有线程?

2010-5-7 15:24
12083
是这样的我用个DLL注入到A。EXE里面,现在想枚举A。EXE中的所有线程,要如何实现啊?有没朋友知道?

OD中这么线程的信息都是从哪儿得到的啊?什么标识,入口,最近的错误等信息。

[课程]FART 脱壳王!加量不加价!FART作者讲授!

上传的附件:
  • 1.JPG (17.54kb,349次下载)
收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 67
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
delphi 代码

引用单元 TLHelp32

procedure ThreadAllTerminate;
var
  PId, TId:DWORD;
  hSnapshot:THandle;
  te:TThreadEntry32;
begin
  hSnapshot := CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, PId );
  if hSnapshot = INVALID_HANDLE_VALUE then Exit;
  te.dwSize := sizeof( THREADENTRY32 );

  if Thread32First( hSnapshot, te ) = True then
  begin
    repeat
      if te.th32OwnerProcessID = PId then
      begin
        if te.th32ThreadID <> TId then
        begin

        end;
      end;
    until Thread32Next( hSnapshot, te ) = False;
  end;
  CloseHandle( hSnapshot );
end;
2010-5-7 16:00
0
雪    币: 105
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
话说: CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, PId );
这不是枚举系统范围的线程吗?我只想得到A.EXE进程中的线程哦
2010-5-7 19:14
0
雪    币: 77
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我想2楼的意思可能是用PID去过滤吧,去比较PID不就能留下你想要进程的线程了吗?!!

当然,我想会有更简洁方法吧,期待答案。
2010-5-7 19:21
0
雪    币: 67
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
通过GetCurrentProcessId获得当前进程id 来遍历宿主的线程

通过PEB也能得到线程信息吧 期待高手贴一个上来
2010-5-7 19:23
0
雪    币: 75
活跃值: (623)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
goodcode那个代码挺好。给你出个馊主意

fs:[0]指向的是当前线程的TEB,其他线程的TEB都在此teb前后若干个页面上
举个例子 ,当前进程有3个线程 ,那么它的用户空间会有三个TEB,假设第一个TEB位置为 7fffe000,那么另外两个所在位置是7fffd000 7fffc000,找个TEB结构里面特定的参数作为特征码,前后狂搜,几下就把所有的Teb->ClientId->UniqueThread给搞定了

vista,win7就不晓得还是不是这么回事
2010-5-7 19:29
0
雪    币: 67
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
7
没仔细看 http://bbs.pediy.com/showthread.php?t=102559
可能对你有帮助
2010-5-7 19:37
0
雪    币: 105
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
3Q,我还是试下枚举TEB结构吧
2010-5-7 19:58
0
雪    币: 284
活跃值: (106)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
9
BOOL ListProcessThreads( DWORD dwOwnerPID )
{
  HANDLE hThreadSnap = INVALID_HANDLE_VALUE;
  THREADENTRY32 te32;

  // Take a snapshot of all running threads  
  hThreadSnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 );
  if( hThreadSnap == INVALID_HANDLE_VALUE )
    return( FALSE );

  // Fill in the size of the structure before using it.
  te32.dwSize = sizeof(THREADENTRY32 );

  // Retrieve information about the first thread,
  // and exit if unsuccessful
  if( !Thread32First( hThreadSnap, &te32 ) )
  {
    printError( TEXT("Thread32First") ); // show cause of failure
    CloseHandle( hThreadSnap );          // clean the snapshot object
    return( FALSE );
  }

  // Now walk the thread list of the system,
  // and display information about each thread
  // associated with the specified process
  do
  {
    if( te32.th32OwnerProcessID == dwOwnerPID )
    {
      printf( "\n\n     THREAD ID      = 0x%08X", te32.th32ThreadID );
      printf( "\n     Base priority  = %d", te32.tpBasePri );
      printf( "\n     Delta priority = %d", te32.tpDeltaPri );
    }
  } while( Thread32Next(hThreadSnap, &te32 ) );

  CloseHandle( hThreadSnap );
  return( TRUE );
}
msdn上就有了嘛……另外也可以用
ZwQuerySystemInformation(SystemProcessInformation  ....
2010-5-7 20:25
0
雪    币: 105
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
关键是我并不是用PID来检测是否是我需要操作的线程。
CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 ); 这种方法不能满足需求
2010-5-8 01:44
0
雪    币: 189
活跃值: (4810)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
EnumThreadWindows 或 NtQuerySystemInformation
2010-5-8 04:03
0
雪    币: 1594
活跃值: (113)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
找到TEB链不就完了
2010-5-9 22:35
0
雪    币: 75
活跃值: (623)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
13
没见过 TEB链表,楼上是说的哪个结构哪个参数。
2010-5-10 13:05
0
雪    币: 331
活跃值: (57)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
14
我也想知道~~~~~
2010-10-8 12:20
0
游客
登录 | 注册 方可回帖
返回
//