【逆向知识】反调试-除0异常-编程与逆向
1、简介
重温编程和反调试的知识。
2、编程知识
整体界面长这个样子,然后拖控件,按钮点击事件。
按钮点击事件的函数编写
获取用户名与密码的值,然后取出用户名的最后一位判断是不是0,如果是0就进入判断函数内,否则就输出注册失败的提示。
void CSehDlg::OnReg()
{
// TODO: Add your control notification handler code here
CString strName;
CString strCode;
GetDlgItemText(IDC_EDT_USERNAME, strName); //获取用户名
GetDlgItemText(IDC_EDT_USERCODE, strCode); //获取密码
TCHAR chFlag = strName.GetAt(strName.GetLength()-1);
if (chFlag == '0')
{
FirstLevelSeh(chFlag); //异常判断函数
}
else
{
RegFail(); //注册失败的函数
}
}
异常函数编写
判断最后一位数为0,然后0除以0会触发一个结果未定义的异常,然后进入异常处理的部分。
void FirstLevelSeh(char chFlag)
{
__try
{
INT a = chFlag; // 现在的值是0
int b = a/0; // 0除以0会发生异常,未定义结果触发异常
}
//定义异常处理模块
__except(EXCEPTION_EXECUTE_HANDLER)
{
HWND hDlgWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
HWND hWnd = ::GetDlgItem(hDlgWnd, IDC_STC_TIP);
::SetWindowText(hWnd, "Success!!");
}
}
提示失函数编写
非常简单,获取文本控件的值,然后显示文本提示失败。
void CSehDlg::RegFail()
{
HWND hDlgWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
HWND hWnd = ::GetDlgItem(hDlgWnd, IDC_STC_TIP);
::SetWindowText(hWnd, "Failed!!");
}
3、逆向实践
IDA中的结构图
最右边是捕获到异常后处理的位置,提示成功的函数被独立。那么只要在那个分支处进行断点即可。
在【0043706F 040 mov esp, [ebp+ms_exc.old_esp]】处下断点,即可进入异常处理部分
4、参考
SEH反调试的实现与调试-文章
http://blog.csdn.net/xiaocaiju/article/details/25995495
SEH反调试的实现与调试 -代码