Если вы используете ILDasm (часть SDK .NET Framework), он покажет вам соответствующие байты кода.
Чтобы показать их, перед отображением метода вам необходимо выбрать «Показать -> Показать байты». Я собрал небольшой пример приложения, чтобы проверить это, и получил следующее:
Для того, чтобы использовать эти данные, важно знать, что байты на слева от «|» появляются в порядке .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).
Благодарим за интересное и полезное описание. В моем случае я использую Reflector или ILSpy для достижения этого метода. Это только один способ заставить его начать с другого метода. И в этом месте я вижу только то, что показывает Reflector/ILspy. Они не показывают шестнадцатеричные коды. Но я вижу RVA для метода. Большой! – Oleg
Отличный ответ! Я не знал, что у ildasm был вид байтов!Кроме того, в дополнение к вашему ответу кажется, что dumpbin не нужен, поскольку ildasm имеет представление «заголовки», которое отображает всю необходимую информацию. – JoeKir