Итак, у меня есть две разные библиотеки DLL, которые я добавляю в приложение. Я пытаюсь перенести dll, написанную кем-то другим, с ржавчины на С++. Когда я ввожу их обоих, я читаю разные значения из памяти в каждом. хотя я получаю тот же базовый адрес. в Rust для получения базового адреса используется пакет toy_arms, а в моем порту C++ я использую:
Я получаю доступ к данным из памяти в Rust следующим образом:
Код: Выделить всё
*((module_base_address + GNAMES_OFFSET) as *mut usize))
и вот так в c++:
Код: Выделить всё
*(unsigned long long *)(module_base_address + GNAMES_OFFSET)
однако я всегда получаю 0 для строки C++, а для кода Rust это значение варьируется (примеры: 1974523893904, 2751407560848). Разработчик кода ржавчины также использовал эту строку для настройки точки входа, если это имеет значение:
который является частью пакета toy_arms, а я просто использую:
Код: Выделить всё
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
точка входа. Я написал тестовую программу с использованием LoadLibraryA для созданной мною dll и смог вызвать исполняемый файл в программе, загружающей dll, вот так:
Код: Выделить всё
typedef int(__stdcall* printStringFunc)(const char *);
printStringFunc myPrintString = (printStringFunc)(baseAddress + 0x12330);
поэтому я знаю, что это возможно. Есть идеи, что происходит?
Подробнее здесь:
https://stackoverflow.com/questions/791 ... -in-memory