2008-10-10 4 views
0

x86 어셈블리 언어로 COM 개체를 호출 할 수 있습니까? 그렇다면 어떻게?x86 어셈블리의 COM?

왜 이렇게하고 싶습니까? 소스가없는 두 개의 프로그램이 있다고 가정 해 봅시다. 바이너리 만 있으면됩니다. 그 중 하나는 COM 인터페이스를 구현하고 다른 하나는 그렇지 않습니다. 이 COM 인터페이스를 사용하여 두 번째 코드를 호출하는 첫 번째 프로그램에 코드를 삽입하려면 x86 어셈블리를 사용해야합니다.

답변

5

물론 C/C++ 컴파일러가하는 것처럼 가능합니다.

그러나 왜 하나님의 이름으로 이것을하고 싶습니까? 그것이 교육적인 가치를 지녔다면, 똑바로 C의 손으로 COM 물건을 확실하게하는 것이 트릭을 할 것입니다. 업데이트 된 질문을 감안할 때


, 당신은 DLL에서 COM 물건을 쓸 것을 제안하고 당신이 당신의 DLL을 호출하는 프로그램으로, 간단한의 x86 코드에서 다음 패치를 패치 할 프로그램에 해당 DLL을 주입하는 것 그것은 무거운 짐을지는 것입니다. 프로세스의 주소 공간에 DLL을 주입하는 기술을 기억하지는 않지만 적어도 몇 가지가 있습니다. AppInit 레지스트리 설정 (또는 이와 비슷한)은 하나입니다.

그러나 프로세스에 코드를 삽입하는 대부분의 방법은 보안 결함으로 간주되므로 (대부분 악성 코드에서 사용 된 것으로 생각됩니다) Microsoft는 대부분의 경우 (또는 모두)를 제거했을 수도 있다고 생각합니다. 최신 서비스 팩 또는 OS 버전

+0

OpenProcess/WriteProcessMemory가 여전히 작동합니다. 로더가 사용자 공간에 구현되어 있어야합니다. – Joshua

0

예 - COM은 주로 바이너리 API으로 설계되었지만 C/C++에서 구현하기가 쉽습니다. 그러나 사양은 C 또는 C++의 관점에서 아닙니다.

원본 COM 사양을 참조 할 수 있습니다. 복사본은 here이며 Microsoft 사이트의 어딘가에 묻어 야합니다.

업데이트 : 사용 사례가 직접 어셈블리를 사용해야하는 것은 아니지만 코드 삽입 기술을 사용할 수 있습니다. 삽입 할 코드를 컴파일하는 방법은 삽입하는 방법과는 다른 문제입니다.

1

원하는 작업을 수행하는 가장 쉬운 방법은 COM 통신을 수행하는 DLL을 만든 다음 다른 응용 프로그램이 DLL을로드하도록하는 코드를 삽입하는 것입니다. DLL injectino 기술을 사용하거나 응용 프로그램 자체를 어셈블리를 편집하여 LoadLibrary/GetProcAddress 등을 호출 할 수 있습니다.

편집 : BTW, 내가 찾은 바에 의하면 OllyDbg은 기존 어셈블리의 편집을위한 훌륭한 도구입니다. 신청.

1

나는

마이크 B는 가장 낮은 수준의 COM은에서가 가능한 것에 대해 말씀에 확장하려면 ... 마이크 B. 이것은 당신이하고 싶지 않은 무언가 같이 소리에 동의해야하지만, ABI (application binary interface); 즉, 메모리에있는 COM 객체의 레이아웃을 정의하며 모든 COM 객체는이 레이아웃을 따라야합니다. COM 객체 (x86 플랫폼에서)는 Visual C++ 컴파일러 (및 대부분의 다른 컴파일러)가 객체를 메모리에 레이아웃하는 것과 같은 방법으로 메모리에 배치됩니다. 이로 인해 C++ (및 C, 약간의 노력이 추가됨)가 COM 작업에 편리한 선택이됩니다. 즉, 어셈블리에서이 작업을 시도한 적이 한 번도 없지만 C에서 CodeProject에서 COM을 수행하는 방법에 대한 자습서가 있습니다.개념은 어셈블리로 번역하기 매우 쉽게이 있어야한다 :

CodeProject: COM in Plain C

0

당신은 hard way을 통해 갈 수 또는 당신은 tested and true 솔루션을 볼 수 있었다.
둘 다 어셈블리 언어가 필요하지 않습니다.

+0

둘 다 내가 추가해야하는 매우 단순한 기능 때문에 과잉 공격이다. 고마워요. 저는 DLL Injection을 사용했고, 광범위하게는 아니지만 Detours와 함께 놀았습니다. –