[某著名IM軟件]輸入密碼-[XXSafeEdit]-保護破釋分析2008-12-16 07:41【破文標題】[某著名IM軟件]輸入密碼-[XXSafeEdit]-保護破釋分析
【對 象】初入門的新手
【下載地址】www.xx.com
【破解工具】OD
【保護方式】消息加密保護
【任 務】找出原始消息記錄觸發點
【破文作者】thomasyzh
【組 織】沒有
【破解聲明】這篇破文圖的是速度,和解決問題---沒有更加多的深入分析保護方式-總共12小時,3天,每天4小時
【備 注】老手勿看,別浪費你的時間
【電 郵】machinesy@163.com
【破解過程】
首先,要知道其對于密碼的保護方式。其用鍵盤記錄精靈等驅動級記錄失效果。以及在內存中無法找到明文輸入。
具體測試過程如下:
1。使用鍵盤記錄精靈記錄你要輸入的密碼。
測試結果。得到的并非自己輸入的。
2。使用WinHex等工具,直接內存中搜索你輸入的明文字符串。
測試結果。沒有查找到。
有了如上兩點后,我們開發分析其保護方式,首先要確定其是驅動級保護,還是非驅動級保護。
于是使用OD,打開。載入c。
F2。下斷Kernel32->CreateFile.
這里大概提提R3進R0的幾種方式。
.最為常規的驅動通信采用CreateFile,和DeviceIoContral.其次,還有中斷門,陷阱門等手法。(具體參見看雪rootkit學習)
由于XX是大型應用程序軟件,從軟件設計的角度上來考慮,其基本上不可能去掛接中斷門,等硬件很底層的東西,因為,這樣做的話會造成他們的軟件茁壯性非常低。
所以這里我只考慮了CreateFile.
這時候我們讓程序跑起來,看其會訪問什么驅動。
在CreateFile,后并沒有發現其訪問什么驅動。所以我認為。XX的保護,并非驅動級了。
這時候我們再來分析r3下的用戶鍵盤輸入。
這里提一下R3下用戶鍵盤輸入的幾種可能:
1。如果是一個窗口程序,會觸發WM_KEYDOWN.這個消息.
2。如果是控制臺程序,會向基本輸入流里寫入一個字符.
3。如果是Dx,或者其它非主流應用程序的API,或者涉及到com相關技術的東西,大概其會把輸入放入到一個Buffer里。
下面談談R3下取EDIT里字符的方法。既然是Edit,就一定是窗口程序了。所以不涉及到程序情況2(控制臺程序)。
一般情況下,寫程序的人會用GetWindowText,或者GetDlgItemText取窗口上輸入的字符。也有可能在WM_KEYDOWN時就把字符,放如Buffer,而不使用這兩個函數。在com和dx里,其一定是放入Buffer里.大概就這兩種情況。
1。根據特點,我們首先測試GetWindowText這個函數。
測試結果:好的,發現沒有使用。
2.根據直接放到Buffer這種情況,直接下XP下的萬能斷點。
測試結果:是的,它沒有走到萬難斷點這里,又或者是對那個斷點進行保護。
------這里提一提,對于XX游戲,下萬難斷點,是能夠取到密碼輸入的。
至于萬能斷點在哪里,可以查看看雪工具下載。里邊有提供工具。
這時候,我們就只能從消息入手了。畢竟是窗口程序,消息循環是絕對存在的。
這里提提,對消息掛接的幾種方式。
1。SetWindowHook.----消息鉤子。
2。SetWindowLong.----這個函數,主要用于窗口子類化。
-----這里我們先不著急,分析其消息鉤子,先對于SetWindowLong函數下端。(由于XX窗口,會做的漂亮點,通常會使用SetWindowLong函數)
這里我們要找到那個Edit窗口具體是什么窗口,找窗口有很多工具的,就不具體談了。
[XXSafeEdit]是其密碼輸入保護的主要模塊。那么我們先在LoadLibrary下點。大概會斷在這里:
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]的時候會在這里。這里其Load模塊之后,會取出一Get出一個函數,然后創建一個XXX,我們就不逆,有時間在逆。
逆完之后,完全可以模仿出一個他那個模塊的行為然后再XXX。或者XXX。
在[XXSafeEdit]?? Load之后,我們下SetWindowLong函數斷。
然后觀察棧的窗口數據,大概到這里
0012ECA4??? 00ED2E0C?? /CALL 到 SetWindowLongA 來自 TSSafeEd.00ED2E09
0012ECA8??? 00020994?? |hWnd = 00020994 ('Q',class='Edit',parent=0004099A)
0012ECAC??? FFFFFFFC?? |Index = GWL_WNDPROC
0012ECB0??? 00ED283F?? \NewValue = ED283F
好的...這個SetWindowLong,來自SafeEdit.窗口正是我們開始用XXX找到的密碼輸入窗口,GWL_WNDPROC代表NewValue是一個新的窗口消息處理過程。那么地址就是ED283F。
這時候,我們就去ED283F,下條件斷點,大概判斷是什么消息。當是WM_KEYDOWN的時候,我們就斷下來。
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了。當WM_KEYDOWN的時候,我們就能取得用戶按的鍵了,具體是WM_KEYDOWN觸發時的LPARAM.里邊保存的是VK數據。
這里給出VK數據值。
出自VC6。頭文件。41是a怎么怎么的。
這時候我們發現,我們的WM_KEYDOWN是亂碼。也就是說,我們取的WM_KEYDOWN并非我們真實按下的鍵盤。
因為,我們按A的時候,每一次得到的都是不一樣的數據。
好的,我們來分析下它是雜個讓WM_KEYDWON..在消息下變化的。
在WIN32 R3下有一組鍵盤操作函數:
大概是下邊這些:
具體參考SDK,在MapVirtualKeyA下斷點。我們可以發現。
0012F968??? 00ED54D3?? /CALL 到 MapVirtualKeyA 來自 TSSafeEd.00ED54CD
0012F96C??? 00000032?? |Key = 32
0012F970??? 00000000?? \Action = 0
0012F974??? 00000113
0012F978??? 00000000
0012F97C??? 00000113
[XXSafeEdit]在不停的調用這個,這個函數,這時候,我們就對其下條件斷點進行中斷條件過濾。直到我們按下的時候,我們才讓它斷下來。
我們按下的時候,斷下來的棧大概是這樣:
0012F9DC??? 0108D16A?? /CALL 到 MapVirtualKeyA 來自 0108D167
0012F9E0??? 00000054?? |Key = 54
0012F9E4??? 00000000?? \Action = 0
0012F9E8??? 00000100
0012F9EC??? 00000000
好的,我們發現,它不是跳到[XXSafeEdit]模塊里了,而是0108d167這個位置了。于是,我們就到那里去。
我們在那個點下斷。
這里,大膽做個猜測,對于加密這個理論,一定是針對于明文的。那么在密文之前的某一時刻,一定是存在明文的。
那么,我們就繼續向這段代碼之前的代碼跟蹤。
-------對于這段代碼的用途,和XX SafeEdit的一些其它用途,我就不多說了,讓大家有多點的享受機會,具體自己跟跟。
在這里回朔跟蹤,我們就能找到這個點
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]
好的,我們在那個test之后的,108d0e4處下點,短下后,我們看棧
0012F9E8??? 00000100
0012F9EC??? 00000000
0012F9F0??? 0117CD16?? ASCII "鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿 鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿鉿 鉿鉿?...
0012F9F4??? 00000041
恩,這里,出現41了。41=VK_A.是的,PACH這個點,我們就能記錄[某著名IM軟件]的密碼了。
這里,給出看見點的特征碼8b4dfc8b512433c08a02
接下來,我們寫個程序,pach之。
總結:
[某著名IM軟件],的保護,比起之前NP保護,各有長短。去看,還是能破的。
稍后,提交PACH代碼。和關于[某著名IM軟件]的一些其它特性。
?
?