OllyDbg 使用筆記 (七)
OllyDbg 使用筆記 (七)
參考
書:《加密與解密》
視頻:小甲魚 解密系列 視頻
演示樣例程序下載:http://pan.baidu.com/s/1gvwlS
暴力破解
觀察這個程序。能夠從程序標題的<unregistered 個跟 About 中的 <Unregistered Version>入手
用OD打開程序。右鍵-->查找-->全部參考文本字串
圖片1
在打開的界面中。將滾動欄移到追上面(由於是從光標處開始搜索的),右鍵查找文本,先搜索<unregistered
圖片2
雙擊找到的文本到代碼處。
005CC81B . E8 9C5FEDFF call 004A27BC 005CC820 . A1 8CEB6000 mov eax, dword ptr [60EB8C] 005CC825 . 8038 00 cmp byte ptr [eax], 0 005CC828 . 0F85 07010000 jnz 005CC935 005CC82E . A1 DCF16000 mov eax, dword ptr [60F1DC] 005CC833 . 8038 00 cmp byte ptr [eax], 0 005CC836 . 0F85 F9000000 jnz 005CC935 005CC83C . 68 70CB5C00 push 005CCB70 ; ASCII "PC Surgeon <unregistered - " 005CC841 . D905 3CCA5C00 fld dword ptr [5CCA3C] 005CC847 . A1 8CEC6000 mov eax, dword ptr [60EC8C] 005CC84C . DC20 fsub qword ptr [eax] 005CC84E . 83C4 F4 add esp, -0C 005CC851 . DB3C24 fstp tbyte ptr [esp] 005CC854 . 9B wait
細致查看。前面的跳轉,能夠發現 jnz 005CC935 非常關鍵。在前面一個jnz 005CC935處下斷點,又一次執行程序,發現第這兩個jnz 005CC935 未跳轉。
把第一個cmp byte ptr [eax], 0 改成 cmp byte ptr [eax], 1 使跳轉實現。
依照相同的方法,搜索<Unregistered Version>,跟改跳轉實現。就可以破解程序。
其它方法
再來看看這段代碼:
005CC811 . E8 12B9E6FF call <jmp.&shell32.ShellExecuteA> ; \ShellExecuteA 005CC816 > B8 58CB5C00 mov eax, 005CCB58 ; ASCII "Show: splash" 005CC81B . E8 9C5FEDFF call 004A27BC 005CC820 . A1 8CEB6000 mov eax, dword ptr [60EB8C] 005CC825 . 8038 00 cmp byte ptr [eax], 0 005CC828 . 0F85 07010000 jnz 005CC935 005CC82E . A1 DCF16000 mov eax, dword ptr [60F1DC] 005CC833 8038 00 cmp byte ptr [eax], 0 005CC836 0F85 F9000000 jnz 005CC935 005CC83C . 68 70CB5C00 push 005CCB70 ; ASCII "PC Surgeon <unregistered - " 005CC841 . D905 3CCA5C00 fld dword ptr [5CCA3C] 005CC847 . A1 8CEC6000 mov eax, dword ptr [60EC8C] 005CC84C . DC20 fsub qword ptr [eax] 005CC84E . 83C4 F4 add esp, -0C 005CC851 . DB3C24 fstp tbyte ptr [esp] 005CC854 . 9B wait
這裏有兩個jnz 005CC935 。推斷分別推斷[[60EB8C]] 跟 [[60F1DC]] 是否為0。 從 fld dword ptr [5CCA3C] 能夠發現[5CCA3C]中是15.0 即試用天數。
細致分析能夠發現第一個jnz為推斷是否正常,第二個為推斷是否超過15天使用期。
所以[[60EB8C]]的值很關鍵。
要找出改[[60EB8C]]的值的地方。
選中mov eax, dword ptr [60EB8C] , 右鍵-->查找參考-->地址常量。就可以列出全部使用了這個地址的命令的位置。
圖片3
在此窗體右鍵-->在每一個命令上設置斷點。又一次執行程序。
圖片4
按F9,來到此處:
005C2BF6 . 8B15 8CEB6000 mov edx, dword ptr [60EB8C] ; pcsurgeo.00610C4A 005C2BFC . 8802 mov byte ptr [edx], al 005C2BFE . A1 8CEB6000 mov eax, dword ptr [60EB8C] 005C2C03 . 8038 00 cmp byte ptr [eax], 0 005C2C06 . 75 0D jnz short 005C2C15 005C2C08 . E8 6307EEFF call 004A3370 005C2C0D . A1 8CEC6000 mov eax, dword ptr [60EC8C] 005C2C12 . DD18 fstp qword ptr [eax] 005C2C14 . 9B wait
看到 mov byte ptr [edx], al 正是給[[60EB8C]] 賦值的地方,把它改成 mov byte ptr [edx], 1。就可以破解。
(在保存過程中會出現 重定位提示窗體,由於mov byte ptr [edx], al改成mov byte ptr [edx], 1後代碼變多了。要重定位才可能正常執行。這裏能夠先不用管它。)
OllyDbg 使用筆記 (七)