[某著名IM軟件]輸入密碼-[XXSafeEdit]-保護(hù)破釋分析2008-12-16 07:41【破文標(biāo)題】[某著名IM軟件]輸入密碼-[XXSafeEdit]-保護(hù)破釋分析
【對(duì) 象】初入門的新手
【下載地址】www.xx.com
【破解工具】OD
【保護(hù)方式】消息加密保護(hù)
【任 務(wù)】找出原始消息記錄觸發(fā)點(diǎn)
【破文作者】thomasyzh
【組 織】沒有
【破解聲明】這篇破文圖的是速度,和解決問題---沒有更加多的深入分析保護(hù)方式-總共12小時(shí),3天,每天4小時(shí)
【備 注】老手勿看,別浪費(fèi)你的時(shí)間
【電 郵】machinesy@163.com
【破解過程】
首先,要知道其對(duì)于密碼的保護(hù)方式。其用鍵盤記錄精靈等驅(qū)動(dòng)級(jí)記錄失效果。以及在內(nèi)存中無法找到明文輸入。
具體測(cè)試過程如下:
1。使用鍵盤記錄精靈記錄你要輸入的密碼。
測(cè)試結(jié)果。得到的并非自己輸入的。
2。使用WinHex等工具,直接內(nèi)存中搜索你輸入的明文字符串。
測(cè)試結(jié)果。沒有查找到。
有了如上兩點(diǎn)后,我們開發(fā)分析其保護(hù)方式,首先要確定其是驅(qū)動(dòng)級(jí)保護(hù),還是非驅(qū)動(dòng)級(jí)保護(hù)。
于是使用OD,打開。載入c。
F2。下斷Kernel32->CreateFile.
這里大概提提R3進(jìn)R0的幾種方式。
.最為常規(guī)的驅(qū)動(dòng)通信采用CreateFile,和DeviceIoContral.其次,還有中斷門,陷阱門等手法。(具體參見看雪rootkit學(xué)習(xí))
由于XX是大型應(yīng)用程序軟件,從軟件設(shè)計(jì)的角度上來考慮,其基本上不可能去掛接中斷門,等硬件很底層的東西,因?yàn)椋@樣做的話會(huì)造成他們的軟件茁壯性非常低。
所以這里我只考慮了CreateFile.
這時(shí)候我們讓程序跑起來,看其會(huì)訪問什么驅(qū)動(dòng)。
在CreateFile,后并沒有發(fā)現(xiàn)其訪問什么驅(qū)動(dòng)。所以我認(rèn)為。XX的保護(hù),并非驅(qū)動(dòng)級(jí)了。
這時(shí)候我們?cè)賮矸治鰎3下的用戶鍵盤輸入。
這里提一下R3下用戶鍵盤輸入的幾種可能:
1。如果是一個(gè)窗口程序,會(huì)觸發(fā)WM_KEYDOWN.這個(gè)消息.
2。如果是控制臺(tái)程序,會(huì)向基本輸入流里寫入一個(gè)字符.
3。如果是Dx,或者其它非主流應(yīng)用程序的API,或者涉及到com相關(guān)技術(shù)的東西,大概其會(huì)把輸入放入到一個(gè)Buffer里。
下面談?wù)凴3下取EDIT里字符的方法。既然是Edit,就一定是窗口程序了。所以不涉及到程序情況2(控制臺(tái)程序)。
一般情況下,寫程序的人會(huì)用GetWindowText,或者GetDlgItemText取窗口上輸入的字符。也有可能在WM_KEYDOWN時(shí)就把字符,放如Buffer,而不使用這兩個(gè)函數(shù)。在com和dx里,其一定是放入Buffer里.大概就這兩種情況。
1。根據(jù)特點(diǎn),我們首先測(cè)試GetWindowText這個(gè)函數(shù)。
測(cè)試結(jié)果:好的,發(fā)現(xiàn)沒有使用。
2.根據(jù)直接放到Buffer這種情況,直接下XP下的萬能斷點(diǎn)。
測(cè)試結(jié)果:是的,它沒有走到萬難斷點(diǎn)這里,又或者是對(duì)那個(gè)斷點(diǎn)進(jìn)行保護(hù)。
------這里提一提,對(duì)于XX游戲,下萬難斷點(diǎn),是能夠取到密碼輸入的。
至于萬能斷點(diǎn)在哪里,可以查看看雪工具下載。里邊有提供工具。
這時(shí)候,我們就只能從消息入手了。畢竟是窗口程序,消息循環(huán)是絕對(duì)存在的。
這里提提,對(duì)消息掛接的幾種方式。
1。SetWindowHook.----消息鉤子。
2。SetWindowLong.----這個(gè)函數(shù),主要用于窗口子類化。
-----這里我們先不著急,分析其消息鉤子,先對(duì)于SetWindowLong函數(shù)下端。(由于XX窗口,會(huì)做的漂亮點(diǎn),通常會(huì)使用SetWindowLong函數(shù))
這里我們要找到那個(gè)Edit窗口具體是什么窗口,找窗口有很多工具的,就不具體談了。
[XXSafeEdit]是其密碼輸入保護(hù)的主要模塊。那么我們先在LoadLibrary下點(diǎn)。大概會(huì)斷在這里:
608F6684???? E8 53CA0000????? call???? <jmp.&MFC42.#4160_CString::LoadStringA>
608F6689???? 68 9A860000????? push???? 869A
608F668E???? 8D4D EC????????? lea????? ecx, dword ptr [ebp-14]
608F6691???? E8 46CA0000????? call???? <jmp.&MFC42.#4160_CString::LoadStringA>
608F6696???? FF75 E8????????? push???? dword ptr [ebp-18]
608F6699???? 8B3D 30A19060??? mov????? edi, dword ptr [<&KERNEL32.LoadLibraryA>] ; kernel32.LoadLibraryA
608F669F???? FFD7???????????? call???? edi
608F66A1???? 3BC3???????????? cmp????? eax, ebx
608F66A3???? 8986 A0020000??? mov????? dword ptr [esi+2A0], eax
608F66A9???? 75 18??????????? jnz????? short 608F66C3
608F66AB???? 6A 30??????????? push???? 30
608F66AD???? 68 14869160????? push???? 60918614?????????????????????????????????? ; ASCII "XX"
608F66B2???? FF75 F0????????? push???? dword ptr [ebp-10]
608F66B5???? 8BCE???????????? mov????? ecx, esi
608F66B7???? E8 BACC0000????? call???? <jmp.&MFC42.#4224_CWnd::MessageBoxA>
608F66BC???? 53?????????????? push???? ebx
608F66BD???? FF15 8CA69060??? call???? dword ptr [<&MSVCRT.exit>]???????????????? ; msvcrt.exit
608F66C3???? FF75 EC????????? push???? dword ptr [ebp-14]
608F66C6???? 50?????????????? push???? eax
608F66C7???? FF15 54A19060??? call???? dword ptr [<&KERNEL32.GetProcAddress>]???? ; kernel32.GetProcAddress
608F66CD???? 3BC3???????????? cmp????? eax, ebx
608F66CF???? 75 18??????????? jnz????? short 608F66E9
608F66D1???? 6A 30??????????? push???? 30
608F66D3???? 68 14869160????? push???? 60918614?????????????????????????????????? ; ASCII "XX"
608F66D8???? FF75 F0????????? push???? dword ptr [ebp-10]
608F66DB???? 8BCE???????????? mov????? ecx, esi
608F66DD???? E8 94CC0000????? call???? <jmp.&MFC42.#4224_CWnd::MessageBoxA>
608F66E2???? 53?????????????? push???? ebx
608F66E3???? FF15 8CA69060??? call???? dword ptr [<&MSVCRT.exit>]???????????????? ; msvcrt.exit
608F66E9???? 8D4E 64????????? lea????? ecx, dword ptr [esi+64]
608F66EC???? 51?????????????? push???? ecx
608F66ED???? FFD0???????????? call???? eax
608F66EF???? 395E 64????????? cmp????? dword ptr [esi+64], ebx
608F66F2???? 75 18??????????? jnz????? short 608F670C
608F66F4???? 6A 30??????????? push???? 30
608F66F6???? 68 14869160????? push???? 60918614?????????????????????????????????? ; ASCII "XX"
608F66FB???? FF75 F0????????? push???? dword ptr [ebp-10]
608F66FE???? 8BCE???????????? mov????? ecx, esi
608F6700???? E8 71CC0000????? call???? <jmp.&MFC42.#4224_CWnd::MessageBoxA>
608F6705???? 53?????????????? push???? ebx
608F6706???? FF15 8CA69060??? call???? dword ptr [<&MSVCRT.exit>]???????????????? ; msvcrt.exit
608F670C???? 3BF3???????????? cmp????? esi, ebx
608F670E???? 75 08??????????? jnz????? short 608F6718
?
-----其加載[XXSafeEdit]的時(shí)候會(huì)在這里。這里其Load模塊之后,會(huì)取出一Get出一個(gè)函數(shù),然后創(chuàng)建一個(gè)XXX,我們就不逆,有時(shí)間在逆。
逆完之后,完全可以模仿出一個(gè)他那個(gè)模塊的行為然后再XXX。或者XXX。
在[XXSafeEdit]?? Load之后,我們下SetWindowLong函數(shù)斷。
然后觀察棧的窗口數(shù)據(jù),大概到這里
0012ECA4??? 00ED2E0C?? /CALL 到 SetWindowLongA 來自 TSSafeEd.00ED2E09
0012ECA8??? 00020994?? |hWnd = 00020994 ('Q',class='Edit',parent=0004099A)
0012ECAC??? FFFFFFFC?? |Index = GWL_WNDPROC
0012ECB0??? 00ED283F?? \NewValue = ED283F
好的...這個(gè)SetWindowLong,來自SafeEdit.窗口正是我們開始用XXX找到的密碼輸入窗口,GWL_WNDPROC代表NewValue是一個(gè)新的窗口消息處理過程。那么地址就是ED283F。
這時(shí)候,我們就去ED283F,下條件斷點(diǎn),大概判斷是什么消息。當(dāng)是WM_KEYDOWN的時(shí)候,我們就斷下來。
00ED283B???? 5E?????????????? pop????? esi
00ED283C???? C2 0400????????? retn???? 4
00ED283F >?? 55?????????????? push???? ebp?????????????????????????????? ; dword ptr[esp+8] == 100
00ED2840???? 8BEC???????????? mov????? ebp, esp
00ED2842???? 83EC 14????????? sub????? esp, 14
00ED2845???? 8B0D 4891ED00??? mov????? ecx, dword ptr [ED9148]
00ED284B???? 8365 FC 00?????? and????? dword ptr [ebp-4], 0
00ED284F???? 8065 F6 00?????? and????? byte ptr [ebp-A], 0
00ED2853???? 53?????????????? push???? ebx
00ED2854???? 33C0???????????? xor????? eax, eax
00ED2856???? 56?????????????? push???? esi
00ED2857???? 85C9???????????? test???? ecx, ecx
00ED2859???? 57?????????????? push???? edi
00ED285A???? C645 EC 75?????? mov????? byte ptr [ebp-14], 75
00ED285E???? C645 ED 73?????? mov????? byte ptr [ebp-13], 73
00ED2862???? C645 EE 65?????? mov????? byte ptr [ebp-12], 65
這里,我們就能在WM_KEYDOWN了。當(dāng)WM_KEYDOWN的時(shí)候,我們就能取得用戶按的鍵了,具體是WM_KEYDOWN觸發(fā)時(shí)的LPARAM.里邊保存的是VK數(shù)據(jù)。
這里給出VK數(shù)據(jù)值。
出自VC6。頭文件。41是a怎么怎么的。
這時(shí)候我們發(fā)現(xiàn),我們的WM_KEYDOWN是亂碼。也就是說,我們?nèi)〉腤M_KEYDOWN并非我們真實(shí)按下的鍵盤。
因?yàn)椋覀儼碅的時(shí)候,每一次得到的都是不一樣的數(shù)據(jù)。
好的,我們來分析下它是雜個(gè)讓W(xué)M_KEYDWON..在消息下變化的。
在WIN32 R3下有一組鍵盤操作函數(shù):
大概是下邊這些:
具體參考SDK,在MapVirtualKeyA下斷點(diǎn)。我們可以發(fā)現(xiàn)。
0012F968??? 00ED54D3?? /CALL 到 MapVirtualKeyA 來自 TSSafeEd.00ED54CD
0012F96C??? 00000032?? |Key = 32
0012F970??? 00000000?? \Action = 0
0012F974??? 00000113
0012F978??? 00000000
0012F97C??? 00000113
[XXSafeEdit]在不停的調(diào)用這個(gè),這個(gè)函數(shù),這時(shí)候,我們就對(duì)其下條件斷點(diǎn)進(jìn)行中斷條件過濾。直到我們按下的時(shí)候,我們才讓它斷下來。
我們按下的時(shí)候,斷下來的棧大概是這樣:
0012F9DC??? 0108D16A?? /CALL 到 MapVirtualKeyA 來自 0108D167
0012F9E0??? 00000054?? |Key = 54
0012F9E4??? 00000000?? \Action = 0
0012F9E8??? 00000100
0012F9EC??? 00000000
好的,我們發(fā)現(xiàn),它不是跳到[XXSafeEdit]模塊里了,而是0108d167這個(gè)位置了。于是,我們就到那里去。
我們?cè)谀莻€(gè)點(diǎn)下斷。
這里,大膽做個(gè)猜測(cè),對(duì)于加密這個(gè)理論,一定是針對(duì)于明文的。那么在密文之前的某一時(shí)刻,一定是存在明文的。
那么,我們就繼續(xù)向這段代碼之前的代碼跟蹤。
-------對(duì)于這段代碼的用途,和XX SafeEdit的一些其它用途,我就不多說了,讓大家有多點(diǎn)的享受機(jī)會(huì),具體自己跟跟。
在這里回朔跟蹤,我們就能找到這個(gè)點(diǎn)
0108D0D2???? 51?????????????? push???? ecx
0108D0D3???? 8B55 0C????????? mov????? edx, dword ptr [ebp+C]
0108D0D6???? 52?????????????? push???? edx
0108D0D7???? E8 7CFEFFFF????? call???? 0108CF58------------注意這里
0108D0DC???? 85C0???????????? test???? eax, eax-------------注意這里
0108D0DE???? 0F85 BF000000??? jnz????? 0108D1A3
0108D0E4???? 8B4D FC????????? mov????? ecx, dword ptr [ebp-4]---------這里下斷
0108D0E7???? 8B51 24????????? mov????? edx, dword ptr [ecx+24]
0108D0EA???? 33C0???????????? xor????? eax, eax
0108D0EC???? 8A02???????????? mov????? al, byte ptr [edx]
0108D0EE???? 8B4D F8????????? mov????? ecx, dword ptr [ebp-8]
好的,我們?cè)谀莻€(gè)test之后的,108d0e4處下點(diǎn),短下后,我們看棧
0012F9E8??? 00000100
0012F9EC??? 00000000
0012F9F0??? 0117CD16?? ASCII "鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿 鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿 鉿鉿?...
0012F9F4??? 00000041
恩,這里,出現(xiàn)41了。41=VK_A.是的,PACH這個(gè)點(diǎn),我們就能記錄[某著名IM軟件]的密碼了。
這里,給出看見點(diǎn)的特征碼8b4dfc8b512433c08a02
接下來,我們寫個(gè)程序,pach之。
總結(jié):
[某著名IM軟件],的保護(hù),比起之前NP保護(hù),各有長短。去看,還是能破的。
稍后,提交PACH代碼。和關(guān)于[某著名IM軟件]的一些其它特性。
?
?