Как перевести aKernel32_dll_0: unicode 0, ‹KERNEL.32›, 0 в юридическую декларацию?

Я использую IDA Pro для дизассемблирования двоичных файлов SPEC 2006 в 32-разрядной версии Windows 7.

Он генерирует переменную, объявленную следующим образом:

aKernel32_dll_0 unicode 0, <KERNEL32.DLL>,0

В разделе .text я нахожу использование этой переменной следующим образом:

push    offset aKernel32_dll_0
call    ds:__imp__GetModuleHandleW@4
......

Что я пытаюсь сделать, так это собрать этот код/данные.

Итак, мои вопросы:

  1. Таким образом, в основном объявление типа **aKernel32_dll_0 unicode 0, ,0 ** не может быть напрямую пересобрано с помощью masm/nasm, как мне его настроить?

  2. Я просто изменяю его в aKernel32_dll_0 dd 0, и код выглядит следующим образом:

введите здесь описание изображения

и каждый раз после вызова ds:__imp__GetModuleHandleW@4 возникала странная ситуация.

Сравнение с исходным двоичным файлом с использованием Ollydbg:

введите здесь описание изображения

Получается, что aKernel32_dll_0 на самом деле является внешней переменной? Итак, правильный ли способ удалить объявление и объявить эту переменную extern? Если да, то каково имя этой переменной? Я не думаю, что это Kernel32_dll_0, так как это похоже на случайное имя, сгенерированное IDA Pro.

Может ли кто-нибудь помочь мне? Спасибо!


person lllllllllllll    schedule 17.02.2014    source источник


Ответы (1)


Конечно, вы можете просто скопировать любые байты в исходном материале в виде массива DB. Тем не менее, мы знаем, что GetModuleHandleW принимает имя модуля Unicode в качестве аргумента. В синтаксисе nasm это может выглядеть так:

aKernel32_dll_0 DW __utf16__('KERNEL32.DLL'), 0
person Jester    schedule 17.02.2014
comment
masm, похоже, не поддерживает utf16 из коробки, но есть библиотеки макросов, которые поддерживают. Однако для этой простой строки ascii вы можете просто вставить 0 байтов вручную, например aKernel32_dll_0 DB 'K', 0, 'E', 0 ..., вы поняли. Должен заканчиваться 3 нулями (один — старший байт последнего wchar, два других — терминаторы). Или вы можете сохранить это как ansi и переключить вызов функции на использование GetModuleHandleA. - person Jester; 24.02.2014