SEH反调试的实现与调试

SEH用于反调试或者用于注册码的隐藏时。在没有异常时永远都是错误的注册码,只有当触发异常时,程序才走到注册成功的地方……

代码如下:

void CSehDlg::RegSuc()
{
	HWND hWnd = ::GetDlgItem(NULL, 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!!");
}

void FirstLevelSeh(char chFlag)

{

		__try
		{
			INT a = chFlag;
			int b = a/0;
		}
		//定义异常处理模块
		__except(EXCEPTION_EXECUTE_HANDLER)
		{
			HWND hDlgWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
			HWND hWnd = ::GetDlgItem(hDlgWnd, IDC_STC_TIP);
			::SetWindowText(hWnd, "Success!!");
		}
}

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,引发一个除0异常,而在异常处理函数中才显示正确的注册码。

在这种情况下,在IDA中,如果姓名最后一位是0的话,程序会是个怎样的图形呢?

如上图所示的,在处理函数中IDA中的显示会有三个不同的函数头……而最右边成功时,是独立出来的。看起来好像在任何情况下都无法到达成功…………

在OD中程序又会是这个样子的……

进入这个有异常处理的函数401542后,是这个样子的……

上面代码中的

xor ecx, ecx

idiv ecx

会触发异常,程序就会跳到函数头时注册的异常处理函数中执行(就是在0040154C处注册的地方)……。

如果我们在调试到这个处理函数时,没有在异常处理函数中下断,在F7走到idiv ecx时,程序就会运行到系统领空,也就是程序跑飞了…………

解决方法:

所以如果要想走到正常的流程中,在这个函数头运行到0040154C的下一行代码是,在它的处理函数(00401c70处)上下断,就能把程序断下……

编译好的程序下载

SEH反调试的实现与调试,布布扣,bubuko.com

时间: 2024-10-14 05:53:23

SEH反调试的实现与调试的相关文章

移动端Web开发调试之Chrome远程调试(Remote Debugging)

本篇主要说一下Chrome RemoteDebugging 的方法,之前也遇到一些坑,自己总结了一些经验,分享如下. Chrome DevTools调试移动设备Brower Page Tabs/WebViews 安卓远程调试目前支持所有操作系统(Windows,Mac, Linux, and Chrome OS.)中调试,支持: ● 调试站点的页面 ● 调试安卓原生App中的WebView ● 实时将安卓设备的屏幕图像同步显示到开发机器. ● 通过端口转发(port forwarding)与虚拟

VS2003"无法启动调试 没有正确安装调试器"的解决办法

VS2003"无法启动调试 没有正确安装调试器"的解决方法 在用VS2003做项目的时候,经常调试程序,但是有时候回出现如下问题"无法启动调试,没有正确安装调试器,请运行安装程序或修复调试器".第一次碰到还以为是运气不好,就重新用vs2003安装程序重新修复了这个工具,可以使用了.但是运行了一段时间又出现了如上这种问题,郁闷了我很久.因为修复一下这个工具要花费很多时间的,于是从网上找了资料,把问题给解决了. 主要原因:大部分问题都是因为,mdm被损坏了导致的. 解决

移动端调试 — Pure|微信环境调试方案|App环境调试方案

Pure 详细参见: 中文文档:http://leeluolee.github.io/2014/10/24/use-puer-helpus-developer-frontend/ 源码:https://github.com/leeluolee/puer 微信环境调试方案 微信开发者工具现在不能用了,对于前端来说,主要调试分享,和微信授权,这两块都有成熟解决方案. 其次,需要调试一些浏览器样式兼容问题,这个..微信浏览器内核是X5内核,兼容性良好,具体兼容性问题具体分析吧 如下,分享下微信环境踩过

安卓手机移动端Web开发调试之Chrome远程调试(Remote Debugging)

一.让安卓打debug模式的apk包 二.将电脑中的chrome升级到最新版本,在chrome浏览器地址栏中输入chrome://inspect/#devices: 在智能手机还未普及时,移动设备的调试处处是alert的,这估计是最常用的办法了.以前很多时候为了预览页面在移动设备上的效果,需要先将页面上传到测试服务器,再将url输入到设备浏览器,或者使用第三方二维码扫码应用,通过移动设备访问打开浏览实际效果,每次换设备都要重复这些操作,页面多的话这些繁琐的事情就特别让人厌烦了.移动互联网的浪潮,

最全Pycharm教程(12)——Pycharm调试器之Java脚本调试

最全Pycharm教程(1)——定制外观 最全Pycharm教程(2)——代码风格 最全Pycharm教程(3)——代码的调试.运行 最全Pycharm教程(4)——有关Python解释器的相关配置 最全Pycharm教程(5)——Python快捷键相关设置 最全Pycharm教程(6)——将Pycharm作为Vim编辑器使用 最全Pycharm教程(7)——虚拟机VM的配置 最全Pycharm教程(8)——Django工程的创建和管理 最全Pycharm教程(9)——创建并运行一个基本的Pyt

VS2005调试时无法找到调试信息解决方法

调试C++程序的时候出现,无法找到.exe的调试信息,或者调试信息不匹配.未使用调试信息生成二进制文件.解决方法:打开菜单项目->项目属性页: 1.选择配置属性->链接器->调试->生成调试信息改为“ 是”: 2.选择配置属性->C/C++ ->常规->调试信息格式 改为用于“编辑并继续”的程序数据库(/ZI): 3.选择配置属性->C/C++ ->优化->优化改为 自定义. 重新编译,运行.OK.

w2wp.exe 已附加有调试器,但没有将该调试器配置为调试此未经处理的异常

一.问题描述 昨天系统联调,用到了VS2010 附件进程,把w2wp.exe 进程添加到vs2010 的调试进程中,这样其他系统访问我们系统,就可以捕获断点进行调试 但是,今天F5 调试的时候,发现直接报错"w2wp.exe 已附加有调试器,但没有将该调试器配置为调试此未经处理的异常.若要调试此异常,必须分离当前的调试器" 二.问题分析: w2wp.exe:是在IIS(因特网信息服务器)与应用程序池相关联的一个进程,如果你有多个应用程序池,就会有对应的多个w3wp.exe的进程实例运行

真机调试和用模拟器调试各有什么优缺点?

真机调试和用模拟器调试各有什么优缺点?这个问题是多数开发者尤其是初学者比较想了解的,关于真机调试和模拟器调试哪个更有优势,根据开发者的实践经验得出以下结论: 真机调试和用模拟器调试的优缺点: 1.真机调试更好,因为真机调试就是在我们平常使用的手机上操作,测试更准确;模拟器在某些方面往往达不到真机的真实水平. 2.真机调试更能清晰真实的反映出开发过程中出现的问题;而模拟器性能比较差,在模拟器上不一定能发现. 3.真机测试更能支持横竖屏都方便,有一些情况模拟机不行. 4.搞3D图形图像时候,真机支持

Linux内核调试方法总结之调试宏

本文介绍的内核调试宏属于静态调试方法,通过调试宏主动触发oops从而打印出函数调用栈信息. 1) BUG_ON 查看bug处堆栈内容,主动制造oops Linux中BUG_ON,WARN_ON用于调试,比如 #define BUG_ON(condition) do { / if (unlikely((condition)!=0)) / BUG(); / } while(0) 如果觉得该condition下是一个BUG,可以添加此调试信息,查看对应堆栈内容 具体的BUG_ON最终调用__bug _