通过指针值将数据传递到DLL

Pass data to dll via pointer value

本文关键字:DLL 数据 指针      更新时间:2023-10-16

是否可以安全地传递指针的值(即变量驻留的地址)作为一个由同一主应用程序加载的另一个库的整数,然后为此创建一个指针地址并抓住值?

例如:

#define __STDC_FORMAT_MACROS
#include <stdio.h>
#include <inttypes.h>
#include <string.h>
#include <stdlib.h>
struct Book {
    char            title[50];
    char            subject[100];
    int             book_id;
};
void
DescribeBook(char *label, struct Book *someBook)
{
    printf("n%sn", label);
    printf("Book title : %sn", someBook->title);
    printf("Book subject : %sn", someBook->subject);
    printf("Book book_id : %dn", someBook->book_id);
}
void mem_wipe(uint8_t *ptr, uint64_t len) {
  while(len--) {
    *(ptr++) = 0;
  }
}
void
SomewhereElse(char *addressAsString)
{
    struct Book     *myBook;
  //PRETEND THIS IS IN A DLL SOMEWHERE ELSE!!!
    uint64_t        idataptr;
    sscanf(addressAsString, "%" PRIu64, &idataptr);
    mem_wipe((uint8_t *)addressAsString, strlen(addressAsString));
    free(addressAsString);
    myBook = (struct Book *)idataptr;
    DescribeBook("AFTER", myBook);
    printf("Data Address (int): %"PRIu64"n", idataptr);
    printf("Data Address (string): %sn", addressAsString);
    strcpy(myBook->title, "Foo");
    strcpy(myBook->subject, "Bar");
    myBook->book_id = 7654321;
}
int
main(void)
{
    struct Book     myBook;
    uint8_t        *dataptr;
    char           *addressAsString;
    strcpy(myBook.title, "Hello");
    strcpy(myBook.subject, "World");
    myBook.book_id = 1234567;

    DescribeBook("BEFORE", &myBook);
    printf("Data Address (int): %"PRIu64"n", (uint64_t)&myBook);
    dataptr = (uint8_t *) & myBook;
    asprintf(&addressAsString, "%" PRIu64, (uint64_t) dataptr);
    if (addressAsString == NULL) {
         fprintf(stderr, "Error in asprintfn");
          return 1;
    }
    printf("Data Address (string): %sn", addressAsString);
    SomewhereElse(addressAsString);
    DescribeBook("FINAL (modified)", &myBook);
    printf("Data Address (string after wipe): %sn", addressAsString);
    return 0;
}

请注意,它是可以运行的,但是假装()实际上是在一个完全独立的dll中,并且通过环境设置或某些东西

传递了地址串。

特别是 - 我的问题是"地址是地址是地址",或者是否在跨DLL屏障之间进行内存映射的方式会改变某些内容,以便123!= 123("虚拟内存)"answers"分页"是我认为的相关术语,尽管我不太了解它们)

(实际用例是通过qt-> vlc-qt或qmlvlc(c )传递到libvlc(gnu99 c),并通过自定义过滤器设置发送指针值)

作为后续行动 - 我们进一步假设我们要以安全的方式擦除内存,并通过优化防止其可能的熔断。这样的指针是否可以声明为波动(我仍然不清楚它的工作原理 - 但是搜索安全擦除的示例代码导致了这一点)?

您不能将指针作为int传递,因为您不知道int是否足够大以容纳指针。您也不应该使用像int64_t这样的明确大小的整数,因为它们使您的意图混淆。要将指针作为整数传递,您应该使用intptr_tuintptr_t。这些类型的提供以清楚地表达您的意图并确保(void*)适合它们。

要牢固地擦除内存,您必须使用适当的API。在Windows上,即SecureZeroMemory,最近的Unices是memset_s。只要它是指向数据的指针,它不在乎它得到的指针。