• 【逆向知识】反调试-除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反调试的实现与调试 -代码

    http://download.csdn.net/download/xiaocaiju/7357721

  • 相关阅读:
    Are You Safer With Firefox?(zz)
    IIS+PHP下调用WebService初试
    垃圾链接和网络欺骗
    微软即将发布64位XP和Win2003 SP1(zz)
    今日个人大事记:)
    GT4 Web Service编译和发布初探
    纪念一下QQ等级和在线时长
    今天安装GT3.9.5碰到的问题
    判断32位整数二进制中1的个数
    Windows 2003 SP1新体验
  • 原文地址:https://www.cnblogs.com/17bdw/p/8280650.html
Copyright © 2020-2023  润新知