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 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题