2011-04-18 4 views
3

일부 패치를 적용하려면 Windows API's PatchAPI을 사용하고 싶습니다. 패치 적용은 mspatcha.dll에서 구현됩니다. mspatcha.dll은 자신의 system32 폴더에 있어야합니다.Windows API의 PatchAPI에 연결

ref 및 인터넷 검색과 같은 다양한 장소에서 읽은 후에는 아직이 DLL에 연결할 수있는 올바른 방법을 찾지 못했습니다. 나는 정적으로 링크하고 싶습니다. LoadLibrary를 다루는 것이 엉망이고 일종의 patchapi.h 헤더의 목적을 무효로합니다.

1) DUMPBIN/수출 C : 나는 더 lib 디렉토리 파일을 발견했기 때문에 나는 다음과 같은 명령을 사용하여 내 자신을 만들어, 링크입니다 \ 창 \ system32를 \ mspatcha.dll

2) 만들기 mspatcha.def 파일의 출력에 나타나는 각 기능 이름 한 줄 이어에 "수출"라인 물품

3) LIB /def:mspatcha.def /out:mspatcha.lib

DUMPBIN 이 방법이 patchapi와 정적으로 링크하는 올바른 방법이 아니라고 확신하지만 그렇게 할 올바른 방법을 찾지 못했습니다. 어쨌든, 다음 단계를 수행 한 후 ApplyPatchToFileExA()를 한 번 호출하여 간단한 테스트 케이스를 작성한 후에도 _ApplyPatchToFileA @ 16 기호에 링커 오류가 발생합니다. 발견 "ApplyPatchToFileExA"| \ TMP \ mspatcha> 수출/DUMPBIN mspatcha.lib : 내 새로 만든 mspatcha.lib의 수출 심볼을 살펴보면 ,이 기능은 잘못된 이름 규칙

D를 사용하는 것이 나타납니다 내가 틀렸다하지 않는 한

   _ApplyPatchToFileExA 

,이 DLL이 stdcall을 사용하고 (또는 적어도 _stdcall 등의 기능을 선언한다) 반면 LIB 수출 기능을 cdecl 규칙을 사용하는 것을 나타냅니다. 참조 : C name decoration in Microsoft Windows.

제 질문은 : 응용 프로그램에서 mspatcha.dll을 사용하는 올바른 방법은 무엇이고 DLL을 통해 lib를 만드는 과정에서 정적 링크를 할 수 있습니까?

내 터미널의 상세한 출력은 여기에서 찾을 수 있습니다 : 용어의 점으로 http://pastebin.com/q4FV4Se6

+0

"정적으로 가져온"및 "정적으로 링크 된"이라는 용어를 구분하십시오. 전자는 로더가 이진 파일을 제어하기 전에 가져온 함수를 해결한다는 것을 의미합니다 (실패 할 수도 있음). 후자는 실제 객체 코드가 최종 이진 이미지에 링크된다는 것을 의미합니다. – 0xC0000022L

+0

나는'lib.exe'가 당신이주는 DEF 파일에서 그것과 같은 데코 레이팅 된 이름을 만들어야한다는 것을 조금 혼란스러워합니다. 당신은 이것에 연결하려고 시도 했습니까?lib 디렉토리로 이동 한 다음 결과 바이너리의 가져 오기 디렉토리를 검사하십시오. – 0xC0000022L

+0

이 작은 도구를 사용해보십시오 : http://vortex.masmcode.com/files/def2lib11.zip - 링커와 로더가 모두 만족할 수 있도록 .def 파일에서 데코 레이팅 된 이름을 사용합니다. – 0xC0000022L

답변

0

당신은 확실히 다른 무언가를 의미하는 정적으로 링크 암시보다는하려고합니다.

.lib 파일을 실제로 가져올 수없는 경우 생성하기 쉬운 방법 중 하나는 각 함수에 빈 스텁이있는 더미 DLL을 만드는 것입니다. mspatcha.dll DLL을 호출하십시오. .def 파일과 stdcall을 사용해야합니다.

DLL을 만들었 으면 버리고 .lib 파일을 보관하십시오.

.lib 파일을 생성하지 않는 툴 체인으로 빌드 된 DLL 용 .lib 파일을 생성하기 위해이 작업을 해본 적이 있습니다.

사용한 기술은 cdecl 기능에서만 작동합니다.

+0

그건 과도한 행동입니다. 'lib.exe'는 단순히'.def' (모듈 정의) 파일을 사용하여'.lib' 임포트를 생성하는 데 사용할 수 있습니다. 더미 DLL을 만들 필요가 전혀 없습니다. 그것은 OP가하는 일이기 때문에 문제는 호출 규칙에 의거합니다. – 0xC0000022L

+0

사이드 노트 : 그가 사용하는 기술은'__cdecl'에 대해서만 작동하지 않습니다. 나는'__stdcall'을 여러 번 사용 해왔다. – 0xC0000022L

+0

@status cdecl에 대한 귀하의 코멘트는 여기에 모순됩니다 : http://support.microsoft.com/kb/131313 –