小编Adi*_*Adi的帖子

如何编写信号处理程序来捕获SIGSEGV?

我想写一个信号处理程序来捕获SIGSEGV.我使用保护内存块进行读写

char *buffer;
char *p;
char a;
int pagesize = 4096;

mprotect(buffer,pagesize,PROT_NONE)
Run Code Online (Sandbox Code Playgroud)

这可以保护从缓冲区开始的内存大小字节的内存,防止任何读取或写入.

其次,我尝试读取内存:

p = buffer;
a = *p 
Run Code Online (Sandbox Code Playgroud)

这将生成一个SIGSEGV,我的处理程序将被调用.到现在为止还挺好.我的问题是,一旦调用处理程序,我想通过这样做来改变内存的访问写入

mprotect(buffer,pagesize,PROT_READ);
Run Code Online (Sandbox Code Playgroud)

并继续正常运行我的代码.我不想退出该功能.在将来写入相同内存时,我想再次捕获信号并修改写入权限,然后记录该事件.

这是代码:

#include <signal.h>
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/mman.h>

#define handle_error(msg) \
    do { perror(msg); exit(EXIT_FAILURE); } while (0)

char *buffer;
int flag=0;

static void handler(int sig, siginfo_t *si, void *unused)
{
    printf("Got SIGSEGV at address: 0x%lx\n",(long) si->si_addr);
    printf("Implements the handler only\n");
    flag=1;
    //exit(EXIT_FAILURE);
}

int main(int argc, char *argv[])
{ …
Run Code Online (Sandbox Code Playgroud)

c linux system-calls mprotect signal-handling

68
推荐指数
4
解决办法
7万
查看次数

如何在Linux tclsh中通过光标键获取命令历史记录

可以使用TCL shell(tclsh)中的光标键(如向上箭头键)获取命令历史记录.

我正在使用linux版本2.6.21在fedora上运行tclsh.

linux shell scripting tcl expect

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

理解简单C程序生成的汇编代码

我试图通过使用gdb的反汇编程序检查它来了解简单C程序的汇编级代码.

以下是C代码:

#include <stdio.h>

void function(int a, int b, int c) {
   char buffer1[5];
   char buffer2[10];
}

void main() {
  function(1,2,3);
}
Run Code Online (Sandbox Code Playgroud)

以下是两个反汇编代码mainfunction

gdb) disass main
Dump of assembler code for function main:
0x08048428 <main+0>:    push   %ebp
0x08048429 <main+1>:    mov    %esp,%ebp
0x0804842b <main+3>:    and    $0xfffffff0,%esp
0x0804842e <main+6>:    sub    $0x10,%esp
0x08048431 <main+9>:    movl   $0x3,0x8(%esp)
0x08048439 <main+17>:   movl   $0x2,0x4(%esp)
0x08048441 <main+25>:   movl   $0x1,(%esp)
0x08048448 <main+32>:   call   0x8048404 <function>
0x0804844d <main+37>:   leave  
0x0804844e <main+38>:   ret
End of assembler dump.

(gdb) …
Run Code Online (Sandbox Code Playgroud)

c linux assembly stack disassembly

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

我可以获得在键盘上按下按键的时间

我正在开展一个项目,我必须根据用户的击键风格开发生物密码.假设用户输入密码20次,他的击键记录如下

holdtime:按下特定键的时间.有向图时间:按下不同键的时间.

假设用户键入密码"COMPUTER".我需要知道按下每个键的时间.就像是 :

上述密码的保持时间是

C-- 200ms O-- 130ms M-- 150ms P-- 175ms U-- 320ms T-- 230ms E-- 120ms R-- 300ms

这背后的理性是,每个用户都有不同的保持时间.说一个老人正在输入密码,他将花费更多时间然后学生.它对于特定的人来说是独一无二的.要完成这个项目,我需要记录按下的每个键的时间.如果有人能指导我如何获得这些时间,我将不胜感激.

从这里编辑..语言并不重要,但我更喜欢它.我更感兴趣的是获取数据集.

c c++ python unix linux

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

我可以使用pcap库接收ipv6数据包吗?

我想将hping3转换为hping6.hping3使用Pcap库接收IPv4数据包.但是我需要接收IPv6数据包.

c tcl ipv6 pcap libpcap

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

如何在choc的内存中存储4个字节的整数值,该块被malloced作为char类型

我已经分配了一大块char类型的内存,大小就是10 MB(即mem_size = 10):

int mem_size = 10; 
char *start_ptr;
if((start_ptr= malloc(mem_size*1024*1024*sizeof(char)))==NULL) {return -1;}
Run Code Online (Sandbox Code Playgroud)

现在我想将大小信息存储在内存块的标题中.为了让自己更清楚,让我们说:start_ptr = 0xaf868004(这是我从执行中得到的值,它每次都会改变).

现在我想把大小信息放在这个指针的开头,即 *start_ptr = mem_size*1024*1024;.

但是我无法将这些信息放入start_ptr.我认为原因是因为我的ptr类型char只需要一个字节,但我试图存储int哪个需要4个字节,这是问题所在.

我不知道如何解决这个问题..

c type-conversion

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

我如何使用strace来了解我的C程序中的系统调用

我想知道如何使用strace跟踪我的C程序中的系统调用以及如何使用它来调试我的代码.

c system-calls strace

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

如何在TCL代码中找到错误

我正在学习TCL,并想知道如何在代码中找出错误.我的意思是什么行没有发生错误或如何调试它.

以下是我正在尝试的代码:

proc ldelete {list value}{
    set ix [lsearch -exact $list $value]
    if{$ix >=0}{
        return [lreplace $list $ix $ix]
    } else {
        return $list
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是我得到的错误:

 extra characters after close-brace
Run Code Online (Sandbox Code Playgroud)

我将感谢你的帮助.

谢谢aditya

tcl syntax-error

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