首页
社区
课程
招聘
[求助]R0挂钩NtResumeThread如何判断是否为新进程
发表于: 2013-5-14 20:47 9279

[求助]R0挂钩NtResumeThread如何判断是否为新进程

2013-5-14 20:47
9279
RT 目前HOOK了 NtResumeThread
想拦截目标进程
在研究如何判断当前拦截到的进程(已经拿到PEPROCESS指针)是否为新创建的进程

我想了几个方法 比如判断PID 但是这样的话 多个相同程序之间不好区别

诸位有啥好思路 求不吝赐教~

PS:补充问题
有没有什么方法 可以通过 EPROCESS 获取 SYSTEM_PROCESS_INFORMATION

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你是想拦截远程线程吧?
可以注册一个进程回调,维护一个哈希表即可……
或者查看线程个数……如果为0则是新进程
2013-5-14 21:57
0
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
我已经屈服了。。。
现在用的是查看线程数量
不过你说错了一点 应该是线程数量=1 是新进程
进程已经启动鸟 线程数量怎么可能是0~

还是得谢谢你咯~ 3Q哈~
如果兄弟你说一下 回调+HASH  那就更好了 嘿嘿~
2013-5-15 02:03
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
进程创建回调里,以pid为值,将bitmap对应位置位,然后在线程回调里,查找线程所属pid是否在bitmap被置位,被置位,则是新进程的第一个线程,同时清除bitmap对应bit
2013-5-15 06:44
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
如果你是先执行NtResumeThread再查看线程数的话线程数就是1
如果你是先查看线程数再执行NtResumeThread的话,线程数就是0

还有……尽量少用hook尤其是在装机量大的场合……完全可以用回调实现……
2013-5-15 17:55
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
直接通过ZwQuerySystemInformation通过11号获取进程结构SYSTEM_PROCESS_INFORMATION

无需硬编
2013-5-15 17:58
0
雪    币: 461
活跃值: (65)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
ring3 传进程 到 ring0
2013-5-15 18:20
0
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
11号是SystemModuleInformation啊

WRK里面的返回结构体是
typedef struct _RTL_PROCESS_MODULE_INFORMATION {
    HANDLE Section;                 // Not filled in
    PVOID MappedBase;
    PVOID ImageBase;
    ULONG ImageSize;
    ULONG Flags;
    USHORT LoadOrderIndex;
    USHORT InitOrderIndex;
    USHORT LoadCount;
    USHORT OffsetToFileName;
    UCHAR  FullPathName[ 256 ];
} RTL_PROCESS_MODULE_INFORMATION, *PRTL_PROCESS_MODULE_INFORMATION;

typedef struct _RTL_PROCESS_MODULES {
    ULONG NumberOfModules;
    RTL_PROCESS_MODULE_INFORMATION Modules[ 1 ];
} RTL_PROCESS_MODULES, *PRTL_PROCESS_MODULES;

好像没有线程数量啊。
2013-6-7 11:05
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
typedef struct _SYSTEM_PROCESS_INFORMATION {
    ULONG NextEntryOffset;
    ULONG NumberOfThreads;
    LARGE_INTEGER SpareLi1;
    LARGE_INTEGER SpareLi2;
    LARGE_INTEGER SpareLi3;
    LARGE_INTEGER CreateTime;
    LARGE_INTEGER UserTime;
    LARGE_INTEGER KernelTime;
    UNICODE_STRING ImageName;
    KPRIORITY BasePriority;
    HANDLE UniqueProcessId;
    HANDLE InheritedFromUniqueProcessId;
    ULONG HandleCount;
    ULONG SpareUl2;
    ULONG SpareUl3;
    ULONG PeakVirtualSize;
    ULONG VirtualSize;
    ULONG PageFaultCount;
    ULONG PeakWorkingSetSize;
    ULONG WorkingSetSize;
    ULONG QuotaPeakPagedPoolUsage;
    ULONG QuotaPagedPoolUsage;
    ULONG QuotaPeakNonPagedPoolUsage;
    ULONG QuotaNonPagedPoolUsage;
    ULONG PagefileUsage;
    ULONG PeakPagefileUsage;
    ULONG PrivatePageCount;
} SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;

SystemProcessInformation
2013-6-7 11:18
0
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
我就是这么获取的
但是这样是先获取到全部进程的数据
还需要申请/释放内存
我想换个方式提高一下效率
2013-6-7 23:35
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
没什么好办法的,除非自己申请进程锁,然后遍历activethreadlist 不过不稳定而且需要适配多个系统

另外这个并不慢
2013-6-8 00:46
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
这么做,只能是在hookzwresume这样的环境下有用

哪天要你搞X64,你会没辙的。。。。。

然后你会想到PsSetCreateThreadNotify,然后。。。。你会发现这个回调里,query无论如何都会失败
2013-7-8 12:46
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
X64可以query system information的
2013-7-15 14:21
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
你XP或者03试试。。。。
2013-7-15 14:31
0
游客
登录 | 注册 方可回帖
返回
//