首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

异常处理第一讲(SEH),筛选器异常,以及__asm扩展,寄存器注入简介

异常处理第一讲(SEH),筛选器异常,以及__asm扩展 一丶__Asm扩展知识 ①丶使用关键,解决局部变量申请问题 昨天已经介绍了__asm基本用法,现在对其做个扩展(上一篇是32汇编第七讲...ret } } 那么对于上面的程序,你觉着可能没问题,但是我们想一下,如果定义多个变量,那么下面的指令就要多次改动 sub esp,xxx 但是这样不好,为什么,如果来个数组,来个结构体套结构体...我们看到了,我们就定义了两个局部变量,为什么是申请了48个字节,原因是这里是Debug版本,默认编译器帮我们申请40h(也就是64个字节)局部空间,那么加上我们两个局部变量正好48H个字节 如果是发布版...40H个字节了 注意,在裸函数中你定义局部变量是不能初始化 也就是说你可以写成上面的那样子,但是不能初始化,因为这个时候还没有抬栈,比如抬栈之后初始化, 而初始化就可能在__asm里面去写 当然更多扩展...筛选器处理异常是由程序指定一个异常处理回调函数,当发生异常时候,系统调用这个回调函数,并根据回调函数返回决定如何进行下一步操作。

1.5K100

对不起,学会这些知识后飘了

在当今计算机行业中,应用是基本素质,如果你懂其原理才能让你在行业中走更远,而计算机基础知识又是重中之重。下面,跟随脚步,你介绍一下计算机底层知识。 CPU 还不了解 CPU 吗?...地址指令,数值输出到显示器中,然后结束程序,0103 指令被跳过了,这就和我们程序中 if() 判断是一样,在不满足条件情况下,指令直接跳过。...20字节栈内存空间切分成5个长度4字节空间来使用。...例如,mov dword ptr [ebp-4],6 表示就是,从申请分配内存空间下端(ebp寄存器指示位置)开始向前4字节地址([ebp - 4]) 中,存储着6这一4字节数据。 ?...XOR 指就是异或操作,它运算规则是 如果a、b两个不相同,则异或结果1。如果a、b两个相同,异或结果0。 相同数值进行 XOR 运算,运算结果0。

63110
您找到你想要的搜索结果了吗?
是的
没有找到

【C语言加油站】函数栈帧创建与销毁

,它们之间差值4,也就是说这里在栈顶放置了一个大小4个字节元素: 我们继续执行下一步操作。...也就是说,现在会在栈顶这三个元素按顺序进行压栈操作,下面我们就来观察一下; 可以看到,这些依次被压入栈顶,压入空间大小4个字节,也就是说此时 esp 和 ebp 所指向空间又增加了12个字节:...——四个字节 //dword ptr——内存单元四个字节长度 //ebp-8——地址名 //2——移动对象 这里意思就是2这个动到ebp-8这个地址上; 变量b dword ptr [ebp...-14h],3 //dword——四个字节 //dword ptr——内存单元四个字节长度 //ebp-14h——地址名 //3——移动对象 这里意思就是3这个动到ebp-14h这个地址上;...,如果要是在定义变量是不进行初始化,那此时变量又会是什么呢?

48230

5.10 汇编语言:汇编过程与结构

POP指令用于堆栈中栈顶弹出到指定目的操作数中,它执行操作包括堆栈顶部动到指定操作数,并将堆栈指针增加相应字节数。...例如,要将从堆栈中弹出存储到BX寄存器中,可以使用以下指令: POP EBX 从汇编代码角度来看,POP指令将从堆栈中取出一个,并将其存储到目的操作数中,它是一个出栈操作。...此处读者需要注意,这两条伪指令并非是汇编语言中所兼容,而是MASM编译器我们提供一个宏,是MASM一部分,它允许程序员使用汇编语言定义过程(函数)可以像标准汇编指令一样使用。...var1 = 10; int var2 = 20; } 上述代码经过C编译后,变成如下汇编指令,其中EBP-4必须是4倍数,因为默认就是4字节存储,如果去掉了mov esp,ebp,那么当执行...该指令会将新基准指针ebp 压入堆栈同时当前基准指针ebp存储到另一个寄存器ebx中,然后堆栈指针esp减去指定大小,获取新基地址,并将新基地址存储到ebp 中。

18720

5.10 汇编语言:汇编过程与结构

POP指令用于堆栈中栈顶弹出到指定目的操作数中,它执行操作包括堆栈顶部动到指定操作数,并将堆栈指针增加相应字节数。...例如,要将从堆栈中弹出存储到BX寄存器中,可以使用以下指令:POP EBX从汇编代码角度来看,POP指令将从堆栈中取出一个,并将其存储到目的操作数中,它是一个出栈操作。...此处读者需要注意,这两条伪指令并非是汇编语言中所兼容,而是MASM编译器我们提供一个宏,是MASM一部分,它允许程序员使用汇编语言定义过程(函数)可以像标准汇编指令一样使用。...= 10; int var2 = 20;}上述代码经过C编译后,变成如下汇编指令,其中EBP-4必须是4倍数,因为默认就是4字节存储,如果去掉了mov esp,ebp,那么当执行pop ebp...该指令会将新基准指针ebp 压入堆栈同时当前基准指针ebp存储到另一个寄存器ebx中,然后堆栈指针esp减去指定大小,获取新基地址,并将新基地址存储到ebp 中。

36820

【内功修炼】深入理解函数栈帧创建和销毁

在经典计算机科学中: 栈被定义一种特殊容器,用户可以数据压入栈中(入栈,push),也可以已经压入栈中数据弹出(出栈,pop),但是栈这个容器必须遵守一条规则:先入栈数据后出栈(First...0x008ffe20 然后,我们调式汇编代码往下走 大家看,变成了0x008ffe1c 那这里16进制显示,大家可以算一下,差了4,所以我们当前平台下,其实esp寄存器大小就是4字节。...,它是把从[ebp-24h]这个位置开始向上9个dword(4字节)直到ebp内容全部初始化为0CCCCCCCCh 可以带大家看一下 当然它并没有覆盖之前push进去3个寄存器...当然如果main函数里定义变量啥一样的话肯定也会有所差异。...函数里面的代码: 那我们也来分析分析: 首先mov dword ptr [ebp-8],0Ah那就是把0AH(16进制对应10进制就是整数10),放到地址ebp-8位置dword 双字(4字节

13511

X86指令格式(操作码列和指令列解释)

reg/opcode(寄存器/操作数)域:指定了8个寄存器或者额外3个字节opcode。究竟这三个字节用来做什么由主opcode指定。...后面的disp32也是一样。这个类型指令是3个字节。...9A cp 含义是:字节 0x9A 后面跟着一个6字节操作数表示要跳转地址和代码段寄存器。...对于结合使用 imm8 与或双字操作数指令,立即数进行符号扩展,以形成一个或双字。高位字节使用立即数最高位填充。 imm16 - 操作数大小属性等于 16 位指令使用立即数字。...: 如果是89,则r32源操作数,r32 = edx, r/m32 = ecx 如果是8b,则r32目标操作数,r32 = ecx, r/m32 = edx 所以可以构建出如下汇编: 00020000

33.1K223

CC++:堆栈面面观

=a+b操作,此时a栈空间中存放3 mov edx, DWORD PTR [rbp-8] ;a3存入寄存器edx mov eax, DWORD PTR [rbp-8] ;a3...曾几何时,以为面试官也曾经问我,函数参数是通过什么传递就说寄存器寄存器不够了,就用栈。然后他接着问我几个寄存器不够了,就用栈了。有点哑口无言。说了个四五个。其实这种问题是很开放。...推荐一篇文章《X86-64寄存器和栈帧》 说个题外话,上面代码如果开了优化怎么样呢?用gcc -S -masm=intel -O 来编译一下看看。...比如用前4个字节存储已分配内存大小,然后将其后面的地址返回,首地址前4个字节可以被称之为“首部”。这样free时候,先搜索该首地址前首部,取出这个即为偏移量。...举个例子: char *a = malloc(100); free(a+10); 比如你分配了100个字节,其首地址a,如果a+10(首地址之后偏移10字节处)传递给free,那么

45920

干货 | HOOK技术实战

当一个事件发生时,如果您安装是一个线程钩子,您进程中钩子函数将被调用。...该位置存放是指针)指针我们自己编写函数地址(在此之前肯定要把这个函数先加载到进程空间),但该函数参数必须与被 HOOK 函数完全一致 那么我们了解了导入表、INT表、IAT表之后,就来说说为什么要修改...lpAddress, //要更改访问保护属性页面区域起始页面地址 SIZE_T dwSize, //要更改访问保护属性区域大小,以字节单位...,例如55对应就是push ebp,54对应就是push esp,这是一个定长指令,也就是说push这个汇编代码在硬编码里面就是一字节 那么我们要实现jmp跳转,执行命令jmp 0x123454678...,对应字节5(jmp也定长指令),也就是说至少要有5个字节空间才能够写入jmp跳转硬编码。

1.8K10

引用条件及从汇编角度理解引用

int &b = a; lea eax,[ebp-4]//就是内存块a地址保存在eax寄存器中 //lea指令是地址指令,对比下边int *p = &a汇编指令是一摸一样. dword ptr...int *p = &a; lea ecx,[ebp-4]//就是内存块a地址保存在eax寄存器中 //lea指令是地址指令 mov dword ptr [ebp-0Ch],ecx 通过上边反汇编...int a=10; int *p = &a;//首先定义一个指针 //右边取地址符&覆盖左边*符号,即可得到引用变量定义 int &p = a; 定义引用变量引用数组名 //按照上边规则 int...sizeof(arr)<<" " <<sizeof(p)<<" " <<sizeof(q)<<endl; return 0; } 64bit编译器下,指针变量大小...main(){ int arr[10]={0}; printf("sizeof(arr)=%d\n",sizeof(arr)); fun(arr); } 注:64bit编译器指针变量大小

48310

滴水逆向初级-汇编(一)

32位 存储范围: 字节(Byte): 0 ~ 0xFF (Word): 0 ~ 0xFFFF 双字:0~ 0xFFFFFFFF 如果要存储数据超过最大宽度,那么多余数据将被丢弃!...2、DTDEBUG内存窗口使用 分别以字节//双字形式来查看内存(db dw dd) ? 向内存中写入四个字节数据,并观察存储形式(大端存储/小端存储) ?...: MOV EDI,12FFD8 MOV ESI,12FFD0MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] 2、STOS指令: AI/AX/EAX存储到...例子:向寄存器中赋值 2、如何执行一个函数?即函数调用 用JMP来执行函数 用CALL来执行函数 3、 什么是参数?什么是返回? 例子:编写一个函数,能够得到任意2个整数。...] 如果算术操作在结果第3位发生进位或借位则将该标志置1,否则清零。

1.2K10

深度解读《深度探索C++对象模型》之拷贝构造函数

第11到14行代码是用对象a中num成员给对象bnum成员赋值,[rbp - 16]是对象a起始地址,存放到rcx寄存器中,然后再加16字节偏移量就是num成员地址,加16字节偏移量是为了跳过前面的...String类型成员s,它大小16字节。...这个虚函数表指针很重要,如果没有设置好正确,那么引起调用虚函数混乱甚至引起程序崩溃。...这使得类失去了逐成员拷贝语意,如果一个类对象初始化是以另一个相同类型对象初值,那么逐成员拷贝是没有问题,问题在于如果是以派生类对象赋值给基类对象,这时候会发生切割,编译器需要计算好成员相对位置...12字节偏移量(8字节虚表指针加上成员变量b2占4字节),即完成对Grand类中成员变量g拷贝。

18820

汇编笔记(四)长文警告

功能:如果$()(CX)=0$,转移标号处执行;如果$(CX) \neq0$,什么也不做(程序向下执行)。...前三条指令执行后,栈空间16个字节,且用零填充 call指令读取后,IP指向下一条指令mov ax,4c00h,指令执行,IP中入栈,IP寄存器指向标号”s”处。...两个相乘数位数需要相同,即8位和8位,16位和16位。 如果是8位,一个默认在AL中,另一个在8位reg中或者内存字节单元中;如果是16位一个默认在AX中,另一个在16位reg中或者内存单元中。...我们最先想到是用寄存器了存储,对于存放参数存储器和存储结果存储器,调用者和子程序读写恰恰相反:调用者参数送入参数寄存器,从结果寄存器中取到返回;子程序从参数寄存器中取到参数,返回送入寄存器中...批量数据传递 前面的程序参数和结果只有一个,可以用两个寄存器来存放,寄存器数量终究有限,我们不可能简单第用寄存器来存放多个需要传递数据。返回一样。 ?

69910

程序员需要了解硬核知识之汇编语言(全)

虽然通过两次 pop 指令也可以实现,不过采用 esp 寄存器 + 8 方式更有效率(处理 1 次即可)。对栈进行数值输入和输出时,数值单位是4字节。...dd指的是 define double word表示有两个长度2字节领域(word),也就是4字节意思。...- 20] 这样形式,就可以申请分配20字节栈内存空间切分成5个长度4字节空间来使用。...例如,mov dword ptr [ebp-4],6 表示就是,从申请分配内存空间下端(ebp寄存器指示位置)开始向前4字节地址([ebp - 4]) 中,存储着6这一4字节数据。...XOR 指就是异或操作,它运算规则是 如果a、b两个不相同,则异或结果1。如果a、b两个相同,异或结果0。 相同数值进行 XOR 运算,运算结果0。

88520

收藏:NVMe协议基础原理介绍

CAP——控制器能力,定义了内存页大小最大最小、支持I/O指令集、DB寄存器步长、等待时间界限、仲裁机制、队列是否物理上连续、队列大小; VS——版本号,定义了控制器实现NVMe协议版本号; INTMS...>数据寻址方式(PRP和SGL) 1)PRP NVMe把Host内存分为页集合,页大小在CC寄存器中配置,PRP是一个64位内存物理地址指针,结构如下: 最后两位0,指四字节对齐;(n:2)...2)命令通用格式 命令均为64字节,具有相同格式,某些字段根据命令不同有不同定义。 完成命令同样具有相同格式,某些字段根据命令不同有不同定义。...Host准备了一个Read命令给SSD: 分析该包,Host需要从起始LBA 0x20E0448(SLBA)上读取128个DWORD (512字节)数据,读到哪里去呢?...该Tail DB寄存器映射在Host内存地址F7C11018,由于NVMe 寄存器映射到了Host内存中,所以可以根据这个地址写入寄存器。 SSD收到通知,去Host端SQ中取指。

4.7K33

结构体和类

,这个结果与我们预想可能有点不一样,按理来说,空类中没有数据成员,应该不占内存空间才对,但是我们知道每个类都有一个this指针指向具体内存,以便成员函数调用,即使定义一个类什么都不写,编译器也提供默认构造函数用来初始化类...所以编译器它分配一个1字节空间以便初始化this指针。所以空类占一个字节。...32个字节,嵌套定义结构体仍然能够满足上述两个法则,首先其中成员结构体one大小24,然后另外一个成员n占4个字节,得到总共占28个字节,然后根据第二个对齐规则在24和8之间取最小8,可以得到结构体大小应该为...指令获取到对象首地址并将它保存到了ecx寄存器中,在函数GetNum中,首先是在函数栈中定义了一个局部变量,这个局部变量赋值10,然后这个局部变量赋值到ecx所在地址内存中,最后再将这块内存中放到...,随便一个修改了静态变量,其他对象中,这个静态变量都会发生变化。

67420

【C语言】汇编角度剖析函数调用整个过程

汇编指令 1.push 压栈操作,他会改变esp所指向位置,从而适应栈帧空间扩大,操作方式就是操作数直接压栈到栈帧空间 注意:在x86环境下,esp地址以4字节单位 004018B0...2.pop 出栈操作,他也会改变esp所指向位置,从而适应栈帧空间减小,操作方式就是操作数直接跳出,离开栈帧空间 注意:在x86环境下,esp地址以4字节单位 00401910 5F...其功能为,一个开辟好函数栈帧内容用eax寄存器里面的内容赋值 dword是指double word,即为双字大小,一个字节大小是2字节,所以双字字节大小就为4字节 ptr指的是pointer,...4字节大小,然后又mov把esp给到edp,然后又对esp减小0E4h大小,所以esp指针向上移动了0E4h字节大小,其实这就是main函数栈帧开辟空间大小,此时esp位置便指向函数栈帧顶端...我们先为变量所在函数开辟一块儿函数栈帧空间,其分配好相应大小,并且对其进行初始化,初始化内容就是(0cccccccch),正因为如此,如果我们不对局部变量进行初始化的话,他其实就是0cccccccch

1K10

你知道函数栈帧创建和销毁吗?

一、概述 函数栈帧是在内存中栈区被调函数开辟一块空间,里面用来存放该函数中定义变量等东西,当函数运行完毕栈帧将被销毁。...Push(入栈):栈增加一个元素 Pop (出栈): 从栈中取出一个元素 二、寄存器 寄存器是中央处理器内用来暂存指令、数据和地址电脑存储器。寄存器存贮容量有限,读写速度非常快。...赋值给ebp,即将esp移动到ebp位置 sub esp,0E4h //esp向低地址移动0E4h个字节位置 push ebx...中 rep stos dword ptr es:[edi] //edi对应地址处开始,高于该地址共ecx个单位0CCCCCCCCh int a = 10; mov...为什么要将call指令下一条指令地址存起来呢??

11510

CC++ 反汇编:函数与结构体

,esi,edi则是因为我们需要用到这几个寄存器所以应该提前原始保存起来,最后用完了就需要pip edi,esi,ebx恢复这些寄存器原始状态,并执行add esp,0xC0对局部变量进行恢复,最后...首先我们来定义tag结构体,假设结构体中的当前数据成员类型长度M,指定对其N,那么实际对其Q = min(M,N),其成员地址将被编译器安排在Q倍数上,例如默认8字节对齐,则需要安排在8,16,24,32...占用8字节空间 } 在VS编译器中默认数据块对其是8字节,上方定义tag结构中sShort占用2个字节空间,而nInt则占用4字节空间,dDouble则占用8字节存储空间,那么结构体成员总长度...8+4+2=14bytes按照默认对其8字节来对其,结构体分配空间需要被8整除,也就是最低要分配16字节空间给tag这个结构,那么编译器自动在14字节基础上增加2字节垫片,来保证tag结构体内被系统更好接受...默认情况下编译器自动找出最大变量值double dDouble使用它字节长度来充当数据块对齐尺寸,例如上方代码中最大是double 8字节,那么相应对齐尺寸就应该是8字节,不足8字节变量编译器自动补充垫片字节

93140

5.3 汇编语言:字符串操作指令

; 定义三个四字节数据 ddDest DWORD lengthof ddSource dup(?)...SCASW指令:AX寄存器与EDI地址指向内存单元中两个字节进行比较。SCASD指令:EAX寄存器与EDI地址指向内存单元中四个字节进行比较。...4字节扫描,来检查EAX寄存器是否与目标数组中匹配。...如果匹配成功,则方向标志位将被设置与扫描方向相反方向,如果没有找到匹配项,方向标志位保持不变。...STOSB指令:AL寄存器存储到EDI地址指向内存单元中,同时增加或减少EDI(取决于方向标志位状态)。STOSW指令:AX寄存器存储到EDI地址指向两个字节内存单元中。

35220
领券