2012-03-29 4 views
3

Мне нужно поместить маркеры на код C++, который должен быть видимым в сборе или в двоичном формате. Кажется, это прямо вперед, чтобы сделать это за 32 с помощью ассемблерные:Как поставить маркеры сборки на код C++ (x64)

__asm { 
    NOP 
    NOP 
    NOP 
} 

или используя заявление сборки DB:

__asm { 
    DB 0x00, 0xFF, 0x10 
} 

Но VisualStudio 2005 и лучше не поддерживает встроенный ассемблер для x64. Есть ли способ сделать это? Вероятно, я могу сделать функцию в отдельном модуле сборки, но как я могу быть уверен, что компоновщик будет помещать фактическую сборку вместо CALL?

+1

Линкер не вводит инструкции 'CALL', он просто помещает в фактический адрес. Компилятор будет помещен в 'CALL' для вашей сборки. Но зачем вам это нужно? Не является ли «ЗВОНОК широко известный адрес» применимым в качестве маркера? – MSalters

+0

Да, это может быть так: найти маркер и его адрес, а затем найти CALL-адреса этого адреса. – ChatCloud

+0

Собственно, это хорошее решение. Существует некоторая взаимосвязанная статья http://www.codereversing.com/blog/?p=69 – ChatCloud

ответ

2

Определите глобальную изменчивую переменную где-нибудь, скажем volatile __int64 blah = 0;. Затем, где бы вы ни хотели, используйте _InterlockedCompareExchange64(&blah, SOME_UNIQUE_CONSTANT1, SOME_UNIQUE_CONSTANT2);. Вы получите инструкции по загрузке ECX:EBX с SOME_UNIQUE_CONSTANT1 и EDX:EAX с SOME_UNIQUE_CONSTANT2, а затем LOCK CMPXCHG8B (0xF0, 0x0F, 0xC7 и т. Д. - см. Инструкции по кодированию).

+0

спасибо за подробный ответ, это имеет смысл. – ChatCloud

1

MSDN говорит, что вы можете использовать встроенные функции.

+0

может быть более полезной для указания на '__nop' intrinsic: http://msdn.microsoft.com/en-us/library /aa983381(v=vs.80).aspx – Necrolis

+0

http://msdn.microsoft.com/en-US/library/26td21ds.aspx говорит: «Кроме того, оптимизатор может развить внутреннее по-разному». Интересно, может ли оптимизатор удалить NOP вообще. – ChatCloud

+1

@Activation - Оптимизатор может по-разному расширять внутреннее значение для разных параметров. Подобно тому, как делать «memcpy» лучше для блоков фиксированного размера, чем для переменной длины. Если вы добавите '__nop', вы, очевидно, хотите его там, поэтому компилятор не удалит его. –

0
//MyAsmCode.asm 
.code 
    MyFunction proc 
    ... 
    MyFunction endp 
end 

скомпилировать его (ml64.exe).

Вы получаете объект-файл (MS COFF 64): MyAsmCode.obj

В VS добавить MyAsmCode.obj для компоновщика дополнительные отд.

Теперь вы можете вызвать эту функцию. ;)

+0

Как вы можете быть уверены, что компоновщик будет встроить MyFunction вместо выполнения CALL? – ChatCloud

+0

Опиши нужную мне информацию, я могу помочь тебе – Evgeny

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

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