Что я делаю, так это внедряю DLL в работающий процесс. Затем я продолжаю проверять некоторую информацию об этом процессе, такую как версии и т. Д. Моя проблема в том, что я не могу получить доступ к строке в файле сборки, которая содержит номер ревизии, которую я хочу дважды проверить. Вот что у меня так далеко:
__declspec(naked) void CheckBuild()
{
char* revision;
__asm {
sub esp, __LOCAL_SIZE
pushad
pushfd
mov revision, dword ptr 0x5F5200
}
printf("Detected revision ID: %u\n", revision);
__asm {
popfd
popad
add esp, __LOCAL_SIZE
retn
}
}
Для этого учебного материала адрес строки, который я получаю через IDA и который я проверял с помощью CheatEngine и OllyDbg, является постоянным.
Однако, независимо от того, что я пытаюсь, я всегда получаю 0x5F5200 в десятичном виде, что, безусловно, не то, что я ожидаю. Я почти все перепробовал, включая Леа и других, но до сих пор не получил верную строку.
Кто-нибудь может указать мне правильное направление?
вам не хватает «разыменования»:
mov revision, dword ptr [0x5F5200]
которая не является действительной инструкцией, так как имеет два косвенных
mov eax, dword ptr [0x5F5200]
mov revision, eax
если значение действительно строка, значит что-то не так:
printf("Detected revision ID: %s\n", 0x5F5200)
printf("Detected revision ID: %s\n", revision)
Формат строки
Если строка является Unicode, вы должны использовать
printf("Detected revision ID: %S\n", revision);
(обратите внимание, что с wprintf все наоборот:% s для строки широких символов и% s для строки символов).
Наконец, если строка не обязательно заканчивается нулем, но имеет фиксированную длину, вам необходимо скопировать ее с адреса в локальный буфер и обеспечить нулевое завершение перед печатью.
Других решений пока нет …