2012-07-01 1 views
4

У меня есть тестовая сборка, и я хочу, чтобы найти метод в файлеКак найти метод в файле сборки в шестнадцатеричном формате?

[CompilerGenerated] 
public bool get_CreateFlash() 
{ 
    return this.cZBH; 
} 

Я использую шестнадцатеричный редактор и шаблон для поиска

2B * 26 16 02 7B * * * * 0A 2B * 06 2A 

где * любые байты, потому что я не вижу точные байт таких как ILSpy.

Я нашел 1500 матчей, естественно, это геттер. Разные в 7B * * * *, как это

"2B 02 26 16 02 7B 1D 00 00 04 0A 2B 00 06 2A" 
"2B 02 26 16 02 7B 1E 00 00 04 0A 2B 00 06 2A" 
... 
etc. 

Как я могу найти то, что мне нужно?

ответ

7

Если вы используете ILDasm (часть SDK .NET Framework), он покажет вам соответствующие байты кода.

Чтобы показать их, перед отображением метода вам необходимо выбрать «Показать -> Показать байты». Я собрал небольшой пример приложения, чтобы проверить это, и получил следующее:

Disassembly of a simple property getter in ILDASM with "Show Bytes" enabled

Для того, чтобы использовать эти данные, важно знать, что байты на слева от «|» появляются в порядке .dll/.exe, а те, которые справа, кодируются в little-endian. Имея это в виду, я искал EXE-файл для следующего (заметим, что я выделенному байты, которые находятся в прямой порядок байтов порядка):

00 02 7b 0a 2b 06 2a

В моем (хотя и небольшом) тестовом исполняемом файле эта последовательность байтов произошла только один раз.

Обратите внимание, что на скриншоте выше также указывается метод RVA (относительный виртуальный адрес). Чтобы преобразовать это в местоположение файла, вам нужно определить макет исполняемого файла. Есть ряд доступных инструментов PE, но я использовал dumpbin, который поставляется с Visual Studio для просмотра заголовков PE (dumpbin /headers <your exe name>). Соответствующие данные для этого исполняемого файла:

SECTION HEADER #1 
    .text name 
    1824 virtual size 
    2000 virtual address (00402000 to 00403823) 
    1A00 size of raw data 
    200 file pointer to raw data (00000200 to 00001BFF) 
     0 file pointer to relocation table 
     0 file pointer to line numbers 
     0 number of relocations 
     0 number of line numbers 
60000020 flags 
     Code 
     Execute Read

Здесь виртуальный адрес Секции .text указывается как 0x2000, и имеет виртуальный размер 0x1824 байт. Поскольку метод имеет RVA 0x2464, он должен находиться в этом разделе. «Указатель файла исходных данных» на выходе из dumpbin указывает, что раздел, содержащий наш метод начинается 0x200 в исполняемом файле, так что мы можем вычислить смещение метода в исполняемый файл как:

(Method RVA - Section RVA) + File Location 
= (0x2464 - 0x2000) + 0x200 
= 0x664

Переход к местоположению 0x664 в тестовом исполняемом файле, байты, которые мы искали, действительно можно увидеть там (они не совсем в этом месте, но несколько байтов после него, так как есть маленький заголовок метода перед байтами IL).

+0

Благодарим за интересное и полезное описание. В моем случае я использую Reflector или ILSpy для достижения этого метода. Это только один способ заставить его начать с другого метода. И в этом месте я вижу только то, что показывает Reflector/ILspy. Они не показывают шестнадцатеричные коды. Но я вижу RVA для метода. Большой! – Oleg

+0

Отличный ответ! Я не знал, что у ildasm был вид байтов!Кроме того, в дополнение к вашему ответу кажется, что dumpbin не нужен, поскольку ildasm имеет представление «заголовки», которое отображает всю необходимую информацию. – JoeKir

 Смежные вопросы

  • Нет связанных вопросов^_^