Получение строки с использованием встроенного ASM

Что я делаю, так это внедряю 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 в десятичном виде, что, безусловно, не то, что я ожидаю. Я почти все перепробовал, включая Леа и других, но до сих пор не получил верную строку.

Кто-нибудь может указать мне правильное направление?

0

Решение

  1. вам не хватает «разыменования»:

    mov revision, dword ptr [0x5F5200]

которая не является действительной инструкцией, так как имеет два косвенных

mov eax, dword ptr [0x5F5200]
mov revision, eax
  1. если значение действительно строка, значит что-то не так:

    • если строка хранится в 0x5F5200, вы просто используете

    printf("Detected revision ID: %s\n", 0x5F5200)

    • если адрес строки хранится в 0x5F5200, вы должны использовать

    printf("Detected revision ID: %s\n", revision)

  2. Формат строки

Если строка является Unicode, вы должны использовать

printf("Detected revision ID: %S\n", revision);

(обратите внимание, что с wprintf все наоборот:% s для строки широких символов и% s для строки символов).

Наконец, если строка не обязательно заканчивается нулем, но имеет фиксированную длину, вам необходимо скопировать ее с адреса в локальный буфер и обеспечить нулевое завершение перед печатью.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]