我想写一个信号处理程序来捕获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) 可以使用TCL shell(tclsh)中的光标键(如向上箭头键)获取命令历史记录.
我正在使用linux版本2.6.21在fedora上运行tclsh.
我试图通过使用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)
以下是两个反汇编代码main和function
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) 我正在开展一个项目,我必须根据用户的击键风格开发生物密码.假设用户输入密码20次,他的击键记录如下
holdtime:按下特定键的时间.有向图时间:按下不同键的时间.
假设用户键入密码"COMPUTER".我需要知道按下每个键的时间.就像是 :
上述密码的保持时间是
C-- 200ms O-- 130ms M-- 150ms P-- 175ms U-- 320ms T-- 230ms E-- 120ms R-- 300ms
这背后的理性是,每个用户都有不同的保持时间.说一个老人正在输入密码,他将花费更多时间然后学生.它对于特定的人来说是独一无二的.要完成这个项目,我需要记录按下的每个键的时间.如果有人能指导我如何获得这些时间,我将不胜感激.
从这里编辑..语言并不重要,但我更喜欢它.我更感兴趣的是获取数据集.
我想将hping3转换为hping6.hping3使用Pcap库接收IPv4数据包.但是我需要接收IPv6数据包.
我已经分配了一大块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个字节,这是问题所在.
我不知道如何解决这个问题..
我想知道如何使用strace跟踪我的C程序中的系统调用以及如何使用它来调试我的代码.
我正在学习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