x86 어셈블리 언어로 COM 개체를 호출 할 수 있습니까? 그렇다면 어떻게?x86 어셈블리의 COM?
왜 이렇게하고 싶습니까? 소스가없는 두 개의 프로그램이 있다고 가정 해 봅시다. 바이너리 만 있으면됩니다. 그 중 하나는 COM 인터페이스를 구현하고 다른 하나는 그렇지 않습니다. 이 COM 인터페이스를 사용하여 두 번째 코드를 호출하는 첫 번째 프로그램에 코드를 삽입하려면 x86 어셈블리를 사용해야합니다.
x86 어셈블리 언어로 COM 개체를 호출 할 수 있습니까? 그렇다면 어떻게?x86 어셈블리의 COM?
왜 이렇게하고 싶습니까? 소스가없는 두 개의 프로그램이 있다고 가정 해 봅시다. 바이너리 만 있으면됩니다. 그 중 하나는 COM 인터페이스를 구현하고 다른 하나는 그렇지 않습니다. 이 COM 인터페이스를 사용하여 두 번째 코드를 호출하는 첫 번째 프로그램에 코드를 삽입하려면 x86 어셈블리를 사용해야합니다.
물론 C/C++ 컴파일러가하는 것처럼 가능합니다.
그러나 왜 하나님의 이름으로 이것을하고 싶습니까? 그것이 교육적인 가치를 지녔다면, 똑바로 C의 손으로 COM 물건을 확실하게하는 것이 트릭을 할 것입니다. 업데이트 된 질문을 감안할 때
그러나 프로세스에 코드를 삽입하는 대부분의 방법은 보안 결함으로 간주되므로 (대부분 악성 코드에서 사용 된 것으로 생각됩니다) Microsoft는 대부분의 경우 (또는 모두)를 제거했을 수도 있다고 생각합니다. 최신 서비스 팩 또는 OS 버전
예 - COM은 주로 바이너리 API으로 설계되었지만 C/C++에서 구현하기가 쉽습니다. 그러나 사양은 C 또는 C++의 관점에서 아닙니다.
원본 COM 사양을 참조 할 수 있습니다. 복사본은 here이며 Microsoft 사이트의 어딘가에 묻어 야합니다.
업데이트 : 사용 사례가 직접 어셈블리를 사용해야하는 것은 아니지만 코드 삽입 기술을 사용할 수 있습니다. 삽입 할 코드를 컴파일하는 방법은 삽입하는 방법과는 다른 문제입니다.
원하는 작업을 수행하는 가장 쉬운 방법은 COM 통신을 수행하는 DLL을 만든 다음 다른 응용 프로그램이 DLL을로드하도록하는 코드를 삽입하는 것입니다. DLL injectino 기술을 사용하거나 응용 프로그램 자체를 어셈블리를 편집하여 LoadLibrary/GetProcAddress 등을 호출 할 수 있습니다.
편집 : BTW, 내가 찾은 바에 의하면 OllyDbg은 기존 어셈블리의 편집을위한 훌륭한 도구입니다. 신청.
나는
마이크 B는 가장 낮은 수준의 COM은에서가 가능한 것에 대해 말씀에 확장하려면 ... 마이크 B. 이것은 당신이하고 싶지 않은 무언가 같이 소리에 동의해야하지만, ABI (application binary interface); 즉, 메모리에있는 COM 객체의 레이아웃을 정의하며 모든 COM 객체는이 레이아웃을 따라야합니다. COM 객체 (x86 플랫폼에서)는 Visual C++ 컴파일러 (및 대부분의 다른 컴파일러)가 객체를 메모리에 레이아웃하는 것과 같은 방법으로 메모리에 배치됩니다. 이로 인해 C++ (및 C, 약간의 노력이 추가됨)가 COM 작업에 편리한 선택이됩니다. 즉, 어셈블리에서이 작업을 시도한 적이 한 번도 없지만 C에서 CodeProject에서 COM을 수행하는 방법에 대한 자습서가 있습니다.개념은 어셈블리로 번역하기 매우 쉽게이 있어야한다 :
당신은 hard way을 통해 갈 수 또는 당신은 tested and true 솔루션을 볼 수 있었다.
둘 다 어셈블리 언어가 필요하지 않습니다.
둘 다 내가 추가해야하는 매우 단순한 기능 때문에 과잉 공격이다. 고마워요. 저는 DLL Injection을 사용했고, 광범위하게는 아니지만 Detours와 함께 놀았습니다. –
OpenProcess/WriteProcessMemory가 여전히 작동합니다. 로더가 사용자 공간에 구현되어 있어야합니다. – Joshua