现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

ollydbg和IDA,HIEW的简单结合

2014-03-25 06:50 工业·编程 ⁄ 共 3535字 ⁄ 字号 暂无评论

本人新手,对于逆向工程还不是很了解,现下只是学习,写下本文聊做笔记,以观后效
[cpp] view plaincopy
void CbhuDlg::OnBnClickedButton1() 

    // TODO: 在此添加控件通知处理程序代码 
CString str; 
GetDlgItem(IDC_EDIT1)->GetWindowTextW(str); 
if(str==L"DSADAS") 

::MessageBoxW(NULL,L"success",0,0); 

else 

::MessageBoxW(NULL,L"failed",0,0); 


破解本身有很多的方法,这也是最最简单的一种保护,所以我们现在只是拿这个程序做个例子,来进行演示OD和IDA的结合使用,因为我们知道IDA是很好的观察工具,但是在调试方面与OD相比有较多的不足之处,所以,我们结合两者来进行,最后使用HIEW进行exe文件的修改首先运行程序,我们可以看到错误提示框

在这里我们不再使用failed作为,检索条件,而是使用MessageBox,API函数来进行设置断点,然后再使用IDA查找跳转语句,即可
操作步骤如下:
1.运行Ollydbg和bhu(这里是您将要破解的程序)
2.OD->file->attach->bhu,附加到要运行的程序
3.在OD的反汇编窗口,右击->view->module "bhu"
4.在OD的反汇编窗口,右击->copy->select all
5.将其复制到本地的一个文本文件当中,查找字符串"MessageBox",并记录下所有的地址,在所有的地址处设置断点
6.进行操作查看运行至断点处
[cpp] view plaincopy
    011D1973  |. 75 07          JNZ SHORT bhu.011D197C 
011D1975  |. 68 58371D01    PUSH OFFSET bhu.??_C@_1BA@ICANLBCA@?$AAs?$AAu?$AAc?$AAc?$AAe?$AAs?$AAs?$AA?$>;  UNICODE "success" 
011D197A  |. EB 05          JMP SHORT bhu.011D1981 
011D197C  |> 68 68371D01    PUSH OFFSET bhu.??_C@_1O@KPGHAGDD@?$AAf?$AAa?$AAi?$AAl?$AAe?$AAd?$AA?$AA@    ;  UNICODE "failed" 
011D1981  |> 6A 00          PUSH 0                                                                       ; |hOwner = NULL 
011D1983  |. FF15 BC301D01  CALL DWORD PTR DS:[<&USER32.MessageBoxW>]                                    ; \MessageBoxW 
011D1989  |. 8D4D F0        LEA ECX,DWORD PTR SS:[EBP-10] 
011D198C  |. FF15 3C311D01  CALL DWORD PTR DS:[<&mfc100u.#902>]                                          ;  mfc100u.5B370BEE 
011D1992  |. 8B4D F4        MOV ECX,DWORD PTR SS:[EBP-C] 
011D1995  |. 64:890D 000000>MOV DWORD PTR FS:[0],ECX 
011D199C  |. 59             POP ECX 
011D199D  |. 5E             POP ESI 
011D199E  |. 8BE5           MOV ESP,EBP 
011D19A0  |. 5D             POP EBP 
011D19A1  \. C3             RETN 
011D1983即是我们要记录的地址,因为在OD中的地址都是内存中的地址,与IDA中的静态反编译是不同的,所以我们要进行地址转换,bhu的起始地址是011D1000所以偏移量是011D1983-011D1000,然后在IDA中也同样进行偏移即可在IDA中的显示如下

[cpp] view plaincopy
.text:00401967                 call    ds:ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>::Compare(wchar_t const *) 
.text:0040196D                 push    0               ; uType 
.text:0040196F                 push    0               ; lpCaption 
.text:00401971                 test    eax, eax 
.text:00401973                 jnz     short loc_40197C 
.text:00401975                 push    offset aSuccess ; "success" 
.text:0040197A                 jmp     short loc_401981 
.text:0040197C ; --------------------------------------------------------------------------- 
.text:0040197C 
.text:0040197C loc_40197C:                             ; CODE XREF: CbhuDlg::OnBnClickedButton1(void)+63j 
.text:0040197C                 push    offset Text     ; "failed" 
.text:00401981 
.text:00401981 loc_401981:                             ; CODE XREF: CbhuDlg::OnBnClickedButton1(void)+6Aj 
.text:00401981                 push    0               ; hWnd 
.text:00401983                 call    ds:MessageBoxW(x,x,x,x) 
.text:00401989                 lea     this, [ebp+str] 
.text:0040198C                 call    ds:ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>::~CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>(void) 
.text:00401992                 mov     this, [ebp+var_C] 
.text:00401995                 mov     large fs:0, this 
.text:0040199C                 pop     this 
.text:0040199D                 pop     esi 
.text:0040199E                 mov     esp, ebp 
.text:004019A0                 pop     ebp 
.text:004019A1                 retn 
.text:004019A1 public: void __thiscall CbhuDlg::OnBnClickedButton1(void) endp 
 
</wchar_t></wchar_t></wchar_t> 
要进行暴力破解,只需将.text:00401973 jnz short loc_40197C全部换成NOP即可,这里不再赘述

给我留言

留言无头像?