之前朋友有一个服务端程序,总是受到一些人的恶意漏洞攻击,没有源代码,只好反汇编修复了漏洞,并且使用WinLicense加保护授权.

漏洞总不是一次可以修复完的,恶意攻击并没有停止,然后加了WL保护程序在崩溃的时候在没有提示信息,服务器日志中也没有记录任何有用的信息了,这里所需要有用的信息即是崩溃时候汇编代码运行的内存地址.c++写的程序崩溃的时候我们经常可以看到这种包含了运行址,以及访问内存地址相关信息的对话框.

首先想到的办法是使用windbg的adplus -crash dump内存分析,cdb刚attach上目标进程就直接退出了,不错,WL检查到了调试器,自动触发了保护,程序退出进程了.所以通过windbg,od类似的调试器方案是行不通了.

还有一次,攻击影响了客户端,使部分客户端崩溃,通过日志看到的错误内存地址,经过分析发现是在SEH中,即我们平常代码__try{}__except{}的__except{}代码中,关键是这层SEH还被上一层SEH包着,找了很久还是没能有效的定位到崩溃的内存地址.

后来只好电话求助了小明哥,没说别的,就VEH向量化异常处理解决问题.

更多的知识可以看雪http://bbs.pediy.com/showthread.php?t=173853

通过看雪上的这篇文章我们可以了解到,在没有调试器的情况下,程序发生异常,如果有安装VEH,则VEH先处理异常,然后才是SEH,TopLevelEH.

我要的东西很简单,就是程序崩溃的内存地址,即当时发生崩溃的时候,cpu EIP寄存器的值.

代码就很简单了

#define DBG_PRINTEXCEPTION_C             ((DWORD   )0x40010006L)
LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS * pExceptionInfo)
{char lpMsg[512]={0}; switch( pExceptionInfo->ExceptionRecord->ExceptionCode )  {  case DBG_PRINTEXCEPTION_C:break;  default:{memset(lpMsg,0,512);wsprintfA(lpMsg,"Exp EIP:%x  ExpAddr:%x",pExceptionInfo->ContextRecord->Eip,pExceptionInfo->ExceptionRecord->ExceptionAddress);OutputDebugStringA(lpMsg);}}return EXCEPTION_CONTINUE_SEARCH;
}
BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:{AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)ExceptionHandler);}case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;
}

不错,写一个dll,然后Exe程序启动进入Main函数后,直接反汇编写段代码,loadlibrary一下dll,即可.

打开DbgView,运行目标进程,崩溃一出现,dbgview中就输出了Eip地址,在反汇编定位到代码处理,具体问题具体分析即可!

转载于:https://www.cnblogs.com/dreamzgj/p/4374009.html

VEH帮你定位程序崩溃地址相关推荐

  1. 使用MAP文件快速定位程序崩溃代码行

    作为程序员,平时最担心见到的事情就是程序发生了崩溃,无论是指针越界还是非法操作,都将给我们的应用系统 造成巨大的损失.但在一个大型系统的测试过程中,初期出现程序崩溃似乎成了不可避免的事.其实测试中出现 ...

  2. 使用MAP文件快速定位程序崩溃代码行(转)

    作为程序员,平时最担心见到的事情就是程序发生了崩溃,无论是指针越界还是非法操作,都将给我们的应用系统造成巨大的损失.但在一个大型系统的测试过程中,初期出现程序崩溃似乎成了不可避免的事.其实测试中出现程 ...

  3. 【C++】定位程序崩溃(Mingw)

    站在巨人的肩膀上 Dr. Mingw 概述 剖析 Dr. Mingw 的源代码,抽取最核心的代码,封装成一个动态库,名为 MiniDrMingw.dll. MiniDrMingw.dll 是面向过程的 ...

  4. windbg结合IDA定位程序崩溃

    如何分析dump文件 打开windbg,把dump文件拖进windbg中,输入!analyze –v windbg找出出错模块svnets的基地址 通过IDA改变svnet模块基地址 IDA中的地址都 ...

  5. 软件崩溃时 将堆栈信息写入dump文件, 并使用VS2010定位程序崩溃位置

    Windows下有三种生成dump文件的方式: 1.通过任务管理器和注册表:2.WinDbg抓取:3.程序中加入存储Dump的代码 具体生成方法参看:Windows下dump文件生成与分析 本文详细介 ...

  6. 如何定位Release程序崩溃原因

    [转]如何定位Release程序崩溃原因 Posted on 2011-08-19 10:44 单鱼游弋 阅读(2162) 评论(1) 编辑 收藏 1       案例描述 作为Windows程序员, ...

  7. 如何知道程序崩溃原因?

    在使用电脑过程中,偶尔会遇到个别程序停止工作(如下图),有的甚至直接闪退了. 如果程序问题打开就能重现的,用调试软件打开程序,调试运行,程序关闭后就可以定位到错误地址. 如果程序问题无法简单重现,那就 ...

  8. 使用 Google Breakpad 来助力解决程序崩溃

    背景 作为一名程序,最头疼的莫过于项目上线后收到程序崩溃的通知,若能够在手头重现出该问题,那相对来说项目能够及时的修复并更新:如果无法重现外网崩溃的问题,那就十分的"头疼"了.要是 ...

  9. 应用程序崩溃定位查找 (二)

    教程的第一部分介绍了 SIGABRT 和 EXC_BAD_ACCESS 的错误,并说明解决他们使用 Xcode 调试器和异常断点的一些策略. 但我们的应用程序仍然有一些问题!它不能完全按照它应该并且有 ...

  10. c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题

    代码 总结下c语言中字符串数组的地址存放问题 #include <iostream> using namespace std; #include<bits/stdc++.h>i ...

最新文章

  1. S/4HANA的生产订单,哪个字段可以用来做生产完成的标志位
  2. 一定要会的synchronized关键字的用法
  3. maven配置_eclipse创建maven_maven插件配置
  4. RabbitMQ六种队列模式-发布订阅模式
  5. ie6下 jsonp无响应的问题
  6. php base64_decode 图片,php读取和保存base64编码图片
  7. eds能谱图分析实例_热场发射扫描电子显微镜与能谱分析仪
  8. 记一次axsi2调用 web services 提示 java.net.SocketException: Connection reset 的解决
  9. Java面试相关问题以及解析
  10. 解决各个浏览器文件下载中文乱码问题
  11. Linux Shell 极简教程:一个例子
  12. gulp less编译css压缩和js压缩别名输出
  13. java中怎么输入中文_MultiMC下载-MultiMC中文实用版 v1.0
  14. 重庆航天职业技术学院计算机系在哪个校区,重庆航天职业技术学院地址在哪里,哪个城市...
  15. android登录实现回显用户名和密码
  16. 虚拟机屏幕太小 如何调整?
  17. 也许这30句话会帮到你
  18. 安卓逆向——修改APP的名称,图标和包名多开分身
  19. c语言课设航班信息管理软件管理系统,c语言航班信息查询系统实验报告.doc
  20. 计算机 教授级职称评定,工程技术应用研究员(俗称正高,教授级高工等等)职称评定...

热门文章

  1. 怎么将图片转成html,一种将图片转成HTML文档的方法与流程
  2. 安装windows server 2003两种授权模式之间的区别
  3. 前端项目加载图片、视频插件
  4. TCC(TinyC)编译器汉化(中文编译器、汉语编程)之四:语法分析上
  5. Biaofun讲解短视频营销对于2021年的大势所趋
  6. html如何加黑色蒙板,Photoshop中怎么添加黑色蒙版?
  7. 为啥淘宝的商品链接无法分享到微信?
  8. 【等保知识】等保测评机构申请条件,所需资料以及流程
  9. Latex 文本居中
  10. NPOI实现Word表格删除一行