能力值:
( LV9,RANK:150 )
|
-
-
3 楼
强大,支持
下载收藏(俺最喜欢干的事…………)
|
能力值:
( LV12,RANK:230 )
|
-
-
4 楼
俺是来支持下........
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
支持一下啊~
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
up 非常好,值得学习,下了看看,顺便在此谢谢achillis给我很多帮助!
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
恩。。有代码就是最好的了....
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
thanks man
|
能力值:
( LV9,RANK:170 )
|
-
-
10 楼
good job,可以学习一下代码了
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
谢谢,, 下载来 慢慢折腾
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
我利用你的代码编译了一下,在xp下可以列出进程,但是在win2000下不可以,问题在于特征码不通用,我经过测试发现通过函数CsrAddStaticServerThread()搜索有着更好的通用性,因为CsrAddStaticServerThread在最后要将线程加入到CsrssRootProcess链表内是,所在以可以在CsrAddStaticServerThread结尾处找到
下面我们先看看win2k winxp win2k3里的CsrLockProcessByClientId()函数要找的区域:
win2000里CsrLockProcessByClientId():
5FF852F6 |. 68 6089F85F PUSH CSRSRV.5FF88960
5FF852FB |. FF15 2011F85F CALL DWORD PTR DS:[<&ntdll.RtlEnterCriti>; ntdll.RtlEnterCriticalSection
5FF85301 |. 8B5C24 14 MOV EBX,DWORD PTR SS:[ESP+14]
5FF85305 |. 85DB TEST EBX,EBX
5FF85307 |. 74 03 JE SHORT CSRSRV.5FF8530C
5FF85309 |. 8323 00 AND DWORD PTR DS:[EBX],0
5FF8530C |> A1 5489F85F MOV EAX,DWORD PTR DS:[5FF88954] <----这里就是
5FF85311 |. 8B5424 10 MOV EDX,DWORD PTR SS:[ESP+10]
5FF85315 |. 83C0 08 ADD EAX,8
5FF85318 |. BF 010000C0 MOV EDI,C0000001
5FF8531D |. 8BC8 MOV ECX,EAX
winxp里CsrLockProcessByClientId()
75B452E0 |. 57 PUSH EDI
75B452E1 |. FF15 1811B475 CALL DWORD PTR DS:[<&ntdll.RtlEnterCriti>; ntdll.RtlEnterCriticalSection
75B452E7 |. 8B55 0C MOV EDX,DWORD PTR SS:[EBP+C]
75B452EA |. 8322 00 AND DWORD PTR DS:[EDX],0
75B452ED |. 8B35 1C89B475 MOV ESI,DWORD PTR DS:[75B4891C] <----这里是
75B452F3 |. 83C6 08 ADD ESI,8
75B452F6 |. C745 0C 01000>MOV DWORD PTR SS:[EBP+C],C0000001
win2003里CsrLockProcessByClientId()
759550E1 |. FF15 10119575 CALL DWORD PTR DS:[<&ntdll.RtlEnterCriti>; ntdll.RtlEnterCriticalSection
759550E7 |. 8B55 0C MOV EDX,DWORD PTR SS:[EBP+C]
759550EA |. 8322 00 AND DWORD PTR DS:[EDX],0
759550ED |. 8B35 BC889575 MOV ESI,DWORD PTR DS:[759588BC] <----这里
759550F3 |. 83C6 08 ADD ESI,8
759550F6 |. C745 0C 01000>MOV DWORD PTR SS:[EBP+C],C0000001
再来看看CsrAddStaticServerThread()在三大系统里的结尾部分
win2000里CsrAddStaticServerThread()结尾部分:
5FF855E4 |. 890A MOV DWORD PTR DS:[EDX],ECX
5FF855E6 |. 8948 04 MOV DWORD PTR DS:[EAX+4],ECX
5FF855E9 |. A1 5489F85F MOV EAX,DWORD PTR DS:[5FF88954]<----这里就是
5FF855EE |. FF40 58 INC DWORD PTR DS:[EAX+58]
5FF855F1 |> 57 PUSH EDI
5FF855F2 |. FF15 1C11F85F CALL DWORD PTR DS:[<&ntdll.RtlLeaveCriti>; ntdll.RtlLeaveCriticalSection
5FF855F8 |. 8BC6 MOV EAX,ESI
5FF855FA |. 5F POP EDI
5FF855FB |. 5E POP ESI
5FF855FC \. C2 0C00 RETN 0C
winxp里CsrAddStaticServerThread()结尾部分:
75B45412 |. 8908 MOV DWORD PTR DS:[EAX],ECX
75B45414 |. 8950 04 MOV DWORD PTR DS:[EAX+4],EDX
75B45417 |. 8902 MOV DWORD PTR DS:[EDX],EAX
75B45419 |. 8941 04 MOV DWORD PTR DS:[ECX+4],EAX
75B4541C |. A1 1C89B475 MOV EAX,DWORD PTR DS:[75B4891C] <---这里就是
75B45421 |. FF40 58 INC DWORD PTR DS:[EAX+58]
75B45424 |> 57 PUSH EDI
75B45425 |. FF15 1011B475 CALL DWORD PTR DS:[<&ntdll.RtlLeaveCriti>; ntdll.RtlLeaveCriticalSection
75B4542B |. 5F POP EDI
75B4542C |. 8BC6 MOV EAX,ESI
75B4542E |. 5E POP ESI
75B4542F |. 5D POP EBP
75B45430 \. C2 0C00 RETN 0C
win2003里CsrAddStaticServerThread结尾部分:
759551F2 |. 8902 MOV DWORD PTR DS:[EDX],EAX
759551F4 |. 8941 04 MOV DWORD PTR DS:[ECX+4],EAX
759551F7 |. A1 BC889575 MOV EAX,DWORD PTR DS:[759588BC] <----这里就是
759551FC |. FF40 54 INC DWORD PTR DS:[EAX+54]
759551FF |> 57 PUSH EDI
75955200 |. FF15 08119575 CALL DWORD PTR DS:[<&ntdll.RtlLeaveCriti>; ntdll.RtlLeaveCriticalSection
75955206 |. 5F POP EDI
75955207 |. 8BC6 MOV EAX,ESI
75955209 |. 5E POP ESI
7595520A \. C2 0C00 RETN 0C
通过上面可以看到win2000里不是MOV ESI,DWORD PTR DS:[xxxxxxx],而是MOV EAX,DWORD PTR DS:[xxxxxxxx] 而且后面不再是add Exx,8 而是MOV EDX,DWORD PTR SS:[ESP+10],所以特征码通用性不是很,
比较了三个系统CsrAddStaticServerThread()结尾部分,发现可以更好的实现通用性,
下面是我修改的GetCsrssRootProcessPointerOffset()函数部分:
ULONG GetCsrssRootProcessPointerOffset()
{
char szDllName[MAX_PATH];
unsigned char *pfnCsrLockProcessByClientId;
HMODULE hCsrsrv=NULL;
ULONG Offset;
unsigned char *p;
GetSystemDirectory(szDllName,MAX_PATH);
strcat(szDllName,"\\csrsrv.dll");
hCsrsrv=LoadLibraryEx(szDllName,NULL,DONT_RESOLVE_DLL_REFERENCES);
if (hCsrsrv)
{
printf("Csrsrv ModuleBase=0x%08X\n",hCsrsrv);
pfnCsrLockProcessByClientId=(unsigned char*)GetProcAddress(hCsrsrv,"CsrAddStaticServerThread");
//printf("CsrLockProcessByClientId=0x%08X\n",pfnCsrLockProcessByClientId);
/*
75AA52ED 8B35 1C89AA75 mov esi,dword ptr ds:[75AA891C]
75AA52F3 83C6 08 add esi,8
*/
//下面根据特征来查找CsrssRootProcess指针的地址,即上面的75AA891C
//一个小技巧:确定特征码匹配的特征码时,不要包含寄存器信息(如上面的esi),只含操作码信息即可,可以增强通用性
//我在XP的CSRSRV.DLL中找的特征码,同样适用于Vista的CSSRV.DLL
//李天东注:后面加上79是为了更接近CsrAddStaticServerThread()的结尾部分,即特征码部分.
p=(unsigned char *)pfnCsrLockProcessByClientId+79;
for (int i=0;i<0x50;i++)
{
printf("%#x:0x%02x\r\n",&p[i],p[i]);
if (p[i]==0xA1 && p[i+5]==0xFF && p[i+6]==0x40)
{
Offset=*(ULONG*)&p[i+1];
Offset=Offset-(ULONG)hCsrsrv;
printf("dongdong:Offset=0x%08X\n",Offset);
break;
}
}
FreeLibrary(hCsrsrv);
return Offset;
}
else
{
printf("[-]Load csrsrv.dll Failed\n");
return 0;
}
}
由于win vista我没有装,所以windows vista没有测试,请大家忙测试看看,是否通用
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
貌似还能通过CSR_PROCESS结构来判断调试器,收藏,回去看看
|
能力值:
( LV4,RANK:50 )
|
-
-
17 楼
先收藏了,比较喜欢看这种笔记的东西,能获得很多帮助。谢谢楼主
|