160个Crackme041之无源码修改Delphi程序
文章目錄
- 前言
- 軟件概況
- 分析程序
- 棧回溯分析About點擊事件
- 獲取必要的API
- 添加區段
- 配置區段
- 添加區段數據
- 植入代碼
- 修改目標函數
- 校驗結果
【軟件名稱】:defiler.1.exe
【軟件大小】:287KB
【下載地址】:自行搜索下載
【加殼方式】:無殼
【保護方式】:無保護
【編譯語言】:Delphi
【調試環境】:W7 32
【使用工具】:OD + IDA + Darkde
【破解日期】:2019年5月15日
【破解目的】:純屬興趣
前言
本文參考自吾愛破解論壇zbnysjwsnd8的文章:https://www.52pojie.cn/thread-654237-1-1.html
軟件概況
這個Crackme的要求大概是要我們往Exit菜單中添加代碼,讓程序在點擊Exit菜單時彈出MessageBox框。這個屬于軟件重構的范圍了。
分析程序
使用DarkDe分析程序,這兩個菜單中,只有about是有點擊事件的,Exit菜單是沒有點擊事件。那么我們先從about菜單事件開始分析
棧回溯分析About點擊事件
直接找到About的點擊事件的RVA,在OD中下斷點
about的點擊事件中調用了一個MessageBox,然后直接Ctrl+F9返回
然后找到IDA中對應的代碼
這里就是菜單的響應事件了,然后再次按Ctrl+F9返回
這里是DispatchCommand函數,再往上回溯就是消息循環了,我們直接在0043053B的菜單點擊事件下斷點,點擊About按鈕,F7進入函數
此時ebx的值為about控件的結構體,有about控件相關的字符串
然后再次點擊Exit菜單,F7進入函數
此時ebx的值為Exit控件的結構體,有Exit控件相關的字符串。
那么我們可以根據ebx的不同,植入一段代碼,判斷此時ebx值的情況,如果ebx值有Exit字符串的話,就說明Exit按鈕被點擊,然后執行我們自己的函數,否則繼續執行原有函數。相當于是變相給菜單添加了點擊事件
獲取必要的API
首先需要拿到MessBox和ExitProcess的函數地址,查看導入表
這個程序的導入表已經有這兩個API,那么就不需要手工添加了
添加區段
由于植入的代碼量較多,所以需要添加一個區段。
配置區段
打開LoadPE,加載目標程序,點擊右鍵->添加區段
然后編輯新添加的區段,輸入名稱和虛擬大小以及物理大小即可,點擊保存
添加完成之后如圖,記下新區段的RVA是4E000
添加區段數據
區段雖然添加好了,但真正重要的區段數據還需要插入到文件中,以擴充文件的大小. 因為區段只是一個相當于目錄的存在,如果只有目錄而沒有內容,就會造成一個無效的PE文件.
用010Edit打開目標文件,拉到文件末尾的位置,點擊編輯->插入->插入字節
輸入起始地址和大小,點擊確定 然后保存即可
添加區段后如果文件能正常運行,說明添加成功
植入代碼
接著將程序載入到OD,直接用RVA來到新區段地址處,我這里是4E000,
然后添加如下代碼
0044E000 60 pushad 0044E001 90 nop 0044E002 FF73 08 push dword ptr [ebx+0x8] 0044E005 68 87E04400 push 0044E087 ; ASCII "Exit1" 0044E00A E8 28000000 call 0044E037 0044E00F 85C0 test eax, eax 0044E011 74 1B je short 0044E02E 0044E013 FF73 24 push dword ptr [ebx+0x24] 0044E016 68 8DE04400 push 0044E08D ; ASCII "&Exit" 0044E01B E8 17000000 call 0044E037 0044E020 85C0 test eax, eax 0044E022 74 0A je short 0044E02E 0044E024 C783 80000000 9>mov dword ptr [ebx+0x80], 0044E093 ; 新函數的地址 0044E02E 90 nop 0044E02F 61 popad 0044E030 68 E4E04400 push 0044E0E4 ; UNICODE "犖芻" 0044E035 C3 retn 0044E036 90 nop 0044E037 FF7424 04 push dword ptr [esp+0x4] ; 字符串比較 0044E03B E8 33000000 call 0044E073 0044E040 50 push eax 0044E041 FF7424 08 push dword ptr [esp+0x8] 0044E045 E8 29000000 call 0044E073 0044E04A 8BD0 mov edx, eax 0044E04C 58 pop eax 0044E04D 3BC2 cmp eax, edx 0044E04F 75 1D jnz short 0044E06E 0044E051 33C9 xor ecx, ecx 0044E053 8B7424 04 mov esi, dword ptr [esp+0x4] 0044E057 8B7C24 08 mov edi, dword ptr [esp+0x8] 0044E05B 8A1431 mov dl, byte ptr [ecx+esi] 0044E05E 3A1439 cmp dl, byte ptr [ecx+edi] 0044E061 75 0B jnz short 0044E06E 0044E063 41 inc ecx 0044E064 3BC8 cmp ecx, eax 0044E066 ^ 75 F3 jnz short 0044E05B 0044E068 33C0 xor eax, eax 0044E06A 40 inc eax 0044E06B C2 0800 retn 0x8 0044E06E 33C0 xor eax, eax 0044E070 C2 0800 retn 0x8 0044E073 33C9 xor ecx, ecx ; 取字符串長度 0044E075 8B4424 04 mov eax, dword ptr [esp+0x4] 0044E079 803C08 00 cmp byte ptr [eax+ecx], 0x0 0044E07D 74 03 je short 0044E082 0044E07F 41 inc ecx 0044E080 ^ EB F7 jmp short 0044E079 0044E082 8BC1 mov eax, ecx 0044E084 C2 0400 retn 0x4 0044E087 45 inc ebp 0044E088 78 69 js short 0044E0F3 0044E08A 74 31 je short 0044E0BD 0044E08C 0026 add byte ptr [esi], ah 0044E08E 45 inc ebp 0044E08F 78 69 js short 0044E0FA 0044E091 74 00 je short 0044E093 0044E093 6A 24 push 0x24 ; MB_YESNO | MB_ICONQUESTION 0044E095 68 DCE04400 push 0044E0DC ; ASCII "_KaQqi" 0044E09A 68 B6E04400 push 0044E0B6 ; ASCII "Do you fickbirne really want to quit?" 0044E09F 6A 00 push 0x0 0044E0A1 FF15 A4114400 call dword ptr [<&user32.MessageBoxA>] ; user32.MessageBoxA 0044E0A7 83F8 06 cmp eax, 0x6 0044E0AA 75 09 jnz short 0044E0B5 0044E0AC 6A 00 push 0x0 0044E0AE 2E:FF15 6411440>call dword ptr cs:[<&kernel32.ExitProcess>] ; kernel32.ExitProcess 0044E0B5 C3 retn 0044E0B6 44 inc esp ; 提示信息和標題 0044E0B7 6f outs dx, dword ptr [esi] 0044E0B8 2079 6F and byte ptr [ecx+0x6F], bh 0044E0BB 75 20 jnz short 0044E0DD 0044E0BD 66:6963 6B 6269 imul sp, word ptr [ebx+0x6B], 0x6962 0044E0C3 72 6E jb short 0044E133 0044E0C5 65:2072 65 and byte ptr gs:[edx+0x65], dh 0044E0C9 61 popad 0044E0CA 6c ins byte ptr [edi], dx 0044E0CB 6c ins byte ptr [edi], dx 0044E0CC 79 20 jns short 0044E0EE 0044E0CE 77 61 ja short 0044E131 0044E0D0 6e outs dx, byte ptr [esi] 0044E0D1 74 20 je short 0044E0F3 0044E0D3 74 6F je short 0044E144 0044E0D5 2071 75 and byte ptr [ecx+0x75], dh 0044E0D8 69743F 00 5F4B6>imul esi, dword ptr [edi+edi], 0x51614B5F 0044E0E0 71 69 jno short 0044E14B 0044E0E2 0000 add byte ptr [eax], al 0044E0E4 66:83BB 8200000>cmp word ptr [ebx+0x82], 0x0 ; 轉移 0044E0EC - E9 2D13FEFF jmp 0042F41E 0044E0F1 90 nop 0044E0F2 0000 add byte ptr [eax], al十六進制代碼如圖
60 90 FF 73 08 68 87 E0 44 00 E8 28 00 00 00 85 C0 74 1B FF 73 24 68 8D E0 44 00 E8 17 00 00 00 85 C0 74 0A C7 83 80 00 00 00 93 E0 44 00 90 61 68 E4 E0 44 00 C3 90 FF 74 24 04 E8 33 00 00 00 50 FF 74 24 08 E8 29 00 00 00 8B D0 58 3B C2 75 1D 33 C9 8B 74 24 04 8B 7C 24 08 8A 14 31 3A 14 39 75 0B 41 3B C8 75 F3 33 C0 40 C2 08 00 33 C0 C2 08 00 33 C9 8B 44 24 04 80 3C 08 00 74 03 41 EB F7 8B C1 C2 04 00 45 78 69 74 31 00 26 45 78 69 74 00 6A 24 68 DC E0 44 00 68 B6 E0 44 00 6A 00 FF 15 A4 11 44 00 83 F8 06 75 09 6A 00 2E FF 15 64 11 44 00 C3 44 6F 20 79 6F 75 20 66 69 63 6B 62 69 72 6E 65 20 72 65 61 6C 6C 79 20 77 61 6E 74 20 74 6F 20 71 75 69 74 3F 00 5F 4B 61 51 71 69 00 00 66 83 BB 82 00 00 00 00 E9 2D 13 FE FF 90 00 00直接復制,右鍵->二進制->二進制粘貼即可
修改完成之后保存
修改目標函數
接下來我們要修改關鍵函數,讓目標程序點擊菜單時,跳轉到自己的新添加的區段,直接來到0x0042F216處,
修改為如下代碼:
0042F416 68 00E04400 push 0044E000 0042F41B C3 retn 0042F41C 90 nop 0042F41D 90 nop對應的十六進制為
68 00 E0 44 00 C3 90 90校驗結果
修改完成之后來檢驗一下結果,點擊Exit菜單,彈出對話框
點擊是,退出程序。Patch完成!
最后,需要相關文件可以到我的Github下載:https://github.com/TonyChen56/160-Crackme
總結
以上是生活随笔為你收集整理的160个Crackme041之无源码修改Delphi程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 160个Crackme040
- 下一篇: 160个Crackme044