Tag: linux

Java内插器中的堆栈粉碎

我正在编写一个Java内插器来修改与网络通信相关的系统调用。 基本上,我想修改目标收件人的IP和端口。 代码在我的笔记本电脑上正常工作,但在大学PC上,它给出了一个堆栈粉碎错误 : *** stack smashing detected ***: java terminated ======= Backtrace: ========= /lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x45)[0xb7702dd5] /lib/i386-linux-gnu/libc.so.6(+0xffd8a)[0xb7702d8a] /home/mwaqar/vibe/ldinterposer_2.so(+0x28e4)[0xb77c98e4] /home/mwaqar/vibe/ldinterposer_2.so(connect+0x9c5)[0xb77c9093] /usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/libnet.so(+0xceff)[0x8b226eff] /usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/libnet.so(Java_java_net_PlainSocketImpl_socketConnect+0x4c1)[0x8b227c51] 相关代码( 连接系统调用的插入)如下: int connect(int fd, const struct sockaddr *sk, socklen_t sl) { struct sockaddr_in *lsk_in = (struct sockaddr_in *) sk; struct sockaddr_in6 *lsk_in6 = (struct sockaddr_in6 *) sk; struct sockaddr_in addr4; unsigned int len; int […]

linux&c – 在磁盘上访问文件..按地址?

是否可以通过ac程序或终端(linux)中的地址获取文件? 我知道这对我来说听起来很奇怪,但我只是在尝试。 例如,替换 FILE * f = fopen(“myfile.txt”,”r”) 通过绝对令人惊叹的东西 int fd = open(&0x545f6f5,”r”) 或echo&0x545f6f5会抓住相关文件的一部分(需要一个长度,所以更像echo和0x545f6f5 20来读取地址旁边的20个字节)? 我知道mmap,但同样,我的问题更像是实验。 那么,整体情况是:可以使用地址(理想情况下长度)访问linux文件系统上文件的任何部分吗? 更新: 说我的分区ID / dev / sda1,我想访问带有地址而不是名称的原始内存值(可读或不可读)。 如果我寻找地址&0x545f6f5并且恰好是偏移量为64的myfile.txt,我会读取此位置的字节。 我希望它能让它更清晰:)

如何检测在Linux中通过GUI登录的用户

我想在我的程序中捕获通过GUI登录的用户名。 我的程序作为root登录的守护进程运行。 如果非root用户通过GUI登录,则应通知我的程序。 我正在粘贴我当前的程序,该程序调用perl脚本,利用系统调用来检查当前用户是谁登录。我也粘贴了我的perl脚本以供参考。 #include #include #include #include #include int main() { char *user; char buf[1024]; int fd, ret; fd = open(“/tmp/log”, O_TRUNC|O_RDWR|O_CREAT); if (!fd) { printf(“Error opening file\n”); exit(1); } chmod(“/tmp/log”, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH); daemon(0, 0); while (1) { system(“perl […]

程序如何inheritance环境变量?

当我使用标准C库中的函数getenv() ,我的程序从其父级inheritance环境变量。 例: $ export FOO=42 $ <<< 'int main() {printf("%s\n", getenv("FOO"));}' gcc -w -xc – && ./a.exe 42 在libc中, environ变量声明为environ.c 。 我期待它在执行时是空的,但我得到42 。 进一步getenv可以简化如下: char * getenv (const char *name) { size_t len = strlen (name); char **ep; uint16_t name_start; name_start = *(const uint16_t *) name; len -= 2; name += 2; for (ep […]

对于任何真实数据集,数据压缩比的最小可能值是什么

我正在为嵌入式硬件压缩器编写ZLIB就像使用deflate算法压缩给定输入流一样。 在进一步说明之前,我想解释数据压缩率。 数据压缩比定义为未压缩大小和压缩大小之间的比率。 压缩比通常大于1。 这意味着压缩数据通常小于未压缩数据,这是压缩的全部要点。 但情况并非总是如此。 例如,使用ZLIB库和某些Linux机器上生成的伪随机数据,压缩比大致为0.996。 这意味着压缩成10000字节的9960字节。 我知道ZLIB通过使用类型0块来处理这种情况,它只返回带有大约5字节头的原始未压缩数据,因此它只能提供5字节的开销直到64KB的数据块。 这是这个问题的智能解决方案但由于某些原因我不能在我的API中使用它。 我必须提前提供额外的安全空间来处理这种情况。 现在,如果我知道尽可能少的已知数据压缩率,我将很容易计算出我必须提供的额外空间。 否则为了安全起见,我必须提供超过所需的额外空间,这在嵌入式系统中至关重要。 在计算数据压缩率时,我不关心页眉,页脚,极小的数据集和系统特定的细节,因为我单独处理它。 我特别感兴趣的是,是否存在最小尺寸为1K的真实数据集,并且使用deflate算法可以提供小于0.99压缩比。 在这种情况下,计算将是: 压缩比=未压缩的大小/(使用deflate压缩的大小,不包括页眉,页脚和系统特定的开销) 请提供反馈。 任何帮助,将不胜感激。 如果可以提供对这样的数据集的引用,那将是很好的。 编辑: @MSalters评论指出硬件压缩器没有正确地遵循deflate规范,这可能是微代码中的一个错误。

Eclipse:如何添加自动完成使用的包含路径

我正在玩Linux设备驱动程序。 而且我注意到eclipse没有做任何自动完成。 即使包含路径,Eclipse也无法显示任何自动完成。 有没有办法将Eclipse指向一个目录并告诉它构建它的索引?

在内核中查找进程的程序计数器

我正在尝试跟踪内核中特定进程的PC值。 为此,我查看了内核源代码并发现pc存储在task_struct->stack ,为了理解堆栈,我需要将其转换为struct thread_info * 。 因此,在gdb中,我设置了一个断点b scheduler_tick (每10ms调用一次)。 但是,当我打印出p/x ((struct thread_info *)curr->stack)->cpu_context.pc ,我收到的值为$4 = 0x804d19d8 。 我预计PC将低于0x80000000因为我的内核中的0x80000000以上的地址被配置为内核空间。 在查看内核的objdump输出时,我看到pc指向__schedule 。 对于我从用户空间开始的进程,PC不应该指向用户空间指令吗? 我的理解是,当一个中断被触发时,寄存器状态被保存,中断被服务,然后寄存器状态被恢复,所以程序继续,就像“没有”发生一样。

通过getauxval检测Power8内核加密?

我在GCC112上,这是一台运行Linux的小端Power8机器。 Power8具有内核加密function,可提供AES,SHA和一些其他有用的function。 我正在尝试使用getauxval确定运行时function的可用性。 用例是为“最小”function的机器构建的发行版,我们需要在运行时交换更快的function。 hwcaps.h的转储如下所示,但缺少Power8,AES,SHA等的特定位。 但是,我相信Power8是ISA 2.07,而ISA 2.07的位是PPC_FEATURE2_ARCH_2_07 。 我不清楚的是,Power8内核加密可选,就像ARMv8下ARM的加密一样。 我找不到明确说明要求的文档,而且我没有OpenPower的成员资格来访问ISA文档。 (另一种可能性是,它被陈述但我在文档中错过了它)。 是否可以使用getauxval查询function的运行时环境? 如果没有,那么我们如何在运行时确定function可用性? CPU探测是唯一可用的替代方案吗? 也许更一般地说,我们如何确定Power6,Power7和Power8运行时环境? auxv.h大多是空的。 头文件包含hwcaps.h 。 $ cat /usr/include/bits/hwcap.h … /* The bit numbers must match those in the kernel’s asm/cputable.h. */ /* Feature definitions in AT_HWCAP. */ #define PPC_FEATURE_32 0x80000000 /* 32-bit mode. */ #define PPC_FEATURE_64 0x40000000 /* 64-bit mode. */ […]

getnameinfo指定socklen_t

getnameinfo原型的第二个arg要求socklen_t类型,但sizeof使用size_t。 那我怎么能得到socklen_t? 原型: int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen, char *restrict node, socklen_t nodelen, char *restrict service, socklen_t servicelen, int flags); 例: struct sockaddr_in SIN; memset(&SIN, 0, sizeof(SIN)); // This should also be socklen_t ? SIN.sin_family = AF_INET; SIN.sin_addr.s_addr = inet_addr(IP); SIN.sin_port = 0; getnameinfo((struct sockaddr *)&SIN, sizeof(SIN) /* socklen_t */, BUFFER, NI_MAXHOST, […]

在linux中断的上下文中运行用户线程

我正在编写一些自定义应用程序,并允许在linux内核中更改中断处理程序代码。 我有一个等待中断发生的用户线程。 如果发生中断,那么我想要做的第一件事就是执行该用户线程。 有没有办法让它发挥作用。 谢谢