setjmp与longjmp的分析
#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的分析的更多相关文章
- C语言中setjmp与longjmp学习笔记
C语言中setjmp与longjmp学习笔记 一.基础介绍 头文件:#include<setjmp.h> 原型: int setjmp(jmp_buf envbuf) ,然而longjm ...
- C 语言中 setjmp 和 longjmp
在 C 语言中,我们不能使用 goto 语句来跳转到另一个函数中的某个 label 处:但提供了两个函数——setjmp 和 longjmp来完成这种类型的分支跳转.后面我们会看到这两个函数在处理异常 ...
- 非本地跳转之setjmp与longjmp
非本地跳转(unlocal jump)是与本地跳转相对应的一个概念. 本地跳转主要指的是类似于goto语句的一系列应用,当设置了标志之后,可以跳到所在函数内部的标号上.然而,本地跳转不能将控制权转移到 ...
- 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 ...
- C中的setjmp与longjmp
setjmp与longjmp是属于C语言中的,当然,C++也会有这两个函数了.他们的原型如下: int setjmp( jmp_buf env ); 作用:第一次调佣时,将寄存器的当前状态信息全部存入 ...
- setjmp 与 longjmp
setjmp和longjmp是C语言独有的,只有将它们结合起来使用,才能达到程序控制流有效转移的目的,按照程序员的预先设计的意图,去实现对程序中可能出现的异常进行集中处理. 先来看一下这两个函数的定义 ...
- setjmp和longjmp的使用
问题描述: setjmp和longjmp的使用 问题解决: setjmp和longjmp是C语言独有的,只有将它们结合起来使用,才能达到程序控制流有效转移的目的,按照程序 ...
- 【转】浅析C语言的非局部跳转:setjmp和longjmp
转自 http://www.cnblogs.com/lienhua34/archive/2012/04/22/2464859.html C语言中有一个goto语句,其可以结合标号实现函数内部的任意跳转 ...
- 【转载】setjmp和longjmp函数使用详解
[说明]本文上半部分转载自 wykwdy007 的转载文章 http://blog.csdn.net/wykwdy007/article/details/6535322 --------------- ...
随机推荐
- CentOS安装 netdata 实时监视 Linux 系统性能
作为一个 Linux 系统的管理员,为了随时了解系统资源的占用情况,有必要使用专门的系统监视工具.如果你需要对 Linux 系统.应用程序.SNMP 设备进行实时的性能监视,那么 netdata 这个 ...
- 使用密码登陆Amazon EC2
用的是亚马逊推荐的系统:Amazon Linux AMI 2015.09.1 (HVM) 创建instance后,会有一个pem的key使用该密钥登陆到服务器上后,默认用户名为 ec2-user 直接 ...
- Win10+CentOS7双系统引导修复
在有Win10的系统下安装了CentOS7后,CentOS7的引导并不会像CentOS6一样自动加载入Win10驱动.难道是grub2不能引导Win驱动?查了一下资料原来是CentOS不能识别Win1 ...
- 27. Unittest单元测试框架的介绍与使用
unittest单元测试框架 先贴一下unittest官网地址.unittest文档开头介绍了四个重要的概念:test fixture,test case, test suite, test runn ...
- 【扩展lucas定理】
洛谷模板题面:https://www.luogu.org/problemnew/show/P4720 扩展卢卡斯被用于解决模数为合数情形下的组合数问题. 首先我们把模数mod质因数分解,解决模每个素数 ...
- git的使用(本地版本库)
1. 创建版本库 1.1 创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录: 1.2通过git init命令把这个目录变成Git可以管理的仓库(git进入空目录的路径) $ git i ...
- 接口自动化测试框架-AIM3.0-开源+OOP
这是3.0了,从1.0到2.0直接跨越到3.0,就是这么随意. 3.0的关键词一是开源,源码地址为https://github.com/dongfanger/AIM,二是OOP. 随着python的发 ...
- img点击放大的js实现
业务需要,从后台获取图片列表,用img标签展示,由于图片太小看不清,需要点击放大,类似如下效果: 点击后放大(由于图片高度超出了页面,需要通过overflow:auto;设置滚动条,点击放大图片回到列 ...
- mysql 5.7.20 取得动态sql执行结果
drop procedure test; delimiter ;; CREATE procedure test() -- 取动态sql的值 begin ); ); set v_sqlcounts = ...
- jumpserver3.0安装
由于来源身份不明.越权操作.密码泄露.数据被窃.违规操作等因素都可能会使运营的业务系统面临严重威胁,一旦发生事故,如果不能快速定位事故原因,运维人员往往就会背黑锅.几种常见的运维人员背黑锅场景:1)由 ...