COM из сборки x86? - PullRequest
       34

COM из сборки x86?

0 голосов
/ 10 октября 2008

Можно ли вызывать объекты COM через язык ассемблера x86? Если да, то как?

Зачем мне это делать? Допустим, у меня есть две программы, для которых у меня нет исходного кода - все, что у меня есть, это двоичные файлы. Один из них реализует интерфейс COM, другой нет. Я хочу внедрить код в первую программу, чтобы вызвать во вторую, используя этот COM-интерфейс, и для этого мне нужно использовать сборку x86.

Ответы [ 5 ]

5 голосов
/ 10 октября 2008

Конечно, это возможно - фактически это то, что делает компилятор C / C ++.

Но почему, во имя Бога, ты хочешь сделать это? Если бы это было для образовательной ценности, то, конечно, выполнение COM-вещей вручную в прямом C помогло бы.


Учитывая обновленный вопрос, я бы предложил вам записать содержимое COM в DLL и вставить эту DLL в программу, которую вы хотите исправить, а затем вставить в программу простой код x86, чтобы вызвать вашу DLL, которая выполняет тяжелую работу. лифтинг. Я не помню техник внедрения DLL в адресное пространство процесса, но есть по крайней мере пара. Параметр реестра AppInit (или что-то в этом роде) один.

Однако я думаю, что большинство способов внедрения кода в процесс считаются недостатками безопасности (и часто используются вредоносными программами), поэтому я подозреваю, что Microsoft, возможно, удалила многие, если не большинство (или все) из более последние пакеты обновлений или версии ОС.

1 голос
/ 10 октября 2008

Я должен согласиться с Майком Б. Это звучит как то, что вы не хотите делать, но ...

Чтобы расширить то, что сказал Майк Б о том, что это возможно, на самом низком уровне COM находится ABI (двоичный интерфейс приложения); то есть он определяет расположение объектов COM в памяти, и все объекты COM должны следовать этой схеме. COM-объекты (на платформе x86) располагаются в памяти так же, как компилятор Visual C ++ (и большинство других компиляторов) размещает объекты в памяти. Это делает C ++ (и C, с некоторыми дополнительными усилиями) удобным выбором для работы с COM. Тем не менее, я никогда не видел, чтобы кто-нибудь пробовал это в сборке, но есть руководство по созданию COM в C, доступное на CodeProject. Концепции, которые там должны быть достаточно легко перевести в сборку:

CodeProject: COM в простом C

1 голос
/ 10 октября 2008

Самый простой способ сделать то, что вы хотите, - это, вероятно, создать DLL, которая осуществляет связь COM, а затем внедрить код, который заставит другое приложение загрузить DLL. Вы можете использовать технику DLL injectino или просто отредактировать сборку самого приложения для вызова LoadLibrary / GetProcAddress и т. Д.

Редактировать: Кстати, я обнаружил, что OllyDbg - отличный инструмент для редактирования сборки существующего приложения.

0 голосов
/ 10 октября 2008

Вы можете пройти трудный путь или вы можете найти проверенное и истинное решение.
Ни один из них не требует ассемблера.

0 голосов
/ 10 октября 2008

Да - COM разработан в основном как двоичный API , хотя и имеет очень простую реализацию из C / C ++. Тем не менее, спецификация не в терминах C или C ++.

Вы можете обратиться к исходной спецификации COM, здесь есть копия , и она также должна быть похоронена где-то на сайте Microsoft.

Обновление : ваш сценарий использования не требует непосредственного использования ассемблера, можно использовать любой метод внедрения кода. То, как вы компилируете код для внедрения, отличается от того, как вы вводите его.

...