nt!KeStackAttachProcess:
804f8802 8bff mov edi,edi
804f8804 55 push ebp
804f8805 8bec mov ebp,esp
804f8807 56 push esi
804f8808 57 push edi
804f8809 64a124010000 mov eax,fs:[00000124]
//currentThread
804f880f 8bf0 mov esi,eax
804f8811 64a194090000 mov eax,fs:[00000994]
//_FX_SAVE_AREA
unknown param
;不过可以通过下面KeBugCheckEx 分析出来 应该是地址空间, 而且bugCode是5....
804f8817 85c0
test
eax,eax
804f8819 741c jz nt!KeStackAttachProcess+0x35 (804f8837)
nt!KeStackAttachProcess+0x19:
//BSOD
804f881b 64a194090000 mov eax,fs:[00000994]
804f8821 50 push eax
804f8822 0fb68665010000 movzx eax,byte ptr [esi+0x165]
804f8829 50 push eax
804f882a ff7644 push dword ptr [esi+0x44]
804f882d ff7508 push dword ptr [ebp+0x8]
804f8830 6a05 push 0x5
804f8832 e89d120000 call nt!KeBugCheckEx (804f9ad4)
nt!KeStackAttachProcess+0x35:
804f8837 8b7d08 mov edi,[ebp+0x8]
//
参数 目标进程KPEB
804f883a 397e44
cmp
[esi+0x44],edi
//
目标进程与当前进程比较
804f883d 750c jnz nt!KeStackAttachProcess+0x49 (804f884b)
nt!KeStackAttachProcess+0x3d:
//
相等
804f883f 8b450c mov eax,[ebp+0xc]
//
输出参数
804f8842 c7401001000000 mov dword ptr [eax+0x10],0x1
//
将APCstate->KPEB设为1
804f8849 eb39 jmp nt!KeStackAttachProcess+0x82 (804f8884)
nt!KeStackAttachProcess+0x49:
//
不相等
804f884b ff1514874d80 call dword ptr [nt!_imp__KeRaiseIrqlToDpcLevel (804d8714)]
//
提高到DPC
804f8851 80be6501000000
cmp
byte ptr [esi+0x165],0x0
//ApcStateIndex
?=OriginalApcEnvironment
当前线程是否处于挂接状态
804f8858 884508 mov [ebp+0x8],al
//
...竟然用函数参数空间来放IRQL
804f885b 740f jz nt!KeStackAttachProcess+0x6a (804f886c)
nt!KeStackAttachProcess+0x5b:
//
不等
804f885d ff750c push dword ptr [ebp+0xc]
804f8860 ff7508 push dword ptr [ebp+0x8]
804f8863 57 push edi
804f8864 56 push esi
804f8865 e898fdffff call nt!KiAttachProcess (804f8602)
804f886a eb18 jmp nt!KeStackAttachProcess+0x82 (804f8884)
nt!KeStackAttachProcess+0x6a:
//
相等
804f886c 8d864c010000 lea eax,[esi+0x14c]
//
用curthread->saveApcstate进程不处于挂接状态,
需要将存下来以便恢复时候还原,你可能会问为什么上面不用saveState,原因是windows内核中线程只有两个ApcState来使用,
一个存储当前的,一个用来存储原来的,当当前进程已经是挂接状态时,其saveApc已经被使用 所以需要提供一个apcstate来存储,
至于这个apcstate是否被用来存储当前的apcstate还是存储saveapc中的就要看
KiAttachProcess 怎么处理了.
804f8872 50 push eax
804f8873 ff7508 push dword ptr [ebp+0x8]
804f8876 57 push edi
804f8877 56 push esi
804f8878 e885fdffff call nt!KiAttachProcess (804f8602)
804f887d 8b450c mov eax,[ebp+0xc]
804f8880 83601000 and dword ptr [eax+0x10],0x0
//
返回值里设为0
nt!KeStackAttachProcess+0x82:
804f8884 5f pop edi
804f8885 5e pop esi
804f8886 5d pop ebp
804f8887 c20800 ret 0x8