通过指针值将数据传递到DLL
Pass data to dll via pointer value
是否可以安全地传递指针的值(即变量驻留的地址)作为一个由同一主应用程序加载的另一个库的整数,然后为此创建一个指针地址并抓住值?
例如:
#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_t
或uintptr_t
。这些类型的提供以清楚地表达您的意图并确保(void*)
适合它们。
要牢固地擦除内存,您必须使用适当的API。在Windows上,即SecureZeroMemory
,最近的Unices是memset_s
。只要它是指向数据的指针,它不在乎它得到的指针。
相关文章:
- DLL共享数据的推荐方式是什么
- 在 EXE/DLL 之间传递数据
- C++ 安全数组在从 c# COM dll 返回时具有无效数据
- 如何处理错误"E1696命令行错误:无法在Visual Studio 2017中打开元数据文件"mscorlib.dll"?
- 放置在外部 DLL 中的类中的字符串数据的内存损坏
- 从 dll 读取矢量数据C++?
- 在 c++ 中的 dll 边界之间安全地传递数据
- 在 c++ 中,如何将 dll 获取的数据发送到 exe
- 在 CSharp 中使用正确的数据类型加载C++ dll
- 初始化 C# IntPtr 以接受来自非托管 C++ DLL 的数据?
- 使用P/Invoke从MFC DLL函数中读取VB.NET中的结构化数据
- 通过指针值将数据传递到DLL
- ATL ActiveX DLL 作为映射类型图像和数据加载了两次
- Winapi:钩函数中的非dll数据
- 将数据从Delphi DLL传递到C++应用程序中
- 将二进制数据从Qt/C++DLL传递到Delphi主机应用程序中
- 将数据从 Unity3D 传递到 C++ dll,反之亦然
- 在DLL的基地址处Win API ReadProcessMemory返回意外数据
- 从数组数据中缺少第一个元素的 DLL 返回C++结构
- 将字符串从 C# 传递到 c++ .dll会打乱数据