#include <setjmp.h>

int main(int argc, const char* argv[])

{

 

    jmp_buf buf = {0,};

    int k = 0;

    setjmp(buf);

 

    k = 1;

 

    longjmp(buf, 1);

}

测试代码如上所示, 看一下Disassemble的代码

__setjmp3:

69CDFC38  mov         edx,dword ptr [esp+4] 

69CDFC3C  mov         dword ptr [edx],ebp 

69CDFC3E  mov         dword ptr [edx+4],ebx 

69CDFC41  mov         dword ptr [edx+8],edi 

69CDFC44  mov         dword ptr [edx+0Ch],esi 

69CDFC47  mov         dword ptr [edx+10h],esp 

69CDFC4A  mov         eax,dword ptr [esp] 

69CDFC4D  mov         dword ptr [edx+14h],eax 

69CDFC50  mov         dword ptr [edx+20h],56433230h 

69CDFC57  mov         dword ptr [edx+24h],0 

69CDFC5E  mov         eax,dword ptr fs:[00000000h] 

69CDFC64  mov         dword ptr [edx+18h],eax 

69CDFC67  cmp         eax,0FFFFFFFFh 

69CDFC6A  jne         _s3_get_count (69CDFC75h) 

69CDFC6C  mov         dword ptr [edx+1Ch],0FFFFFFFFh 

69CDFC73  jmp         _s3_done (69CDFCB0h) 

_s3_get_count:

69CDFC75  mov         ecx,dword ptr [esp+8] 

69CDFC79  or          ecx,ecx 

69CDFC7B  je          _s3_default_trylevel (69CDFC87h) 

69CDFC7D  mov         eax,dword ptr [esp+0Ch] 

69CDFC81  mov         dword ptr [edx+24h],eax 

69CDFC84  dec         ecx  

69CDFC85  jne         _s3_save_trylevel (69CDFC8Fh) 

_s3_default_trylevel:

69CDFC87  mov         eax,dword ptr [eax+0Ch] 

69CDFC8A  mov         dword ptr [edx+1Ch],eax 

69CDFC8D  jmp         _s3_done (69CDFCB0h) 

_s3_save_trylevel:

69CDFC8F  mov         eax,dword ptr [esp+10h] 

69CDFC93  mov         dword ptr [edx+1Ch],eax 

69CDFC96  dec         ecx  

69CDFC97  je          _s3_done (69CDFCB0h) 

69CDFC99  push        esi  

69CDFC9A  push        edi  

69CDFC9B  lea         esi,[esp+1Ch] 

69CDFC9F  lea         edi,[edx+28h] 

69CDFCA2  cmp         ecx,6 

69CDFCA5  jbe         _s3_save_data (69CDFCACh) 

69CDFCA7  mov         ecx,6 

_s3_save_data:

69CDFCAC  rep movs    dword ptr es:[edi],dword ptr [esi] 

69CDFCAE  pop         edi  

69CDFCAF  pop         esi  

_s3_done:

69CDFCB0  sub         eax,eax 

69CDFCB2  ret              

69CDFCB3  int         3    

69CDFCB4  int         3    

69CDFCB5  int         3    

69CDFCB6  int         3    

69CDFCB7  int         3    

69CDFCB8  int         3    

69CDFCB9  int         3    

69CDFCBA  int         3    

69CDFCBB  int         3    

69CDFCBC  int         3    

69CDFCBD  int         3    

69CDFCBE  int         3    

69CDFCBF  int         3    

将刚刚压入栈中的buf[esp + 4]赋值给edx,然后分别将线程相关的Context的各个register,以及TEB中的某些字段fs:[00000000h]放到该结构体中。

fs:[00000000h]保存的是与SEH相关的信息,参考:http://www.mouseos.com/windows/SEH3.html

参考:http://blog.csdn.net/zhongyh/article/details/1467654

总之,一旦调用longjmp,那么包括esp在内的Context可能都会被改变

setjmp与longjmp的分析的更多相关文章

  1. C语言中setjmp与longjmp学习笔记

    C语言中setjmp与longjmp学习笔记 一.基础介绍 头文件:#include<setjmp.h> 原型:  int setjmp(jmp_buf envbuf) ,然而longjm ...

  2. C 语言中 setjmp 和 longjmp

    在 C 语言中,我们不能使用 goto 语句来跳转到另一个函数中的某个 label 处:但提供了两个函数——setjmp 和 longjmp来完成这种类型的分支跳转.后面我们会看到这两个函数在处理异常 ...

  3. 非本地跳转之setjmp与longjmp

    非本地跳转(unlocal jump)是与本地跳转相对应的一个概念. 本地跳转主要指的是类似于goto语句的一系列应用,当设置了标志之后,可以跳到所在函数内部的标号上.然而,本地跳转不能将控制权转移到 ...

  4. setjmp()、longjmp() Linux Exception Handling/Error Handling、no-local goto

    目录 . 应用场景 . Use Case Code Analysis . 和setjmp.longjmp有关的glibc and eglibc 2.5, 2.7, 2.13 - Buffer Over ...

  5. C中的setjmp与longjmp

    setjmp与longjmp是属于C语言中的,当然,C++也会有这两个函数了.他们的原型如下: int setjmp( jmp_buf env ); 作用:第一次调佣时,将寄存器的当前状态信息全部存入 ...

  6. setjmp 与 longjmp

    setjmp和longjmp是C语言独有的,只有将它们结合起来使用,才能达到程序控制流有效转移的目的,按照程序员的预先设计的意图,去实现对程序中可能出现的异常进行集中处理. 先来看一下这两个函数的定义 ...

  7. setjmp和longjmp的使用

    问题描述:          setjmp和longjmp的使用 问题解决:       setjmp和longjmp是C语言独有的,只有将它们结合起来使用,才能达到程序控制流有效转移的目的,按照程序 ...

  8. 【转】浅析C语言的非局部跳转:setjmp和longjmp

    转自 http://www.cnblogs.com/lienhua34/archive/2012/04/22/2464859.html C语言中有一个goto语句,其可以结合标号实现函数内部的任意跳转 ...

  9. 【转载】setjmp和longjmp函数使用详解

    [说明]本文上半部分转载自 wykwdy007 的转载文章 http://blog.csdn.net/wykwdy007/article/details/6535322 --------------- ...

随机推荐

  1. (57)C# frame4 调用frame2

    http://msdn.microsoft.com/zh-cn/library/bbx34a2h.aspx https://www.cnblogs.com/weixing/archive/2012/0 ...

  2. git push 报错:failed to push some refs to 'git@git.xxxx:devops/thor.git'

    error: failed to push some refs to 'git@git.caicaivip.com:devops/thor.git' hint: Updates were reject ...

  3. MySQL高级学习笔记(一):mysql简介、mysq linux版的安装(mysql 5.5)

    文章目录 MySQL简介 概述 mysql高手是怎样炼成的 mysq linux版的安装(mysql 5.5) 下载地址 拷贝&解压缩 检查工作 检查当前系统是否安装过mysql 检查/tmp ...

  4. phhstrom 快捷键

    TODO(表示待办事件)注释 快捷键 Alt+6 Alt+6 可以查看添加了//TODO注释的代码片段 一般我们在开发过程中由于时间或者各方面的时间来不及完成的代码,往往会先将逻辑写出来,实现留待以后 ...

  5. Struts1.3——Struts标签

    1.struts标签的介绍 Struts框架提供了一组非常丰富的框架组件,同时也提供了一组标签库用于和这些组件交互,主要介绍以下三类: html标签 bean标签 logic标签 2.Html标签库 ...

  6. NTFS文件系统

    一.Volume和Cluster 卷(Volume)和簇(Cluster)是NTFS用来描述物理磁盘的单位. 卷之间是相对独立的,卷的概念其实就是分区(Partition). 簇的引入是为了方便处理不 ...

  7. Python List列表的操作说明

    Python中List的N种操作,其简单程度令人叹为观止... C:\Users\rhys>python Python 2.7.14 (v2.7.14:84471935ed, Sep 16 20 ...

  8. charles使用教程

    概述 Charles是目前最强大的http调试工具,在界面和功能上远胜于Fiddler,同时是全平台支持.是收费软件,可以试用15分钟,下面提供了破解方法.   安装破解 https://www.cn ...

  9. assets和static

    相同点: assets和static两个都是存放静态资源文件.项目中所需要的资源文件图片,字体图标,样式文件等都可以放在这两个文件下. 不相同点: assets中存放的静态资源文件在项目打包时,也就是 ...

  10. 基于MFC的Media Player播放器的制作(4---功能实现代码)

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. PandaPlayerDlg.h // PandaPlayerDlg.h : header file // //{{AFX_INCLUDE ...