首先大神原帖震楼:http://m.pediy.com/showthread.php?t=211188&highlight=VEH
在看雪潜水这么久,第一次处女技术贴,大神们直接无视吧。
对于只玩OD的小白来说,原帖很多地方都不懂。无奈,OD搞起吧。
原题重点:
首先要明白VEH链表和VCH链表的成员都是存在进程默认堆里边的,每安装一个就专门申请16字节的空间.而有一个全局变量LdrpVectorHandlerList中保存了VEH链表和VCH链表的入口位置.
0:000> d ntdll!LdrpVectorHandlerList
以下为 RtlAddVectoredExceptionHandler 函数内部
77A08419 $ 8BFF mov edi,edi
77A0841B . 55 push ebp
77A0841C . 8BEC mov ebp,esp
77A0841E . 64:A1 18000000 mov eax,dword ptr fs:[0x18]
77A08424 . 8B40 30 mov eax,dword ptr ds:[eax+0x30]
77A08427 . 56 push esi
77A08428 . 6A 10 push 0x10
77A0842A . 6A 00 push 0x0
77A0842C . FF70 18 push dword ptr ds:[eax+0x18]
77A0842F . E8 925CFDFF call RtlAllocateHeap
77A08434 . 8BF0 mov esi,eax
77A08436 . 85F6 test esi,esi
77A08438 . 74 62 je short 77A0849C
77A0843A . 53 push ebx
77A0843B . 57 push edi
77A0843C . FF75 0C push dword ptr ss:[ebp+0xC] ; 需要加密的函数地址
77A0843F . C746 08 01000000 mov dword ptr ds:[esi+0x8],0x1
77A08446 . E8 142DFEFF call RtlEncodePointer ; 加密函数
77A0844B . 8B5D 10 mov ebx,dword ptr ss:[ebp+0x10]
77A0844E . 6BDB 0C imul ebx,ebx,0xC
77A08451 . 81C3 4447AB77 add ebx,77AB4744 ; LdrpVectorHandlerList
77A08457 . 53 push ebx
77A08458 . 8946 0C mov dword ptr ds:[esi+0xC],eax ; 写入加密地址
77A0845B . 8D7B 04 lea edi,dword ptr ds:[ebx+0x4] ; 77AB4744+4
77A0845E . E8 0CBCFDFF call RtlAcquireSRWLockExclusive
77A08463 . 393F cmp dword ptr ds:[edi],edi ; edi=77AB4748
77A08465 . 75 17 jnz short 77A0847E
77A08467 . 64:8B0D 18000000 mov ecx,dword ptr fs:[0x18]
77A0846E . 8B45 10 mov eax,dword ptr ss:[ebp+0x10]
77A08471 . 8B49 30 mov ecx,dword ptr ds:[ecx+0x30]
77A08474 . 83C0 02 add eax,0x2
77A08477 . 83C1 28 add ecx,0x28
77A0847A . f0:0fab01 lock bts dword ptr ds:[ecx],eax ; PEB+28H处的值是5H
77A0847E > 837D 08 00 cmp dword ptr ss:[ebp+0x8],0x0 ; 判断1,0写入表连方式
77A08482 . 0F84 A2C70100 je 77A24C2A
77A08488 . 8B07 mov eax,dword ptr ds:[edi] ; List头 - 记录最后一个函数
77A0848A . 8906 mov dword ptr ds:[esi],eax
77A0848C . 897E 04 mov dword ptr ds:[esi+0x4],edi
77A0848F . 8970 04 mov dword ptr ds:[eax+0x4],esi ; 记录第一个函数
77A08492 . 8937 mov dword ptr ds:[edi],esi ; 把新添加的异常函数写入表头
77A08494 > 53 push ebx
77A08495 . E8 8FBBFDFF call RtlReleaseSRWLockExclusive
77A0849A . 5F pop edi
77A0849B . 5B pop ebx
77A0849C > 8BC6 mov eax,esi
77A0849E . 5E pop esi
77A0849F . 5D pop ebp
77A084A0 . C2 0C00 retn 0xC
从上面可以看到 LdrpVectorHandlerList 是存在于 Ntdll 中的一个基址(更加不同系统可能变吧)
77AB4744 00000000
77AB4748 0083A788 最后一个 VEH 处理函数机构。(大神贴有写这个结构)
77AB474C 0083A728 最前一个 VEH 处理函数机构。
这样就可以通过自己写算法,把所有表链中的 VEH 处理函数都拿出来了。
此外,如何有效的直接在自己的程序中 获取 LdrpVectorHandlerList 呢?
以上纯属小白看法,有错的地方大神们来纠正吧。。。。。
[峰会]看雪.第八届安全开发者峰会10月23日上海龙之梦大酒店举办!