目錄 一、MessageBox.exe修改程序標題內(nèi)容——修改函數(shù)傳入值 二、TraceMe.exe暴力破解程序登陸界面——搜索函數(shù)、尋找附近調(diào)用取值的地方 三、reverseMe.exe暴力破解/打補丁實現(xiàn)注冊——分析文件結(jié)構(gòu) 逆向注冊文件 3.修改文件PE結(jié)構(gòu)入口AddressOfEntryPoint 六、pixtopianbook破解功能限制——定位至引用彈出NAG窗口的地址、搜索字符串改變值 2.搜索字符串改變UNREGISTERED VERSION字符串 七、pcsurgeon.exe搜索字符串找到調(diào)用 2.查找地址常量 https://blog.csdn.net/wlswls1711/article/details/97145997 一點鋪墊:基礎(chǔ)知識1.匯編語言EBP:主要是用于棧和棧幀。 ESP:指向當(dāng)前進程的??臻g地址。 EIP:總是指向下一條要被執(zhí)行的指令。 2.NAG窗口nag本意是煩人的意思,nag窗口是軟件設(shè)計者用來時不時提醒用戶購買正版的警告窗口。一般nag在程序啟動或退出的時候彈出來,或者在程序運行的某個時刻突然蹦出來嚇你一跳。 3.SEHSEH(Structured Exception Handling),即結(jié)構(gòu)化異常處理。 SEH是Windows操作系統(tǒng)提供的功能,跟開發(fā)工具無關(guān)。 Windows程序設(shè)計中最重要的理念就是消息傳遞,事件驅(qū)動。 當(dāng)GUI應(yīng)用程序觸發(fā)一個消息時,系統(tǒng)將把該消息放入消息隊列,然后去查找并調(diào)用窗體的消息處理函數(shù)(CALLBACK),傳遞的參數(shù)當(dāng)然就是這個消息。 我們同樣可以把異常也當(dāng)作是一種消息,應(yīng)用程序發(fā)生異常時就觸發(fā)了該消息并告知系統(tǒng)。 系統(tǒng)接收后同樣會找它的“回調(diào)函數(shù)”,也就是我們的異常處理例程。 當(dāng)然,如果我們在程序中沒有做異常處理的話,系統(tǒng)也不會置之不理,它將彈出我們常見的應(yīng)用程序錯誤框,然后結(jié)束該程序。 所以,當(dāng)我們改變思維方式,以CALLBACK 的思想來看待SEH,SEH 將不再神秘。 4.斷點類型軟件斷點只能斷點程序領(lǐng)空,不能斷點動態(tài)鏈接庫,如果需要斷點動態(tài)鏈接庫,就需要用到硬件斷點。 一、MessageBox.exe修改程序標題內(nèi)容——修改函數(shù)傳入值int WINAPI MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType); 1.找到MessageBox的傳入值 2.修改傳入的lpText值 二、TraceMe.exe暴力破解程序登陸界面——搜索函數(shù)、尋找附近調(diào)用取值的地方(1)使用OD加載程序,搜索分別搜索GetDlgItemTextA、GetDlgItemTextW、GetWindowTextA、GetWindowTextW,搜索到的都下斷點。 (2)運行程序,在程序彈出對話框時,輸入用戶名和系列號,然后按F8單步,在消息窗口觀察哪條語句有我們剛剛輸入的用戶名和系列號。如下圖: (3)找到后,就在這條語句的附件會有校驗和跳轉(zhuǎn)(那個test就是效驗,je就是跳轉(zhuǎn)),我們可以修改效驗結(jié)果,或者直接NOP掉跳轉(zhuǎn)。(我這里直接NOP掉了跳轉(zhuǎn)) 三、reverseMe.exe暴力破解/打補丁實現(xiàn)注冊——分析文件結(jié)構(gòu) 逆向注冊文件首先分析代碼結(jié)構(gòu): 修改跳轉(zhuǎn)條件暴力破解:直接將彈出還未注冊的窗口判斷語句(je,jle,jnz等)更改為nop(不希望它執(zhí)行)或jmp(希望它執(zhí)行),即可實現(xiàn)。 注冊打補?。?/h2>確認程序的邏輯結(jié)構(gòu)。 下了斷點的是程序的大致算法模塊。 四、reverseMe.exe去除NAG窗口——修改跳轉(zhuǎn)條件跳過對話框,使得MessageBox失效:父句柄設(shè)為空白,修改文件PE結(jié)構(gòu)入口AddressOfEntryPoint定位NAG窗口 1.修改跳轉(zhuǎn)條件跳過對話框(2)把程序跑一遍之后我們發(fā)現(xiàn)程序有兩個NAG,一個是在程序界面啟動前出現(xiàn),另一個是在程序關(guān)閉后出現(xiàn)的。如圖所示(紅框里的),運行這兩個call后都會彈出NAG窗口,所以我們判斷NAG窗口就在這里面。如第三講,可以把這兩個call給NOP掉或者在call前面使je跳轉(zhuǎn)實現(xiàn),還有在call前面添加一個jmp跳轉(zhuǎn)跳過這NAG窗口的call。 2.使得MessageBox失效:父句柄設(shè)為空白我們看到NAG窗口它的父窗口是0(也就是沒有父窗口),那么我們就可以創(chuàng)造一個不存在的父窗口給NAG窗口。比如為NAG窗口添加一個句柄為1的父窗口,本來句柄1的父窗口就不存在(也就是相當(dāng)于關(guān)閉了),那么NAG窗口也就不存在了,那么我們就達到了去除NAG窗口目的。 3.修改文件PE結(jié)構(gòu)入口AddressOfEntryPoint(1)把程序載入OD,可以看到AddressOfEntryPoint(入口地址)為00401000,但是我們程序的真正內(nèi)容是在:00401024.前面的是我們要去掉的去除NAG窗口,那么我們?nèi)绻殉绦蛉肟诟臑椋?0401024 就完美的去掉了第一個NAG窗口了。 (2)說干就干,點擊快捷欄的“m”鍵,在彈出窗口中雙擊PE 文件頭,我們就來到內(nèi)存中文件頭的位置了。在這個窗口中,第一欄為地址,第二欄為地址上的二進制數(shù)據(jù),第三欄為方便人類閱讀的代碼(因為內(nèi)存中的二進制數(shù)據(jù)是高地址放后面,底地址放前面,閱讀很不方便),第四欄為注釋。 (3)找到真正的PE頭的偏移地址(000000C0),如圖: (4)根據(jù)偏移地址找到真正的PE頭(004000C0,PE頭會以ASCII的"PE"開頭,也就是50 45),然后就找到程序的入口地址(AddressOfEntryPoint) (5)根據(jù)(4)中得到的程序入口地址在內(nèi)存中的地址(004000E8),那么我們就可以修改入口地址為00401024啦。在數(shù)據(jù)窗口按Ctrl+G輸入004000E8,修改之: (6)保存修改程序,重新載入OD發(fā)現(xiàn)入口地址成功改為00401024了: 五、reverseMe.Oops.exe——PE文件頭!不知道為什么小甲魚不能在編譯器里運行但我卻可以,這里跳過,以后有機會再來看
六、pixtopianbook破解功能限制——定位至引用彈出NAG窗口的地址、搜索字符串改變值1.定位NAG窗口(1)在OD運行彈出的軟件界面試圖添加第5個人,出現(xiàn)錯誤提示box,如下圖 (2)此時在OD中按下暫停(暫停后OD中的地址跳至動態(tài)鏈接庫,即系統(tǒng)領(lǐng)空處),然后按ALT+F9返回到用戶,在用戶界面點擊確定后,OD中就返回到程序接管,地址跳轉(zhuǎn)到下圖的位置: (3)圖中的MessageBoxA就應(yīng)該是剛才的錯誤提示框了,F(xiàn)8到retn,返回到函數(shù)(函數(shù)調(diào)用之后碰到ret返回),如下圖: 注意:ret返回后,在上方又有一個call,說明在此處是間接地調(diào)用messagebox。 2.搜索字符串改變UNREGISTERED VERSION字符串接下來將幾處”unregistered version”字符查找并修改: 方法1:查找所有參考文本字串→查找文本“unregistered version”→跟隨到代碼處,找到在內(nèi)存中的地址→在數(shù)據(jù)窗口中修改保存。 方法2:直接點擊Memory→Ctrl+B查找→修改后記住字符串在內(nèi)存中的地址,到OD的數(shù)據(jù)窗口保存?!窘ㄗh用這種方法】 注意:修改時記得【保持大小】,不然會出錯。 七、VisualSite Designer——定位、硬件斷點1.次數(shù)耗盡之前——定位修改跳轉(zhuǎn)條件一路F8,遇到彈窗就在此處F2下斷,然后重新載入,F(xiàn)9運行到斷點處,消除斷點,繼續(xù)執(zhí)行。 F8,出現(xiàn)彈窗,計數(shù)減一完成,點擊進入程序發(fā)現(xiàn)程序執(zhí)行下一條語句 所以該函數(shù)的作用是顯示歡迎界面,計數(shù)器減一并返回eax==1, 此時我們修改該指令 保存修改,運行,發(fā)現(xiàn)已經(jīng)沒有次數(shù)限制 2.次數(shù)耗盡之后——標志找不同我們用OD載入觀察所有的條件跳轉(zhuǎn)語句,并標志出跳轉(zhuǎn)結(jié)果,等到次數(shù)耗盡之后觀察跳轉(zhuǎn)結(jié)果與是否發(fā)生改變,找到關(guān)鍵跳轉(zhuǎn)點nop。 八、pcsurgeon.exe——搜索字符串找到調(diào)用1.搜索字符串改變<UNREGISTER我們要從紅筆圈出的地方入手。將軟件載入OllyDBG,在代碼界面右鍵——查找——所有參考文本字串,在第一行右鍵——查找文本,查找一部分比如“<unregistered”, 找到后雙擊進入代碼的位置,可以看到代碼的上方有兩個jnz跳轉(zhuǎn),未注冊過的源代碼是不會跳轉(zhuǎn)的,將這個jnz改為jmp,右鍵——復(fù)制到可執(zhí)行文件——右鍵——保存文件為pcsurgeon1.exe,這樣NAG窗口就去掉了 2.查找地址常量 https://blog.csdn.net/wlswls1711/article/details/97145997來到代碼處。鼠標向上滑幾行,可以看到這樣的代碼:
重新運行程序,來到第一個斷點處,有這樣的代碼:
在上面我們知道ds:[0060eb8c]=00610c4a,所以: 這個軟件這樣改是沒有問題,但比較大的軟件這樣改,就可能會影響程序,因為要重定位的東西很多,所以也可以這樣改: 九、MrBills.exe——不斷進入找到判斷注冊的地方1.使用搜尋字串找關(guān)鍵字。
2.嘗試跳過。
3.
4.繼續(xù)分析。 直接將00406FC5 | mov al,bl 改為 mov al,1 即可變?yōu)橛谰米裕?/p> 十、pc2am2p.exe VB語言編寫的程序的特點
十一、查看調(diào)用——追根溯源
十二、Delphi程序編寫的特點 PUSH XXX RETN 達到 CALL XXX的效果
面向事件的編程語言,很多CALL指令
-號返回CALL處
十三/十四、搜索關(guān)鍵函數(shù) 1.查找-》所有模塊間的調(diào)用 2.Alt+N 搜索 |
|