




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、 第二十八章-Visual Basic程序的破解-Part3破解VB程序的又一手法本章我們的實現(xiàn)對象是CrackMe2。運行起來我們可以看到一個NAG窗口,通過上一章4C法我們可以很容易的剔除掉這個NAG窗口,其中與序列號相關的一部分涉及到了PCODE,等我們介紹到了PCODE的時候再來討論。要找到這個CrackMe的序列號很簡單,關鍵是如何剔除這個NAG窗口,通過4C法我們可以輕松的剔除掉NAG窗口,這里我就不再贅述了,大家可以自行嘗試。這里我們來介紹另外一種方式。首先我們來看看正確的序列號是多少。我們單擊Register按鈕。出現(xiàn)了注冊窗口,我們隨便輸入一個錯誤的序列號。首先我們來看看是否
2、是用_vbaStrCmp這個函數(shù)來進行字符串比較的。我們在命令欄中輸入bp _vbaStrCmp。接著按F9鍵運行起來,我們會發(fā)現(xiàn)會斷下來很多次,所以我們可以換種思路,從錯誤提示入手,看看能不能在彈出錯誤提示框的時候斷下來,那么序列號的比較應該就在附近了?,F(xiàn)在我們刪除剛剛對_vbaStrCmp設置的斷點,然后給彈出消息框的函數(shù)rtcMsgBox設置斷點。我們在命令欄中輸入bp rtcMsgBox。我們單擊OK按鈕。斷在了rtcMsgBox的入口處。我猜是提示輸入的序列號錯誤。我們來到堆棧窗口看看調(diào)用來至于哪里。我們在反匯編窗口中定位到該返回地址處。好了,現(xiàn)在我們來到返回地址處,我們看看前面幾行
3、有沒有調(diào)用字符串比較之類的API函數(shù)。我們可以看到前面的確有進行字符串比較的API函數(shù),我們給這處調(diào)用設置一個斷點,我們按F9鍵運行起來,驗證一下該處是不是我們要找的。斷了下來,我們可以看到正在進行字符串的比較,其中一個是我們輸入的錯誤序列號。另一個我這里是4887649,我們刪除之前的斷點,在注冊窗口中輸入這個字符串看看是否是正確的序列號。我們可以看到的確是正確的序列號。接下來,我們來嘗試剔除這個NAG窗口。由于我們可能需要修改這個CrackMe,所以我們需要給這個CrackMe的代碼段賦予寫權限,我們首先在數(shù)據(jù)窗口中定位400000地址處。我們切換為PE header模式顯示。往下我們可以
4、看到PE Signature標志,我們繼續(xù)往下定位到第一個區(qū)段。這里我們可以看到Characteristics字段,我們將為其修改為E0000020的話,就可以寫入代碼段了。好了,現(xiàn)在我們將剛剛所做的修改保存到文件。另存為CrackMeA.exe我們用olly_parcheado_para_vb這個Patch過的OD來加載這個CrackMeA。接著給代碼段設置內(nèi)存訪問斷點(實際上是內(nèi)存執(zhí)行斷點)。我們多按幾次F9鍵運行起來就可以來到這里。我們繼續(xù)按F9鍵運行,停在了熟悉的多分支處,將會轉(zhuǎn)向去執(zhí)行程序的不同部分。第一次,停在了407710處,將JMP到40BD80地址處-程序?qū)?zhí)行的第一部分,我
5、們來看看再次停在其他JMP分支之前會不會彈出NAG窗口,我們刪除之前設置的內(nèi)存訪問斷點,接著給該多分支的各個JMP指令處都設置斷點。我們來看看斷在其他JMP指令之前會不會彈出NAG窗口,運行起來。我們可以看到斷在了407759處,將跳轉(zhuǎn)到40C470處,并沒有彈出NAG窗口,我們繼續(xù)運行。彈出了NAG窗口,說明是在40C470這個分支中彈出的NAG窗口,我們單擊Register按鈕。斷在了第二個JMP處,所以說NAG是在跳轉(zhuǎn)到40BDF0之前彈出的,我們直接跳過NAG窗口。我們將407759處的JMP 40C4F0修改為JMP 40BDF0看看會發(fā)生什么。我們保存到修改到文件,然后直接運行起來
6、。我們可以看到剛剛做的修改并沒有剔除掉NAG窗口,但是原本是需要我們單擊NAG窗口的Register按鈕才會彈出注冊窗口的,現(xiàn)在是NAG窗口和注冊窗口一起彈了出來。我們剛剛修改JMP指令并沒有完全解決問題,別無選擇了,我們只能修改VB的DLL的,很多人說我們不能修改系統(tǒng)庫文件,會導致其他程序不能用的,實際上我們可以將VB的庫文件拷貝至跟待破解的目標文件同一個目錄即可,那么修改了的VB庫文件只會的當前文件夾的目標文件起作用,操作系統(tǒng)里的其他應用程序還是會繼續(xù)使用system32目錄下的VB 庫文件,兩者不會沖突。那么我們需要拷貝那個VB庫文件呢?我們到system32目錄下拷貝MSVBVM60.
7、dll這個文件。首先將CrackMeA做個備份。目標文件如果需要加載特定的庫文件的話,首先會搜索當前目錄下有沒有,如果當前目錄下面有就直接加載,如果當期目錄下面沒有,就會繼續(xù)前往system32目錄下搜索,我們當前就是這種情況。我們用OllyDbg加載該CrackMeA,這里我們使用原版的OllyDbg,因為Patch過的那個OD添加代碼有時候會失敗。我們單擊工具欄中E按鈕打開模塊列表窗口,看看是加載的當前目錄下的MSVBVM60.dll還是system32下的。我們可以看到加載是當前目錄下的MSVBVM60.dll。好了,現(xiàn)在我們需要確保對MSVBVM60.dll的代碼段有寫權限,我們做如下
8、操作:我們打開一個OD然后單擊菜單欄中Open選項。默認顯示的exe文件,我們將文件類型改為DLL。將下拉選項選中Dynamic-Link library(*.dll)就能打開DLL文件了,我們打開MSVBVM60.dll。我們停在了該動態(tài)庫的入口點處?,F(xiàn)在我們定位該動態(tài)庫的頭部(并不是像定位CrackMeA的頭部那樣直接定位到400000地址處),我們來看看加載了哪些模塊,以及映像基址是多少。我們單擊工具欄中的E按鈕。我這里MSVBVM60.dll的基地址是66000000。可能跟你機器上的不一樣。我們在數(shù)據(jù)窗口中定位到這個地址。定位到頭部以后我們切換到PE header模式顯示,接著往下拉
9、到.text區(qū)段。將Characteristics字段的值修改為E0000020,讓代碼段具有寫權限。保存修改到文件。這里我們不重命名,因為重命名后CrackMe就不會加載了。我們用Patch過的OllyDbg加載CrackMeA,由于注冊窗口和NAG窗口是一起彈出來的,所以我們給創(chuàng)建窗口的API函數(shù)CreateWindowExA設置一個斷點。運行起來。由于會創(chuàng)建子窗口所以會斷下來幾次,我多按F9鍵幾次,直到創(chuàng)建NAG窗口為止。判斷是否是創(chuàng)建NAG窗口很簡單,根據(jù)窗口標題名就可以很容易的看出來??梢钥吹浆F(xiàn)在正在創(chuàng)建NAG窗口,我們將其窗口風格值修改為40000000(子窗口風格),看看會發(fā)生什
10、么。我們可以看到已經(jīng)將窗口風格修改為WS_CHILD,你可以嘗試輸入不同的值,現(xiàn)在我們可以刪除所有斷點運行起來。我們可以看到只彈出了一個注冊窗口,并沒有彈出NAG窗口。如果不修改MSVBVM60.dll想要剔除這個NAG窗口就很復雜了,我們手工從系統(tǒng)目錄復制一個MSVBVM60.dll將其置于與目標程序同一目錄,通過修改這個文件并不會影響到其他應用程序,嘿嘿。好了,我們重復之前的步驟,依然還是先給CreateWindowExA這個函數(shù)設置一個斷點。從堆棧中的信息我們可以看出調(diào)用來至于MSVBVM60.DLL,我們定位到調(diào)用處。我們清除掉CreateWindowExA入口處的斷點,接著給6605
11、A8D8處的CALL CreateWindowExA設置一個斷點。我們重新啟動程序,接著運行起來。斷了下來,我們看看堆棧的情況。我們可以看到第一次斷下來就是創(chuàng)建的NAG窗口,可能其他窗口的創(chuàng)建是其他地方調(diào)用的CreateWindowExA。更加不幸的是,注冊窗口的創(chuàng)建的也是調(diào)用的此處。現(xiàn)在我們需要找到一塊空閑的區(qū)域?qū)懭隞MP地址,我們會發(fā)現(xiàn)代碼段的最后有一塊空閑的區(qū)域。在我的機器上,這塊空閑的區(qū)域在代碼段的最后,我們可以看到很多零,首先我們來驗證一下看看這塊區(qū)域是否可用。我們在這塊區(qū)域上單擊鼠標右鍵選擇-View-Executable file。我們可以看到準備保存到exe中的區(qū)域。好了,可以
12、看到該空閑區(qū)域是在文件中是存在的,我們現(xiàn)在可以插入代碼了。如果我們不檢查的話,很可能所插入的代碼不能保存到文件,因為可能這部分零只存在于內(nèi)存中,并不是可執(zhí)行文件的一部分。(我們在后面講到脫殼的時候會詳細解釋)首先我們將6605A8D8處的CALL CreateWindowExA修改為JMP 660FC500(你的機器上這個地址由你來選定),讓其跳往剛剛的空閑區(qū)域。這里我們構造一個間接跳轉(zhuǎn),這樣能夠確保跟之前的CALL CreateWindowExA指令一樣長,這樣就不至于修改到后面MOV EDI,EAX等指令,代碼也就能正常的執(zhí)行。如果覆蓋了MOV EDI,EAX的任何一個字節(jié)的話,調(diào)用下面空
13、白區(qū)域的代碼返回接著執(zhí)行,可能會出錯。我們將660FC500這個空閑區(qū)域的地址保存到660FC400內(nèi)存單元中,這樣JMP 660FC400跟JMP 660FC500就是等效的了。我們在660FC400內(nèi)存單元中寫入660FC500-我們將植入代碼的首地址。我們接著來看看堆棧中給CreateWindowExA傳入的參數(shù),如窗口名稱。我們必須確保第一次調(diào)用的時候存在這個名稱,因為有時候調(diào)用,窗口名稱是為空的,如果我們不做檢查的話,就會出錯。我們在堆棧地址上雙擊將顯示方式切換為偏移形式。這說明ESP+8處保存的是窗口名稱的首地址,我們將其保存到EAX寄存器中。我們單步跟蹤到660FC500處,看看
14、具體的細節(jié)。我們按F8單步,可以看到窗口名稱的首地址被保存到了EAX中?,F(xiàn)在EAX中保存了窗口名稱的首地址,接著我們在下一行中檢查EAX是否為零,如果為零說明該窗口可能沒有標題名稱。這里如果EAX為零,就不需要修改窗口的樣式了,繼續(xù)調(diào)用CreateWindowExA即可。如果EAX不為零,則需要做進一步的判斷。這里我們判斷窗口標題名稱的前4個字節(jié)是否為756F7243(也就是NAG窗口標題Crouz CrackMe-1 : Setup的前4個字節(jié))。這里如果判斷出的確是NAG窗口,那么繼續(xù)往下執(zhí)行修改窗口樣式,如果不是NAG窗口的話,就不修改窗口樣式,直接調(diào)用CALL CreateWindow
15、ExA。這里我們可以看到如果不是NAG窗口的標題的話,就直接跳轉(zhuǎn)到CALL CreateWindowExA處,并不修改窗口樣式。如果是NAG窗口的話,就將ESP + C指向的窗口樣式參數(shù)值修改為40000000(子窗口樣式)。當我們執(zhí)行到這一行可以看到調(diào)用是CreateWindowExA,我們來看看參數(shù)情況:我們可以看到ESP + C指向的窗口樣式參數(shù)值被修改為了40000000即WS_CHILD。接下來我們調(diào)用CreateWindowExA了,我們需要知道CreateWindowExA的入口地址,好的,那么我們來看看原先的調(diào)用是怎樣的。我們可以看到這是一個間接調(diào)用,它是讀取660014E8內(nèi)存單元中的值然后再調(diào)用的,實際上就是:CALL 660014E8OD的提示窗口中會提示CreateWindowExA的實際入口地址是多少,那么這里為什么要使用間接調(diào)用呢?是為了能夠在任何一個機器上都能運行,我們在后面脫殼章節(jié)中介紹IAT的時候會更深入的解釋。調(diào)用完CreateWindowExA以后我們已經(jīng)返回到原來的下一行處繼續(xù)執(zhí)行MOV EDI,EAX。接著我們運行起來。我們可以看到只彈出了注冊
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 江西師范大學科學技術學院《系統(tǒng)分析與建?!?023-2024學年第二學期期末試卷
- 河南經(jīng)貿(mào)職業(yè)學院《近現(xiàn)代建筑遺產(chǎn)保護》2023-2024學年第二學期期末試卷
- 遼寧石油化工大學《項目可行性研究》2023-2024學年第二學期期末試卷
- 株洲師范高等??茖W?!渡鐣kU基金管理》2023-2024學年第二學期期末試卷
- Unit 5 Reading-writing教學設計 2024-2025學年滬教版(五四學制)(2024)七年級英語上冊
- 重慶文化藝術職業(yè)學院《智能芯片與系統(tǒng)設計》2023-2024學年第二學期期末試卷
- 上饒師范學院《食品微生物學》2023-2024學年第二學期期末試卷
- 山東經(jīng)貿(mào)職業(yè)學院《微機原理及單片機應用》2023-2024學年第二學期期末試卷
- 遂寧職業(yè)學院《設計心理學》2023-2024學年第二學期期末試卷
- 河北交通職業(yè)技術學院《鐵路運輸設備》2023-2024學年第二學期期末試卷
- 2023年新高考(新課標)全國2卷數(shù)學試題真題(含答案解析)
- 幼兒園中班藝術課《臺布的設計》課件
- 宮頸疾病診療流程
- HYT 0314-2021 海水入侵監(jiān)測與評價技術規(guī)程
- 油漆使用登記記錄表
- 農(nóng)田雜草的調(diào)查
- 【知識點提綱】新教材-人教版高中化學必修第一冊全冊各章節(jié)知識點考點重點難點提煉匯總
- 上海小弄堂-電子小報
- 軌道交通安全專題培訓
- 物理化學完整版答案
- 節(jié)流孔板孔徑計算
評論
0/150
提交評論