【问题标题】:Best datatype for a memdump of a specific address特定地址的 memdump 的最佳数据类型
【发布时间】:2018-03-07 17:07:47
【问题描述】:

我正在用 C 语言编写一个 memdump 应用程序,目标是打印一个特定地址的应用程序内存的真实片段。我已经拥有的代码是这样的:

void memdump(byte_t *ptr, long size ) {

...

  typedef unsigned char byte_t;
  byte_t data[size];
  //&data[0] = &ptr;
  byte_t * pointer_to_byte = data;


  for (size_t j = 0; j < size; j+=10) {
    printf("%p ",&data[j]);
    for (size_t i = j; i < j+10; i++) {
      printf("%02x ",*(pointer_to_byte+i));
    }
    for (size_t i = j; i < j+10; i++) {
      if (isprint(*(pointer_to_byte+i))) {
        printf("%c",*(pointer_to_byte+i));
      } else {
        printf("." );
      }
    }
      printf("\n" );
    }
}

main.c:

    void  *start_addr;
...
    scanf("%p", &start_addr);
...
    memdump( (byte_t*)start_addr, size );

您可以看到我使用数组来获取内存块,但这可能不是最好的方法。现在我想获取地址作为扫描参数,我的问题是获取此地址的最佳数据类型是什么,以及如何更改代码以便使用特定地址?我已经使用指针来打印数据和字符,所以我认为指针是最好的方式。

【问题讨论】:

  • [help-me] 请写一个 MCVE。你如何声明ptr?提示:&amp;data[0] = &amp;ptr; 没有做你希望做的事情。
  • 不,我已经发现 &data[0] = &ptr;不是这样。是的,我是一种混乱的人,我会编辑这个问题。
  • data 的意义何在?删除它,看看它会把你带到哪里。

标签: c pointers memory


【解决方案1】:

这个怎么样:

void memdump(byte_t *ptr, long size ) {
  byte_t * baseptr; /* base addr for each row */
  for (size_t j = 0; j < size; j+=10) { /* row loop */
    baseptr = ptr+j;
    printf("%p ",baseptr);
    for (size_t i = j; i < j+10; i++) { /* hex code */
      printf("%02x ",*(baseptr+i));
    };
    for (size_t i = j; i < j+10; i++) { /* char print */
      if (isprint(*(baseptr+i))) {
        printf("%c",*(baseptr+i));
      } else {
        printf(".");
      };
    };
    printf("\n" );
  };
};

【讨论】:

  • 如果大小不是 10 的倍数,您将在行循环的最后一次迭代中访问大小之外的内容。
  • 是的,它会一直持续到下一个 10 的倍数。
【解决方案2】:

void const *ptr 的最佳数据类型;其他一切都需要演员表。 size 也应该是 size_t 类型:

void memdump(void const *ptr, size_t size ) {
    uint8_t const *data = ptr;

    for (size_t i = 0; i < size; ++i) {
        ...

【讨论】:

    猜你喜欢
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    相关资源
    最近更新 更多