当我objdump -D用来反汇编二进制时,典型的代码jmpq就像e9 7f fe ff ff是,用于表示负偏移.但是,x86-64的地址是64(48)位(据我所知),那么这个32位地址如何7f fe ff ff表示64位绝对地址的负偏移?
此外,还有像任何其他指令jmp和jmpq,但有64位地址位移?我怎样才能找到英特尔或AMD手册中的说明(我搜索jmpq但没有找到任何内容)?
当我搜索时,它似乎被称为RIP相对寻址.似乎并非所有说明都这样做.是否有64位相对寻址?如果是间接跳转,64位绝对地址将在寄存器或内存中,对吧?
当进程分叉时,子进程是否会在其地址空间中具有自定义共享库(.so文件)?
如果是这样,共享库的地址是否与其父进程相同或不同(由于ASLR)?
__attribute__ ((constructor)) constructor在所有子进程中,在main函数之前运行的函数是否会再次执行?线程怎么样?
setjmp()应该将包含"返回地址"和"堆栈指针"的寄存器保存到"jmp_buf"中.当我编译(gcc和clang)并使用glibc在x86_64下调试以下程序时,我无法理解"jmp_buf"中的内容以及"返回地址"和"堆栈指针"位于"jmp_buf"中的位置.
#include <stdio.h>
#include <setjmp.h>
int main()
{
int i;
jmp_buf env;
i = setjmp(env);
printf("i = %d\n", i);
if (i != 0) return;
longjmp(env, 2);
printf("Does this line get printed?\n");
}
Run Code Online (Sandbox Code Playgroud)
当程序在"printf("i =%d \n",i);"之前的断点处停止时,我尝试了gdb功能:"p/x env"; 但是我在这个包含__jmpbuf和__saved_mask的结构(env)中找不到"返回RIP"和"之前的RSP".任何人都知道这两个函数究竟是如何工作的以及它们在x86_64下用glibc保存的是什么(我使用的是ubuntu 14.04)?
如何使用Berkeley Packet Filter(BPF)过滤内核中的函数参数?该函数应该是任何非内联函数,而不仅仅是系统调用.此外,最好能够取消引用函数参数中的指针以进行验证.
我搜索了互联网,但找不到任何用例.大多数材料仅描述了如何使用seccomp/seccomp-BPF.
似乎整合了eBPF和kprobe/jprobe来实现挂钩.但我无法在网上找到一个好的例子.
在(32 位)ARM Linux 内核中,如何区分代码部分中嵌入的数据和指令?
最好有一个轻量级的方法,比如位掩码,它可以很容易地实现。将反汇编程序嵌入内核是不明智的。
在内核模块中,如何列出所有内核符号及其地址?不应重新编译内核。
我知道接口中的“ cat / proc / kallsyms”,但是如何使用诸如之类的函数直接从内核数据结构中获取它们kallsyms_lookup_name。