Qt 프레임 워크를 사용하여 빌드 된 제 3 자 실행 파일에 DLL을 주입하는 C# 응용 프로그램을 작성했습니다. 이 DLL은 EasyHook을 사용하여 여러 특정 기능에 대한 호출을 차단합니다. 주입 된 코드가 호출되면, 나는이 함수에 대한 매개 변수 인 객체의 일부를 검사하려고 시도합니다.C#에서 C++/CLI를 통해 네이티브 객체에 액세스!
static extern bool XmlParse(IntPtr Reader, IntPtr Source)
내가 싶습니다 :
예를 들어, 나는 몇 가지 XML 구문 분석 만든 전화 도청 한 내 C# 코드에서
virtual bool __thiscall QXmlSimpleReader::parse(class QXmlInputSource const &)
을,이 일치하는의 PInvoke 서명이 "Source"클래스의 멤버 인 "data()"함수를 호출하십시오. 즉, QXmlSimpleReader는 QXmlInputSource에서 원시 XML을 구문 분석하지만, 그렇게하기 전에이 "data()"함수를 통해 원시 XML을 조사하려고합니다.
여기 전문가 중 한 분의 조언으로 C++/CLI를 사용하여 개체에 기본적으로 액세스하려고했습니다 (Calling methods in third-party DLLs 참조).
헤더 : 나는 C# 코드에서 IntPtr입니다을 받아 C++에서 래퍼 객체를 구축 한
public ref class QXmlInputSource
{
public:
// Constructor must be called with C# IntPtr
QXmlInputSource(IntPtr Ptr);
bool LoadQt(void);
bool UnloadQt(void);
String^ Data();
private:
// Pointer to the native Qt object
void * Native;
HINSTANCE DllHandle;
// SIGNATURE: virtual QString QXmlInputSource::data() const
typedef void * (__thiscall *QXmlInputSource_Data)(void *);
QXmlInputSource_Data fpData;
};
CPP 파일 :
QXmlInputSource::QXmlInputSource(IntPtr Ptr)
{
LoadQt();
Native = Ptr.ToPointer();
}
bool QXmlInputSource::LoadQt(void)
{
FARPROC Addr;
/* get handle to dll */
std::wstring LibName = QtPath + QtXml;
DllHandle = LoadLibrary(LibName.c_str());
/* get pointer to the function in the dll*/
Addr = GetProcAddress(HMODULE (DllHandle), "[email protected]@@[email protected]@XZ");
fpData = QXmlInputSource_Data(Addr);
return true;
}
bool QXmlInputSource::UnloadQt()
{
/* Release the Dll */
FreeLibrary(DllHandle);
return true;
}
String^ QXmlInputSource::Data()
{
void* Ptr = fpData(Native);
return "EPIC FAIL";
}
Qt는 기반 응용 프로그램 충돌을 내가하려고 fpData() 함수 포인터를 호출하십시오. 도움말 : P
몇 가지 추가 정보 또는 도움이되지 않을 수 있습니다 :
을 나는 성공적를 사용하여 같은 QString.count()와 QString.data (같은 "간단한"객체)에 기능을 불렀다 같은 방법론. (QString 표준 유니 코드 문자열에 대한 그냥 경량 래퍼 것).
내가 관심이있는 XML 함수가 포함 된 QtXml4.dll 파일에는 실제로 두 개의 parse() 메소드가 있습니다. 하나는 소스가 const &이고 다른 하나는 소스입니다. 나는 둘 중 하나를 사용해야하는지 잘 모른다. 나는 어떤 경우에도 내 서명이 변하지 않을 것이라고 생각합니다.
내가 주위를 재생하려고 동안, 나는 C# 코드에서 IntPtr입니다을 역 참조와 C++에 전달 시도 :
IntPtr입니다 DerefSrc = (IntPtr입니다) Marshal.PtrToStructure (출처의 typeof (IntPtr입니다)); 대략 메모리에 QtXml4.dll의 주소와 일치 - 나는이 두 IntPtrs의 값을 출력하면 DerefSrc는 1.6GB의 값을 가지고있는 동안
는, 소스, 3.5MB 주위의 값을 갖는다. 내 생각에 DerefSrc는 절대 참조 인 반면 3.5Mb는 상대적 오프셋입니다. DerefSrc를 상대 주소로 변환하고 대신 C++로 전달하는 것이 가치가 있습니까? 당신은에서 LoadLibrary와 GetProcAddress를의 반환 값을 확인하지 않는 :
1 :
코드 삽입의 첫 번째 규칙은 절대 최소 코드를 삽입하는 것입니다. 이로 인해 C++/CLI는 ** 매우 열악한 후보입니다. 또한 지터와 CLR을 주입하여 실행시켜야합니다. 당신이 그것을하는 방법을 알아낼 수있을 확률은 0입니다. 계산을 해보더라도 프로세스에 이미 CLR이로드되어 있으며 잘못된 버전 일 가능성이 높습니다. 이것을 시도하지 마십시오. –
우리는 결투 전문가의 경우가 있습니다 !! 이전 질문에 대한 링크와 David Heffernan의 답변을 참조하십시오. –
이전 질문은 코드를 다른 프로세스에 주입하는 것이 아닙니다. –