本人新手,对于逆向工程还不是很了解,现下只是学习,写下本文聊做笔记,以观后效
[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即可,这里不再赘述