相关疑难解决方法(0)

指令长度

我正在查看汇编中的不同指令,我对如何决定不同操作数和操作码的长度感到困惑.

这是你应该从经验中得知的东西,还是有办法找出哪个操作数/运算符组合占用了多少字节?

例如:

push %ebp ; takes up one byte
mov %esp, %ebp ; takes up two bytes
Run Code Online (Sandbox Code Playgroud)

所以问题是:

在看到给定的指令后,如何推断出其操作码需要多少字节?

x86 assembly instruction-set machine-code code-size

5
推荐指数
2
解决办法
3790
查看次数

CPU /汇编器如何知道下一条指令的大小?

举例来说,想象一下我正在构建一个虚拟机.我有一个字节数组和一个while循环,我如何知道从字节数组中读取多少字节,以便下一条指令解释类似于intel 8086的指令?

编辑:(注释)cpu在指令指针处读取操作码,8086和CISC有一个字节和两个字节指令.我怎么知道下一条指令是F还是FF?

编辑:在http://www.swansontec.com/sintel.html上的这篇文章中找到了一个自己的答案

操作代码或操作码位于任何可选前缀之后.操作码告诉处理器执行哪条指令.此外,操作码包含描述期望操作数的大小和类型的位字段.例如,NOT指令具有操作码1111011w.在该操作码中,w位确定操作数是字节还是字.OR指令的操作码为000010dw.在该操作码中,d位确定哪些操作数是源和目的地,并且w位再次确定大小.某些指令有几种不同的操作码.例如,当OR与累加器寄存器(AX或EAX)和常量一起使用时,它具有特殊的节省空间的操作码0000110w,从而无需单独的ModR/M字节.从大小编码的角度来看,记忆精确的操作码位是没有必要的.大致了解特定指令可用的操作码类型更为重要.

cpu assembly controls instruction-set

5
推荐指数
2
解决办法
3037
查看次数

为什么编译器将数据放在PE和ELF文件的.text(code)部分中,并且CPU如何区分数据和代码?

所以我参考这篇论文:

二进制搅拌:旧版x86二进制代码的自随机指令地址

https://www.utdallas.edu/~hamlen/wartell12ccs.pdf

代码与数据交织:由于性能原因,现代编译器在PE和ELF二进制文件的代码段中积极插入静态数据。在编译的二进制文件中,通常没有办法将数据字节与代码区分开。不经意地将数据与代码随机化会破坏二进制文件,从而给指令级随机化器带来困难。可行的解决方案必须以某种方式保留数据,同时随机化所有可访问的代码。

在此处输入图片说明

但我有一些问题:

  1. 如何提高程序速度?我只能想象这只会使cpu的执行更加复杂吗?

  2. CPU如何区分代码和数据?因为据我所知,除非有跳转类型的指令,否则cpu将以线性方式依次执行每个指令,那么cpu怎么知道代码中的哪些指令是代码,哪些指令是数据?

  3. 考虑到代码部分是可执行的,并且CPU可能会错误地将恶意数据作为代码执行,这对安全性是否非常不利?(也许攻击者将程序重定向到该指令?)

cpu x86 reverse-engineering elf compiler-optimization

5
推荐指数
1
解决办法
171
查看次数

Linux x86 CPU指令布局混乱

在x86中,我理解多字节对象存储在内存中的小端样式.

现在一般来说,当谈到CPU指令时,OPCODE确定指令的目的,数据/存储器地址可以遵循其编码格式的操作码.我的理解是指令的操作码部分应该是最重要的字节,因此出现在任何给定指令编码表示的最高地址.

有人可以解释这个x86 linux gdb示例中的内存布局吗?我认为操作码0xb8会出现在更高的地址,因为它是最重要的字节.

(gdb) disassemble _start

Dump of assembler code for function _start:
0x08048080 <+0>:    mov    eax,0x11223344

(gdb) x/1xb _start+0
0x8048080 <_start>:     0xb8
(gdb) x/1xb _start+1
0x8048081 <_start+1>:   0x44
(gdb) x/1xb _start+2
0x8048082 <_start+2>:   0x33
(gdb) x/1xb _start+3
0x8048083 <_start+3>:   0x22
(gdb) x/1xb _start+4
0x8048084 <_start+4>:   0x11
Run Code Online (Sandbox Code Playgroud)

它看起来是指令mov eax,0x11223344编码为0x11 0x22 0x33 0x44 0xb8.

问题.

1.)如果看到的第一个字节不是操作码,CPU如何知道指令将占用多少字节?

2.)我想知道是否x86 cpu指令甚至没有endian-ness并且正在考虑某种类型的字符串?(可能离开这里)

linux x86 assembly endianness

1
推荐指数
1
解决办法
114
查看次数

X86汇编 - 如何计算指令操作码长度(以字节为单位)

我正在尝试学习X86汇编(用于学习逆向工程).我学习了C#和C\C++语言以及IL

可能我的主要问题是英语,因为我是波斯语,而且我也找不到任何有用的文件来学习用波斯语写的X86程序集.所以我决定做我为学习C#和C++所做的事情.我试过阅读X86样本和你好世界,但我失败了因为我无法理解我必须选择哪个注册表以及其他只能通过查看源代码无法解决的问题.

所以我决定改变策略并做一个挑战:写一个X86反汇编程序 我很生气,我知道.但我们不能说这是不可能的.第一个认为我需要理解(但没有记住)的是这些表:http://ref.x86asm.net/coder32.html

我对操作码很好,但我不明白如何计算操作数的大小或者寄存器十六进制字节呢?

对不起,我的英语不好.

PS.我想用C#做它

c# assembly

0
推荐指数
1
解决办法
980
查看次数