m0_67745785 2022-03-06 23:38 采纳率: 100%
浏览 45
已结题

帮我看看我应该学哪种语言才能做出这个

当然,如果你正常遍历的话是发现不了虚拟地址的,因为一般使用的读写函数是syscall下的read,这个api呢是读的物理地址
所以第二种则是使用linux的函数“pagemap”将物理地址转换为“缺页地址”,从而去过滤掉“缺页地址”
以下这段就是pagemap实现的整个函数方法

class pagemap
{
private:
int pagemap_fd;
int ipid = -1;

// uint64_t page_size;
public:
bool init(int pid)
{

char pagemap_file[BUFSIZ];
snprintf(pagemap_file, sizeof(pagemap_file), "/proc/%d/pagemap", pid);
// pagemap_fd = open(pagemap_file, O_RDONLY);
pagemap_fd=syscall(__NR_openat,AT_FDCWD,pagemap_file,O_RDONLY,777);
// int fd=syscall(__NR_openat,AT_FDCWD,pagemap_file,O_RDONLY,777);
if (pid < 0) {
return false;
}
if (this->pagemap_fd < 0) {
return 1;
}

if (!f)
{
return false;
}*/
this->ipid=pid;
return true;
}

bool isVirtualAddress(long int address) {
// WARNING: Already detected by tencent

int pageSize = getpagesize();
unsigned long v_pageIndex = address / pageSize;            //虚地址页数
unsigned long v_offset = v_pageIndex * sizeof(uint64_t);  //计算在/proc/pid/page_map文件中的偏移量
unsigned long page_offset = address % pageSize;            //计算虚拟地址在页面中的偏移量
uint64_t item = 0;                                        //存储对应项的值

// long int var[1] = { 0 };
vm_readv(v_offset, &item, sizeof(uint64_t));
// pread(pagemap_fd, &item, sizeof(uint64_t), v_offset);
if ((((uint64_t) 1 << 63) & item) != 0)
{
return false;
}
else
{
return true;
}
return item;
}

void closer()
{
close(this->pagemap_fd);

}

int getDword(long int addr)
{
if (!isVirtualAddress(addr) || addr <= 0)
{
return 0;
}
else
{
long int var[1] = { 0 };
vm_readv(addr, var, 8);
return var[0];
}
}

/* 读浮点型内存 */

float getFloat(long int addr)
{
if (!isVirtualAddress(addr) || addr <= 0)
{
return 0;
}
else
{
float var[1] = { 0 };
vm_readv(addr, var, 8);
return var[0];
}
}

long int getZZ(long int addr)
{
if (!isVirtualAddress(addr) || addr <= 0)
{
return 0;
}
else
{
long int var[1] = { 0 };
vm_readv(addr, var, 8);
// printf("%lx\n",addr);

return var[0];
}
}

long int getword(long int addr)
{
if (!isVirtualAddress(addr) || addr <= 0)
{
return 0;
}
else
{
long int var[1] = { 0 };
vm_readv(addr, var, 2);
return var[0];
}
}

float WriteFloat(long int addr, float value)
{
vm_writev(addr, &value, 4);

}

int WriteDword(long int addr, int value)
{

vm_writev(addr, &value, 4);

}

};

  • 写回答

1条回答 默认 最新

  • _雪菜肉丝面_ 2022-03-07 19:27
    关注

    握草(C++)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月16日
  • 已采纳回答 3月8日
  • 创建了问题 3月6日

悬赏问题

  • ¥15 vc6.0中想运行代码的时候总是提示无法打开文件是怎么回事
  • ¥25 关于##爬虫##的问题,如何解决?:
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型
  • ¥50 buildozer打包kivy app失败
  • ¥30 在vs2022里运行python代码
  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题
  • ¥50 大二 微机原理 课程design 有偿