我想在Windows下编写基本的程序集,我正在使用NASM,但我无法正常工作.
如何在Windows上没有C函数的帮助下编写和编译hello world?
在解释词法分析器和解析器之后,关于如何创建编译器的所有文本都会停止.他们没有解释如何创建机器代码.我想了解端到端流程.
目前我的理解是,Windows exe文件格式称为Portable Executable.我读到了它的标题,我还没有找到一个可以轻松解释这个问题的资源.
我的下一个问题是,我没有看到任何解释机器代码如何存储在文件中的资源.是否像32位固定长度指令一样接一个地存储在该.text部分?
有没有地方至少解释如何创建一个什么都不做的exe文件(它有一个No Op指令).然后我的下一步是链接到dll文件以打印到控制台.
windows compiler-construction linker executable portable-executable
所以我参考这篇论文:
二进制搅拌:旧版x86二进制代码的自随机指令地址
https://www.utdallas.edu/~hamlen/wartell12ccs.pdf
代码与数据交织:由于性能原因,现代编译器在PE和ELF二进制文件的代码段中积极插入静态数据。在编译的二进制文件中,通常没有办法将数据字节与代码区分开。不经意地将数据与代码随机化会破坏二进制文件,从而给指令级随机化器带来困难。可行的解决方案必须以某种方式保留数据,同时随机化所有可访问的代码。
但我有一些问题:
如何提高程序速度?我只能想象这只会使cpu的执行更加复杂吗?
CPU如何区分代码和数据?因为据我所知,除非有跳转类型的指令,否则cpu将以线性方式依次执行每个指令,那么cpu怎么知道代码中的哪些指令是代码,哪些指令是数据?
考虑到代码部分是可执行的,并且CPU可能会错误地将恶意数据作为代码执行,这对安全性是否非常不利?(也许攻击者将程序重定向到该指令?)
我一直很好奇
我之前的问题:关于可执行程序的内存布局的更多信息(进程)
在我的追求中,我终于找到了答案.我发现这篇优秀文章清除了我的大部分疑问:http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html
在上面的文章中,作者展示了如何获取进程的不同部分(LINUX)并将其与相应的ELF文件进行比较.我在这里引用这一节:
很有可能看到流程细分的真实布局?我们可以使用/ proc // maps文件来显示它.是我们想要观察的过程的PID.在我们继续之前,我们在这里遇到一个小问题.我们的测试程序运行得如此之快,以至于我们甚至可以转储相关的/ proc条目.我用gdb来解决这个问题.您可以使用另一个技巧,例如在调用return()之前插入sleep().
在控制台(或xterm等终端模拟器)中执行:
$ gdb test
(gdb) b main
Breakpoint 1 at 0x8048376
(gdb) r
Breakpoint 1, 0x08048376 in main ()
Run Code Online (Sandbox Code Playgroud)
按住这里,打开另一个控制台,找出程序"测试"的PID.如果您想要快速方式,请键入:
$ cat /proc/`pgrep test`/maps
Run Code Online (Sandbox Code Playgroud)
你会看到如下的输出(你可能得到不同的输出):
[1] 0039d000-003b2000 r-xp 00000000 16:41 1080084 /lib/ld-2.3.3.so
[2] 003b2000-003b3000 r--p 00014000 16:41 1080084 /lib/ld-2.3.3.so
[3] 003b3000-003b4000 rw-p 00015000 16:41 1080084 /lib/ld-2.3.3.so
[4] 003b6000-004cb000 r-xp 00000000 16:41 1080085 /lib/tls/libc-2.3.3.so
[5] 004cb000-004cd000 r--p 00115000 16:41 1080085 /lib/tls/libc-2.3.3.so
[6] 004cd000-004cf000 rw-p 00117000 …Run Code Online (Sandbox Code Playgroud)