2014-09-14 4 views
1

내 질문은 정말 위의, 나는 이것에 대한 자세한 정보를 아래에 줄 것이다 그러나 :동일한 프로그램에 삽입 된 다른 .dll에서 함수를 호출하려면 어떻게해야합니까?

이 DLL은 내가 처음으로 "거짓"d3d9.dll 걸리는 프로그램을 가지고 있으며,이 DLL은 내가 리버스 엔지니어링중인 게임에로드됩니다. 잠시 후 .dll이로드되고 다른 모든 게임 종속성과 함께 리버스 엔지니어링의 모든 더러운 작업을 수행 할 DLL을 삽입하려고합니다.

LoadLibrary를 사용하여 프로그램에이 DLL을로드 할 수 있다고 생각하지만, 리버스 엔지니어링 된 기본 코드를 실행하기 위해 주입 한 DLL을 사용할 때 생각합니다. d3d9.dll에서 무언가를 호출하는 데 사용할 수있는 함수가 있습니까?

이것은 주입 된 .dll로 화면에 추가 할 수있는 것들을 렌더링하기 위해 d3d9 라이브러리에 대한 액세스가 여전히 필요하기 때문입니다. d3d9.dll은 로딩 시간과 메모리가 변경되는 시점에서 문제를 일으키기 때문에 d3d9.dll을 사용하고 싶지 않습니다.

또한 DLL에서 DllMain을 사용할 계획이 없습니다. 즉, 안전한 프로세스 시작을 보장하기 위해 d3d9.dll에서 주입 된 DLL로 원격 함수를 호출해야합니다.

죄송합니다. 어리석은 질문 인 경우 죄송합니다. 답변을 제공해 주셔서 감사합니다.

+1

CreateRemoteThread를 사용해 보셨습니까? –

+0

예, 죄송합니다. 그러나 나는 매개 변수에 무엇을 넣을 지 모른다 : lpStartAddress [in]. 함수 이름 (d3d9.dll에 정의되지 않았습니까?) 또는 메모리 주소를 넣을까요? 정말 시작 주소가 무엇인지 모르겠습니다. – user1591117

+1

DLL에 Dllmain을 사용하거나 사용하지 않으려는 기술적 인 이유가 있습니까? –

답변

1

예전에 우리는 CreateRemoteThread를 사용하고 LoadLibraryA를 lpStartAddress의 주소로 사용했습니다 (이 주소는 모든 프로세스에서 동일하게 발생합니다). 트릭은 VirtualAllocEx을 사용하여 주입하려는 DLL 이름을 할당하고 이것을 lpParameter으로 사용하는 것이 었습니다. 효과적으로 스레드가 삽입하려는 DLL 이름으로 LoadLibraryA를 호출합니다. Dll이로드 될 때 Dllmain이 호출되고 dll이 연결될 때 (DLL_PROCESS_ATTACH) 코드를 Dllmain에서 실행할 수 있습니다.

link에는이를 수행하는 데 대한 매우 유용한 정보가 있습니다. 그러나이 기술은 Dllmain 함수에 의존합니다. Dllmain을 사용할 수 있으면이 메커니즘이 작동합니다. 그 기사에서 단계의 요약 개요 제공 : 이제

을, 우리는 다음 단계에서이 기술을 요약 할 수 있습니다 : 나는 너무 많은 정보에 대한 의견을보고

Retrieve a HANDLE to the remote process (OpenProces). 
Allocate memory in the remote process's address space for injected data (VirtualAllocEx). 
Write a copy of the initialised INJDATA structure to the allocated memory (WriteProcessMemory). 
Allocate memory in the remote process's address space for injected code. 
Write a copy of ThreadFunc to the allocated memory. 
Start the remote copy of ThreadFunc via CreateRemoteThread. 
Wait until the remote thread terminates (WaitForSingleObject). 
Retrieve the result from the remote process (ReadProcessMemory or GetExitCodeThread). 
Free the memory allocated in Steps #2 and #4 (VirtualFreeEx). 
Close the handles retrieved in Steps #6 and #1 (CloseHandle). 

. 잘 모르겠다. 그러나 Dllmain은 대부분의 Win32 API 호출을 사용할 수 없기 때문에 몇 가지 제한 사항이 있습니다. 몇 가지 예외와 하나가 CreateThread입니다. 일을하기 위해 실을 뽑아 낸다고 생각 했습니까? Dllmain에서 CreateThread를 사용하면 Dllmain이 종료 될 때까지 효과적으로 차단됩니다. 따라서 Dllmain이 반환되면 스레드가 실행됩니다.

+1

고마워, 나는 이것을 따라 한 번 시도해 볼게. 당신이 아래에서 말했듯이, DllMain은 한계와 같은 나의 적입니다.나 나중에이 스레드를 만들면 d3d9.dll을 통해 원격으로 작동하는지 확인할 수 있습니다. 당신의 도움을 주셔서 감사합니다 :). – user1591117

+1

빠른 구현으로이 트릭을 수행 한 것으로 보입니다. 도와 주시고 인내심을 가져 주셔서 감사합니다. – user1591117