• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運轉(zhuǎn),開心的工作
            簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            [某著名IM軟件]輸入密碼-[XXSafeEdit]-保護(hù)破釋分析2008-12-16 07:41【破文標(biāo)題】[某著名IM軟件]輸入密碼-[XXSafeEdit]-保護(hù)破釋分析
            【對  象】初入門的新手
            【下載地址】www.xx.com
            【破解工具】OD
            【保護(hù)方式】消息加密保護(hù)
            【任  務(wù)】找出原始消息記錄觸發(fā)點
            【破文作者】thomasyzh
            【組  織】沒有
            【破解聲明】這篇破文圖的是速度,和解決問題---沒有更加多的深入分析保護(hù)方式-總共12小時,3天,每天4小時
            【備  注】老手勿看,別浪費你的時間
            【電  郵】machinesy@163.com
            【破解過程】

            首先,要知道其對于密碼的保護(hù)方式。其用鍵盤記錄精靈等驅(qū)動級記錄失效果。以及在內(nèi)存中無法找到明文輸入。

            具體測試過程如下:
            1。使用鍵盤記錄精靈記錄你要輸入的密碼。

            測試結(jié)果。得到的并非自己輸入的。

            2。使用WinHex等工具,直接內(nèi)存中搜索你輸入的明文字符串。

            測試結(jié)果。沒有查找到。

            有了如上兩點后,我們開發(fā)分析其保護(hù)方式,首先要確定其是驅(qū)動級保護(hù),還是非驅(qū)動級保護(hù)。


            于是使用OD,打開。載入c。

            F2。下斷Kernel32->CreateFile.

            這里大概提提R3進(jìn)R0的幾種方式。

            .最為常規(guī)的驅(qū)動通信采用CreateFile,和DeviceIoContral.其次,還有中斷門,陷阱門等手法。(具體參見看雪rootkit學(xué)習(xí))

            由于XX是大型應(yīng)用程序軟件,從軟件設(shè)計的角度上來考慮,其基本上不可能去掛接中斷門,等硬件很底層的東西,因為,這樣做的話會造成他們的軟件茁壯性非常低。

            所以這里我只考慮了CreateFile.

            這時候我們讓程序跑起來,看其會訪問什么驅(qū)動。

            在CreateFile,后并沒有發(fā)現(xiàn)其訪問什么驅(qū)動。所以我認(rèn)為。XX的保護(hù),并非驅(qū)動級了。


            這時候我們再來分析r3下的用戶鍵盤輸入。

            這里提一下R3下用戶鍵盤輸入的幾種可能:
            1。如果是一個窗口程序,會觸發(fā)WM_KEYDOWN.這個消息.
            2。如果是控制臺程序,會向基本輸入流里寫入一個字符.
            3。如果是Dx,或者其它非主流應(yīng)用程序的API,或者涉及到com相關(guān)技術(shù)的東西,大概其會把輸入放入到一個Buffer里。

            下面談?wù)凴3下取EDIT里字符的方法。既然是Edit,就一定是窗口程序了。所以不涉及到程序情況2(控制臺程序)。

            一般情況下,寫程序的人會用GetWindowText,或者GetDlgItemText取窗口上輸入的字符。也有可能在WM_KEYDOWN時就把字符,放如Buffer,而不使用這兩個函數(shù)。在com和dx里,其一定是放入Buffer里.大概就這兩種情況。

            1。根據(jù)特點,我們首先測試GetWindowText這個函數(shù)。

            測試結(jié)果:好的,發(fā)現(xiàn)沒有使用。

            2.根據(jù)直接放到Buffer這種情況,直接下XP下的萬能斷點。

            測試結(jié)果:是的,它沒有走到萬難斷點這里,又或者是對那個斷點進(jìn)行保護(hù)。

            ------這里提一提,對于XX游戲,下萬難斷點,是能夠取到密碼輸入的。

            至于萬能斷點在哪里,可以查看看雪工具下載。里邊有提供工具。


            這時候,我們就只能從消息入手了。畢竟是窗口程序,消息循環(huán)是絕對存在的。

            這里提提,對消息掛接的幾種方式。
            1。SetWindowHook.----消息鉤子。
            2。SetWindowLong.----這個函數(shù),主要用于窗口子類化。

            -----這里我們先不著急,分析其消息鉤子,先對于SetWindowLong函數(shù)下端。(由于XX窗口,會做的漂亮點,通常會使用SetWindowLong函數(shù))

            這里我們要找到那個Edit窗口具體是什么窗口,找窗口有很多工具的,就不具體談了。

            [XXSafeEdit]是其密碼輸入保護(hù)的主要模塊。那么我們先在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出一個函數(shù),然后創(chuàng)建一個XXX,我們就不逆,有時間在逆。

            逆完之后,完全可以模仿出一個他那個模塊的行為然后再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


            好的...這個SetWindowLong,來自SafeEdit.窗口正是我們開始用XXX找到的密碼輸入窗口,GWL_WNDPROC代表NewValue是一個新的窗口消息處理過程。那么地址就是ED283F。


            這時候,我們就去ED283F,下條件斷點,大概判斷是什么消息。當(dāng)是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了。當(dāng)WM_KEYDOWN的時候,我們就能取得用戶按的鍵了,具體是WM_KEYDOWN觸發(fā)時的LPARAM.里邊保存的是VK數(shù)據(jù)。

            這里給出VK數(shù)據(jù)值。

            出自VC6。頭文件。41是a怎么怎么的。

            這時候我們發(fā)現(xiàn),我們的WM_KEYDOWN是亂碼。也就是說,我們?nèi)〉腤M_KEYDOWN并非我們真實按下的鍵盤。

            因為,我們按A的時候,每一次得到的都是不一樣的數(shù)據(jù)。

            好的,我們來分析下它是雜個讓W(xué)M_KEYDWON..在消息下變化的。

            在WIN32 R3下有一組鍵盤操作函數(shù):

            大概是下邊這些:

            具體參考SDK,在MapVirtualKeyA下斷點。我們可以發(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)用這個,這個函數(shù),這時候,我們就對其下條件斷點進(jìn)行中斷條件過濾。直到我們按下的時候,我們才讓它斷下來。

            我們按下的時候,斷下來的棧大概是這樣:
            0012F9DC??? 0108D16A?? /CALL 到 MapVirtualKeyA 來自 0108D167
            0012F9E0??? 00000054?? |Key = 54
            0012F9E4??? 00000000?? \Action = 0
            0012F9E8??? 00000100
            0012F9EC??? 00000000


            好的,我們發(fā)現(xiàn),它不是跳到[XXSafeEdit]模塊里了,而是0108d167這個位置了。于是,我們就到那里去。

            我們在那個點下斷。

            這里,大膽做個猜測,對于加密這個理論,一定是針對于明文的。那么在密文之前的某一時刻,一定是存在明文的。

            那么,我們就繼續(xù)向這段代碼之前的代碼跟蹤。

            -------對于這段代碼的用途,和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

            恩,這里,出現(xiàn)41了。41=VK_A.是的,PACH這個點,我們就能記錄[某著名IM軟件]的密碼了。

            這里,給出看見點的特征碼8b4dfc8b512433c08a02

            接下來,我們寫個程序,pach之。

            總結(jié):

            [某著名IM軟件],的保護(hù),比起之前NP保護(hù),各有長短。去看,還是能破的。

            稍后,提交PACH代碼。和關(guān)于[某著名IM軟件]的一些其它特性。
            ?

            ?

            久久精品国产72国产精福利| 亚洲国产成人久久综合野外| 国产精品99久久久久久人| 久久亚洲欧美国产精品| 精品久久一区二区三区| 国内精品久久久久久不卡影院| 久久天天日天天操综合伊人av| yy6080久久| 91精品国产综合久久久久久| 久久伊人影视| 久久久久人妻精品一区二区三区| 久久综合九色综合精品| 香蕉久久影院| 久久精品这里热有精品| 2021国产精品久久精品| 嫩草影院久久99| 欧美噜噜久久久XXX| 久久久艹| 人妻丰满AV无码久久不卡| 久久精品无码av| 97热久久免费频精品99| 伊人久久精品影院| 青青青国产精品国产精品久久久久 | 精品久久8x国产免费观看| 国产伊人久久| 久久亚洲精品视频| 少妇高潮惨叫久久久久久| 综合久久久久久中文字幕亚洲国产国产综合一区首| 亚洲午夜久久久久久久久久| 久久久久久一区国产精品| 亚洲成人精品久久| 99久久免费国产特黄| 亚洲狠狠婷婷综合久久久久| 性高湖久久久久久久久AAAAA| 久久93精品国产91久久综合| 久久精品国产99久久无毒不卡 | 一本伊大人香蕉久久网手机| 久久精品中文闷骚内射| 亚洲精品无码久久千人斩| 久久久久av无码免费网| 精品国产乱码久久久久软件|