能力值:
( LV7,RANK:100 )
|
-
-
13 楼
参照lz的文章我也逆向了一下这几个内和函数,增加了对Ke386QueryIoAccessMap的逆向。
论坛前几天登陆不上,今天到公司就把东西发上来吧,算是一个补充。
BOOLEAN Ke386QueryIoAccessMap(ULONG MapNumber, PKIO_ACCESS_MAP IoAccessMap);
BOOLEAN Ke386SetIoAccessMap(ULONG MapNumber, PKIO_ACCESS_MAP IoAccessMap);
BOOLEAN Ke386IoSetAccessProcess(PKPROCESS Process, ULONG MapNumber);
kd> u Ke386QueryIoAccessMap
nt!Ke386QueryIoAccessMap:
804f8172 8bff mov edi,edi
804f8174 55 push ebp
804f8175 8bec mov ebp,esp
804f8177 56 push esi
804f8178 8b7508 mov esi,dword ptr [ebp+8] //MapNumber
804f817b 83fe01 cmp esi,1
804f817e 7604 jbe nt!Ke386QueryIoAccessMap+0x12 (804f8184)
804f8180 32c0 xor al,al
804f8182 eb46 jmp nt!Ke386QueryIoAccessMap+0x58 (804f81ca) //如果MapNumber不是0或者1,那么返回0(单字节)
804f8184 57 push edi
804f8185 ff158c864d80 call dword ptr [nt!_imp__KeRaiseIrqlToSynchLevel (804d868c)]
804f818b 85f6 test esi,esi
804f818d 8ad0 mov dl,al
804f818f 750f jne nt!Ke386QueryIoAccessMap+0x2e (804f81a0)
804f8191 8b7d0c mov edi,dword ptr [ebp+0Ch] //如果MapNumber为0,直接返回8K个0xff
804f8194 b900080000 mov ecx,800h
804f8199 83c8ff or eax,0FFFFFFFFh
804f819c f3ab rep stos dword ptr es:[edi]
804f819e eb1f jmp nt!Ke386QueryIoAccessMap+0x4d (804f81bf)
804f81a0 b800f0dfff mov eax,0FFDFF000h //如果MapNumber为1
804f81a5 69f624200000 imul esi,esi,2024h
804f81ab 8b4040 mov eax,dword ptr [eax+40h]
804f81ae 8b7d0c mov edi,dword ptr [ebp+0Ch]
804f81b1 b900080000 mov ecx,800h
804f81b6 8db40664e0ffff lea esi,[esi+eax-1F9Ch]
804f81bd f3a5 rep movs dword ptr es:[edi],dword ptr [esi]
804f81bf 8aca mov cl,dl
804f81c1 ff151c874d80 call dword ptr [nt!_imp_KfLowerIrql (804d871c)]
804f81c7 b001 mov al,1
804f81c9 5f pop edi
804f81ca 5e pop esi
804f81cb 5d pop ebp
804f81cc c20800 ret 8
BOOLEAN Ke386QueryIoAccessMap(ULONG MapNumber, PKIO_ACCESS_MAP IoAccessMap)
{
if(MapNumber==0)
{
memset(IoAccessMap, 0xff, sizeof(KIO_ACCESS_MAP)); //sizeof(KIO_ACCESS_MAP) = 8*1024
return 1;
}
else if(MapNumber==1)
{
KIRQL oldIrql = KeRaiseIrqlToSynchLevel();
KPCR* pPcr = (KPCR*)0X0FFDFF000;
memcpy(IoAccessMap, pPcr->TSS->IoMaps.IoMap, 8*1024);
KfLowerIrql(oldIrql);
return 1;
}
else
{
return 0;
}
}
kd> u Ke386SetIoAccessMap
nt!Ke386SetIoAccessMap:
804f80fe 8bff mov edi,edi
804f8100 55 push ebp
804f8101 8bec mov ebp,esp
804f8103 57 push edi
804f8104 8b7d08 mov edi,dword ptr [ebp+8]
804f8107 83ff01 cmp edi,1
804f810a 7759 ja nt!Ke386SetIoAccessMap+0x67 (804f8165)
804f810c 85ff test edi,edi
804f810e 7455 je nt!Ke386SetIoAccessMap+0x67 (804f8165)
804f8110 53 push ebx //MapNumber==1
804f8111 56 push esi
804f8112 ff158c864d80 call dword ptr [nt!_imp__KeRaiseIrqlToSynchLevel (804d868c)]
804f8118 8ad8 mov bl,al
804f811a 3ea120f0dfff mov eax,dword ptr ds:[FFDFF020h]
804f8120 8bd0 mov edx,eax
804f8122 b800f0dfff mov eax,0FFDFF000h
804f8127 69ff24200000 imul edi,edi,2024h
804f812d 8b4040 mov eax,dword ptr [eax+40h]
804f8130 8b750c mov esi,dword ptr [ebp+0Ch]
804f8133 8dbc0764e0ffff lea edi,[edi+eax-1F9Ch]
804f813a b900080000 mov ecx,800h
804f813f f3a5 rep movs dword ptr es:[edi],dword ptr [esi]
804f8141 8b4204 mov eax,dword ptr [edx+4]
804f8144 8b4844 mov ecx,dword ptr [eax+44h]
804f8147 b800f0dfff mov eax,0FFDFF000h
804f814c 668b4930 mov cx,word ptr [ecx+30h]
804f8150 8b4040 mov eax,dword ptr [eax+40h]
804f8153 66894866 mov word ptr [eax+66h],cx
804f8157 8acb mov cl,bl
804f8159 ff151c874d80 call dword ptr [nt!_imp_KfLowerIrql (804d871c)]
804f815f 5e pop esi
804f8160 b001 mov al,1
804f8162 5b pop ebx
804f8163 eb02 jmp nt!Ke386SetIoAccessMap+0x69 (804f8167)
804f8165 32c0 xor al,al //MapNumber!=1
804f8167 5f pop edi
804f8168 5d pop ebp
804f8169 c20800 ret 8
BOOLEAN Ke386SetIoAccessMap(ULONG MapNumber, PKIO_ACCESS_MAP IoAccessMap)
{
if(MapNumbe!=1)
{
return 0;
}
KIRQL oldIrql = KeRaiseIrqlToSynchLevel();
KPCR* pPcr = (KPCR*)0X0FFDFF000;
memcpy(pPcr->TSS->IoMaps.IoMap, IoAccessMap, 8*1024);
pPcr->TSS->IoMapBase = pPcr->Prcb->CurrentThread->ApcState->Process->IopmOffset;
KfLowerIrql(oldIrql);
return 1;
}
kd> u Ke386IoSetAccessProcess
nt!Ke386IoSetAccessProcess:
804f81d4 8bff mov edi,edi
804f81d6 55 push ebp
804f81d7 8bec mov ebp,esp
804f81d9 56 push esi
804f81da 8b750c mov esi,dword ptr [ebp+0Ch] //MapNumber
804f81dd 83fe01 cmp esi,1
804f81e0 7604 jbe nt!Ke386IoSetAccessProcess+0x12 (804f81e6)
804f81e2 32c0 xor al,al //MapNumber!=0 && MapNumber!=1
804f81e4 eb48 jmp nt!Ke386IoSetAccessProcess+0x5a (804f822e)
804f81e6 85f6 test esi,esi
804f81e8 7507 jne nt!Ke386IoSetAccessProcess+0x1d (804f81f1)
804f81ea beac200000 mov esi,20ACh //MapNumber==0
804f81ef eb0c jmp nt!Ke386IoSetAccessProcess+0x29 (804f81fd)
804f81f1 69f624200000 imul esi,esi,2024h //MapNumber==1
804f81f7 81ee9c1f0000 sub esi,1F9Ch
804f81fd ff158c864d80 call dword ptr [nt!_imp__KeRaiseIrqlToSynchLevel (804d868c)]
804f8203 8ac8 mov cl,al
804f8205 8b4508 mov eax,dword ptr [ebp+8] //Process
804f8208 8b5034 mov edx,dword ptr [eax+34h] //edx = Process->ActiveProcessors
804f820b 66897030 mov word ptr [eax+30h],si
804f820f 3ea120f0dfff mov eax,dword ptr ds:[FFDFF020h]
804f8215 855014 test dword ptr [eax+14h],edx //pPcr->Prcb->SetMember
804f8218 740c je nt!Ke386IoSetAccessProcess+0x52 (804f8226)
804f821a b800f0dfff mov eax,0FFDFF000h
804f821f 8b4040 mov eax,dword ptr [eax+40h]
804f8222 66897066 mov word ptr [eax+66h],si //pPcr->TSS->IoMapBase
804f8226 ff151c874d80 call dword ptr [nt!_imp_KfLowerIrql (804d871c)]
804f822c b001 mov al,1
804f822e 5e pop esi
804f822f 5d pop ebp
804f8230 c20800 ret 8
BOOLEAN Ke386IoSetAccessProcess(PKPROCESS Process, ULONG MapNumber)
{
if(MapNumbe!=0 && MapNumber!=1)
{
return 0;
}
USHORT IOPMoffset;
if(MapNumber == 0)
{
IOPMoffset = 0x20AC; //未知偏移,大小上等于sizeof(KTSS)+0x20
}
else
{
IOPMoffset = 0x2024 - 0x1F9C; //0x88, 在KTSS结构中IoMaps.IoMap的偏移
}
KIRQL oldIrql = KeRaiseIrqlToSynchLevel();
KPCR* pPcr = (KPCR*)0X0FFDFF000;
if(pPcr->Prcb->SetMember & Process->ActiveProcessors) //这里的,combojiang大牛之前写错了
{
pPcr->TSS->IoMapBase = IOPMoffset;
}
KfLowerIrql(oldIrql);
return 1;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
哎。。不知道为什么,第一和第三篇的方法我测试没通过。
第一篇算是真正的ring3使用in out指令。。但我这里提示使用特权指令的错误。。
第二篇是使用驱动了,应该不能算是ring3下的硬件访问呀。。。
看此篇之前,通过第一篇在RING3修改IOPL位的方法,想到了通过驱动更改IOPL位,然后在ring3下调用in out,但没做测试。
而直接阅读本篇,发现思路类似,可不知道为什么,也是提示使用了特权指令。。。
三种方法,只能通过第二篇的直接在驱动层使用in和out。。ring3的工作是发送控制码。。。。
从combojiang大牛的文章中学到了很多东西,比如:前置一些知识不太懂,所以花了16小时时间阅读了第一篇中使用的 "蓝底图示" 的来源文章. 非常感谢。
关于ring3访问硬件.还有一些问题想请教combojiang大牛,不知道除了论坛ID,还有没有其它联系方式??
|