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

逆向工程——汇编基础

但可以通过SI、DI,BP分别访问他们的低16位。 段寄存器和选择器 实模式下的段寄存器到保护模式下,摇身一变就成了选择器。...####逻辑运算 逻辑运算指令qnrt包括AND, OR, XOR, TEST, NOT,逻辑运算的结果会影响到CF, PF, AF, ZF, OF标志位。...虚拟8086模式是运行在保护模式中的实模式,为了在32位保护模式下执行纯16位程序。它不是一个真正的CPU模式,还属于保护模式。 ####模式区别 保护模式同实模式的根本区别是进程内存受保护与否 。...该模式有两种子模式: 1)兼容模式:该模式下,64位操作系统运行在32位兼容环境,能正常运行16,32位应用程序就像基本的保护模式一样,访问32位地址空间,但不能运行纯16位实模式程序(就是不能运行虚拟...2)64位模式:在该模式下,处理器完全执行64位指令,使用64位地址空间和64操作数,运行16,32位程序必须切换到兼容模式。 IA-32e子模式的切换完全基于代码段寄存器。

1.5K10

【汇编指令1】解锁计算机底层操作的核心密码,从基础指令开启编程智慧之门,洞察数据处理与程序流程掌控奥秘,以简洁代码诠释高效运算逻辑,于数字世界构建强大功能基石,引领深入理解计算机运行机制新征程

不同的处理器架构下,寄存器的种类、数量和功能会有所不同 通用寄存器 64位 32位 16位 8位 RAX EAX AX AL RCX ECX CX CL RDX EDX DX DL RBX EBX...位模式下有不同表现形式): AL、BL、CL、DL、AH、BH、CH、DH:这些都是 8 位的通用寄存器,其中AL、BL、CL、DL为低 8 位寄存器,AH、BH、CH、DH分别对应AX、BX、CX...16 位通用寄存器(在 32 位和 64 位模式下也可按特定规则使用): AX、BX、CX、DX: AX(Accumulator Register):累加器寄存器,是很多算术和逻辑运算的默认操作数和结果存放位置...例如,在使用带有 “REP” 前缀的指令(如 “REP MOVSB” 用于复制字节串)时,CX中存放的就是重复操作的次数,每执行一次循环或者数据串操作,CX的值会自动减 1,直到CX变为 0,操作结束。...32 位通用寄存器(在 64 位模式下也有相应的兼容使用方式): EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP:这些 32 位通用寄存器是对应 16 位通用寄存器的扩展,功能上与

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

    调试 Go 的代码生成

    反汇编器 正如我提到的,-S 仅仅作用于中间汇编。真实机器上的表示在最终的工件中可用。你可以使用反汇编器去检查里面有什么。对二进制或库使用 go tool objdump 。...将会产生一个 ssa.html 文件,显示了编译器为了优化你的代码所经过的每一步。.../golang.org/x/net/context/go17.go:62: inlining call to time.Time.Add method(time.Time) func(time.Duration...值得一提的是你经常需要禁用优化来得到一个关于发生了什么的更简单的视图,因为优化可能会修改操作序列,增加代码,删除代码或是对代码进行变换。...开启了优化,将一行 Go 代码与优化后的输出对应起来将更难,进行性能测试也会更难,因为优化可能带来不止一处变化。可以通过 -N 来禁用优化,通过 -l 来禁用内联。

    56020

    16位汇编第九讲汇编指令以及逆向中的花指令

    16位汇编第九讲汇编指令以及逆向中的花指令 一丶LOOP指令(循环指令) 作用:   循环指令利用cx计数器自动减1,方便实现计数循环的程序结构...一直加标号,一直调用吗,显然是不切实际的. 2.Call 带有参数的传递 上面发现了一个大缺陷,就是不能参数传递,这样就不行了,那么我们要想办法,可不可以在外面传入参数 看代码: mov cx,1 mov...)一下 mov cx,2 push cx ;压栈 mov dx,1 push dx        ;调用函数 CALL PROC_ADD...,为什么函数内部要+2 原因是当这个子程序执行完毕的时候,需要返回到主程序执行,所以主程序的下一条指令已经压栈了,所以+2位置,可以取得参数 最后调用ret平栈 当程序遇到ret的时候,做的事情 1....我们发现jmp的地方下面申请了一个字节,但是在汇编的时候,这1个字节和mov的机器码在一起了 因而产生的汇编代码就出错了,花指令混淆就是这样,这段代码还是可以正常执行的 对抗手法 1.如果是动态的调试,

    1.6K100

    Linux下Shellcode编写

    这里就应该是 1 使用 man 2 write 可以找到 write 函数的参数 ssize_t write(int fd, const void *buf, size_t count); 第一个参数是三种输出模式...012stdinstdoutstderr标准输入标准输出标准错误 第二个参数是字符串的指针,第三个参数是输出的字数,而 64 位的程序,寄存器传参:rdi, rsi, rdx, rcx, r8, r9...0 syscall 使用 objdump 提取 shellcode,这一长串的魔法般的正则我就不解释了我也不会 yichen@ubuntu:~$ objdump -M intel -D hello-world...mov eax,0x1,可以使用对寄存器的一部分赋值实现,比如:mov al,0x1 还可以通过 xor rax,rax 先把 rax 置为 0,然后 add rax,0x1 实现 看一下效果:5、6、...可以使用 GDB 调试看一下 C 语言程序内存的值(gcc 加上 -g 参数可以直接 b 15 断在代码的第 15 行) Breakpoint 1, main () at 1.c:15 15 bind

    2.3K31

    Golang 汇编入门知识总结

    索性就查阅了很多大佬们写的资料,在阅读之余整理总结了一下,并在这里分享给大家。 本文使用 Go 版本为 go1.14.1 1. 为什么需要汇编 众所周知,在计算机的世界里,只有 2 种类型。...2.2 进程 首先,要知道的是,进程是分配系统资源的最小单位,线程(带有时间片的函数)是系统调度的最小单位。进程包含线程,线程所属于进程。...Go 汇编使用的是caller-save模式,被调用函数的入参参数、返回值都由调用者维护、准备。...与硬件寄存器 SP 是两个不同的东西,在栈帧 size 为 0 的情况下,伪寄存器 SP 和硬件寄存器 SP 指向同一位置。...在我们 add 函数的这种情况下,编译器自己帮我们插入了这个标记: 它足够聪明地意识到,add 不会超出当前的栈,因此没必要调用函数时在这里执行栈检查。

    2.6K40

    寄存器与七种寻址方式

    BX(16位) (BX又称基址寄存器,唯一作为存储器指针使用寄存器) CH(8位) CL(8位) CX(16位) (CX用于字符串操作,控制循环的次数,CL用于移位) DH(8位...④ 溢出标志 OF,在运算过程中,如操作数超出了机器可表示数的范围称为溢出。溢出时OF位置1,否则置0。   ⑤ 辅助进位标志 AF,记录运算时第3位(半个字节)产生的进位值。  ...⑥ 奇偶标志 PF,用来为机器中传送信息时可能产生的代码出错情况提供检验条件。当结果操作数中1的个数为偶数时置1,否则置0。...8位或16位位移量之和 BX 8位 位移量 EA(有效地址) = BP + SI 16位 位移量 DI 在普通情况下,假设SI、DI、或BX中的内容作为有效地址的一部分...BX SI 8位 即: EA = + + 位移量 BP DI 16位 在普通情况下,假设BP中的内容作为有效地址的一部分,则以SS段寄存器中的内容为段

    2.9K20

    手摸手Go 并发编程基石atomic

    由于CPU一次读取存储数据的长度有限,比如32bit的平台修改int64需要被拆分成两次写操作,更何况对于结构体的赋值,那么对于高并发场景下我们怎么才能保证数据的完整性和一致性呢?...提前剧透一下,原子操作其实最终依赖硬件指令的支持,但是因为原子操作可能会导致goroutine阻塞,所以它同时还需要运行时调度器的配合。...CX, 0(BX)的 大致有五类指令可强制使用LOCK语义,但当LOCK前缀被置于其他指令之前或者指令没有对内存进行写操作(目标操作数可能在寄存器中)时,会抛出一个invalid-opcode异常...感兴趣的可以详细研究下intel开发手册卷3 第五条指令:调用CMPXCHGQ,将指令第二个操作数与累加器AX比较 ,如果相等,CX更新到BX,否则BX更新到AX` 第六条指令:AX和CX相等时将1写进...这里大概是说在ARM,386,和32位MIPS,调用者有责任安排原子访问的64位字按照8字节对齐,否则程序会panic。

    60111

    golang 源码分析(28) interface 类型推断、反射

    输入命令go tool objdump -s "main.add" call_function,可以看到如下的汇编代码: 1 TEXT main.add(SB) /Users/didi/Source...为什么在main函数中,a和b变量分别复制到了SP+0x0和SP+0x8地址,但是在add函数中,却将SP+0x8和SP+0x10地址的值进行相加呢?  ...这是因为在main函数中的汇编代码14行中,调用call执行时CPU会执行一次压栈操作,将函数调用完成以后需要返回的地址存在SP-0x8的地址处,并执行一次SP=SP-0x8的操作(具体操作可以百度一下...interface也是一个Go语言中的一种类型,是一种比较特殊的类型,存在两种interface,一种是带有方法的interface,一种是不带方法的interface。...会先对分配一块空间保存该值的副本,然后将该interface变量的data字段指向这个新分配的空间。将一个值赋值给interface变量时,操作的都是该值的一个副本。

    79020

    16位汇编第三讲 分段存储管理思想

    所以下面调用可以正常显示hello了 但是我们如果写成 mov dx,[100] 那么就相当于对当前的物理地址取内容给dx, 变成了从100的偏移中取得内容给dx,dx的值就变味6548了,因为小端模式...比如下面我写好了一个程序 前边我们说过,每一条汇编指令对应一条机器码 上面从B83412去看 其中立即数寻址方式就是 ax后面的1234会按照小尾方式当做机器码存储 那么现在看的 B83412 其中3412...就是操作数 B8是什么 B代表的是MOV指令 8转换成二进制是 1000B 我们推测可能是代表那个寄存器,最起码后边三位要代表寄存器 我们换一条指令,mov bx,1234看看有什么改变 我们发现变成了...(e 地址 回车,然后输入第一个,空格则可以输入第二个地址,依次类推) 我们发现,我们写了一段二进制代码变成汇编代码成了 MOV CX,1234 9的二进制代码是 1001 代表的是CX 那么由此可以看出...8代表的是AX寄存器 9代表的是CX寄存器 B 代表的 BX寄存器 作业:   求出 八位通用寄存器分别所代表的值, 包括低八位和高八位各个寄存器的值   (AX BX CX DX SI DI SP

    1.5K60

    Win32汇编:数组与标志位测试总结

    近指针)和far(远指针),保护模式下使用Near指针,所以它被存储在双字变量中. .386p .model flat,stdcall option casemap:none include windows.inc...当执行一个加法(或减法)运算,使最高位产生进位(或借位)时,CF为1;否则为0 mov ax,0ffffh add ax,1 ; cf = 1 af = 1 ; PF 奇偶标志位:...1 ; df = 0 std mov eax,1 ; df = 1 ; OF 溢出标志位: 记录是否产生了溢出,当补码运算有溢出时OF=1;否则OF=0 mov al...,两个操作数都不会被修改,仅会影响标志位的变化,CMP指令是高级语言实现程序逻辑的关键,也是汇编中非常重要的指令常与跳转指令合用. .386p .model flat,stdcall option...bsf cx,dx ; 正向扫描,将扫描到1的位置放入CX bsr cx,dx ; 反向扫描 zf=0 pf=0 xor ecx,ecx

    76320

    Win32汇编:数组与标志位测试总结

    (pointer variable),Intel处理器使用两种基本类型的指针,即near(近指针)和far(远指针),保护模式下使用Near指针,所以它被存储在双字变量中..386p.model flat...当执行一个加法(或减法)运算,使最高位产生进位(或借位)时,CF为1;否则为0mov ax,0ffffhadd ax,1 ; cf = 1 af = 1; PF 奇偶标志位: 当运算结果中,所有...: 当DF=0时为正向传送数据(cld),否则为逆向传送数据(std)cldmov eax,1 ; df = 0stdmov eax,1 ; df = 1; OF 溢出标志位: 记录是否产生了溢出...,两个操作数都不会被修改,仅会影响标志位的变化,CMP指令是高级语言实现程序逻辑的关键,也是汇编中非常重要的指令常与跳转指令合用..386p.model flat,stdcalloption casemap...到低xor edx,edxmov dx, 0000111100001100bbsf cx,dx ; 正向扫描,将扫描到1的位置放入CXbsr cx,dx ;

    44130

    linux 编译 c或cpp 文件为动态库 so 文件(最简单直观的模板)

    被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。...带有可变参数的函数必须且只能使用_cdecl方式 __cdecl __fastcall与__stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序...,2)由调用者还是被调用者把参数弹出栈,3)以及产生函数修饰名的方法。...this指针存放于CX寄存器,参数从右到左压。thiscall不是关键词,因此不能被程序员指定。...5、nakedcall采用1-4的调用约定时,如果必要的话,进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器,退出函数时则产生代码恢复这些寄存器的内容。

    5.9K40

    8086汇编语言之Loop

    LOOP指令 Loop指令和cx寄存器配合使用, 用于循环操作,类似于高级语言中的do while循环 使用格式 mov cx,循环次数 标号: 循环执行的程序代码 loop 标号 标号的名称可以自定义...cx-1次 只不过判断之前会先执行一遍循环体, 类似于do while 特殊案例 根据以上结论, 如果cx的值为0, 减1后为-1, 那程序会怎么执行呢?...答案是会进入死循环 , 8086cpu是16位 的会循环执行65535次 为什么?...因为-1在计算机里面对应的十六进制为FFFF, 二进制第一位为符号位 小练习 题目: 取出以下内存地址中的值并且相加取和 FFFF0H----->20h #每个内存单元存放一个字节数据 FFFF1H...----->ach FFFF2H----->FFh 正常思维是使用八位寄存器取出对应地址的值,比如: mov ax,ffffh mov ds,ax mov al,[0] add al,[1] add

    1.6K30

    16位汇编中的伪指令

    这里写上,则编译器会自动的帮我们保存 parameter:tag  参数,和参数类型,比如我们寻找参数的时候是BP-XXX,这里直接给参数名,他会自动寻找 下面具体看我怎么写 ret返回指令: 在伪指令中...如果 retf 和 retn 不懂的,请看16位汇编第十讲完结,里面具体分析了怎么平栈,以及他们两个的区别  2.使用调用约定 langtype 使用调用约定,就不得不调用函数了,我们先简单的调用一下函数...我们要做的就是和C语言一样,声明了函数,直接写自己的代码,所以看下列汇编代码的变化 MY_ADD proc far stdcall USES bx cx ;这里我们USES bx cx 代表让编译器自动帮我们保存寄存器的信息...;平衡栈 MY_ADD endp  这里使用了伪指令,所以都会翻译成等价的汇编代码了,我们看下反汇编,看下参数变为什么样子了 ?...关于这个伪指令文档,课程资料里会带 (文件名字是 masm32.chm) 看上面写的,我们只需要 invoke  函数名    这样是调用空参函数 invoke MY_ADD invoke 函数名, 传入的参数

    1.4K80
    领券