2010-08-05 1 views
1

나는 OPENGL.DLL에 의존하는 DLL을 가지고있다. 그러나 Windows에는 OpenGL32.dll이 제공됩니다. dll 바이너리에서이 종속성 이름을 변경하여 대신 OpenGL32.dll을 찾습니다. VS의 이진 편집기에서 열어 보았지만 이름을 더 길게 만드는 것 같습니다. 예를 들어 OpenDD.dll로 변경할 수 있지만 추가 할 수는 없습니다. 내가 어떻게 할 수 있니?16 진수로 dll을 편집하여 종속성 이름을 변경 하시겠습니까?

내가 OpenGLAA 또는 OpenGLJU처럼되고 그것을 편집하는 경우이 있지만 .DLL cound가

를 찾을 수없는 말을 거기에 OpenGL32 결과로 변경 작동
+0

OPENGL.DLL과 OpenGL32.dll이 서로 바뀔 가능성은 거의 없습니다. 그들은 아마도 다른 버전 일 수 있습니다. –

+0

아니, 나는 그것을 시도하고 작동 – jmasterx

+0

당신은 자신을 모순하는 것 같습니다. 예를 들어 "OpenDD.dll"(10 바이트)로 "OPENGL.DLL"(10 바이트)를 변경하도록 이진 파일을 편집 할 수 있지만 "OpenGL32.dll"(10 바이트)로 변경할 수 없다는 말은 들리는군요. "(12 바이트). 그렇다면 "OpenGLAA 또는 OpenGLJU와 같이 편집하면됩니다"라고 말하면서 자신을 모순됩니다. 그래서 어떤가? –

답변

2

그 (간접 및 RVAs의 꽤 수준이 거기) PE 에서 가져온 DLL 이름을 변경할 수 있지만 실수, 내가 물건에 사용할 수있는 라이브러리가하는 방법을 영어로 설명하기 어려운 조금 그런 식으로. PE32 만.

다음은 사용할 수있는 유틸리티입니다. http://nishi.dreamhosters.com/dllrepl_v0.rar (출처 포함). 그것이 어떻게 작동하는지 그리고 여기입니다 : (UpdateImports()이 일을) 훨씬 더 복잡

struct PE_Hdr1 : PE_Hdr { 

    void UpdateImports(char* s1, char* s2) { 
    int c,i,j; 
    int p = 0; 

    uint ofs = 0x50; 
    printf("Redirecting <%s> to <%s>\n", s1, s2); 
    // store the target dll name to some place in MZ header 
    memcpy(&exedata[ofs], s2, strlen(s2)+1); 

    uint idtrva = tbl[1].VA; 
    PE_IDRec* idt = (PE_IDRec*)&exedata[ RVA2Ofs(idtrva) ]; 

    for(i=0; i<nIDRec; i++) { 
     char* dllname = (char*)&exedata[ RVA2Ofs(idt[i].DLLName) ]; 
     printf("dllname=<%s>", dllname); 
     if(stricmp(dllname, s1)==0) { 
     printf(" -> <%s>", s2); 
     idt[i].DLLName = ofs; 
     } 
     printf("\n"); 
    } 
    } 

}; 

// Usage: dllrepl file.exe file_out.exe msvcrt.dll msvcrt32.dll 
int main(int argc, char** argv) { 

    if(argc<5) return 1; 

    FILE* f = fopen(argv[1], "rb"); if(f==0) return 1; 
    FILE* g = fopen(argv[2], "wb"); if(g==0) return 1; 

    MZ_Hdr mz; PE_Hdr pe; 
    PE_Open(mz, pe, f); 

    ((PE_Hdr1&)pe).UpdateImports(argv[3], argv[4]); 

    fwrite(pe.exedata, 1,pe.exesize, g); 

} 

DLL 이름의 새 위치가 다소 hackish하지만 의 할당과 함께 PE에 안전한 장소가 얻을 것이다 .

+0

다운로드 링크를 사용할 수없고 제공 한 데모 소스를 컴파일 할 수 없습니다. 다운로드 링크를 수정하십시오. 감사합니다. – tbago

+0

수정 됨, 죄송합니다 ... – Shelwien

2

당신은 그것을 이름, OPENGL32.DLL의 사본을 시도 할 수 OPENGL.DLL 그것을 참조하는 바이너리를 편집하는 대신에.

OPENGL.DLL과 OpenGL32.DLL이 서로 다른 버전이므로 다른 하나를 바꿀 수는 없습니다.

+0

아니, 그것은 작동하고 Opengl32 내 응용 프로그램과 함께 OPENGL.dll을 피하기 위해 그것을 변경하고 싶습니다 – jmasterx

0

맞는 이름에 종속성을 설정 한 다음 해당 이름을 사용하여 opengl32.dll에 관련된 모든 이름을 전달하는 다른 DLL을 만들 수 있습니다. OpenGL32.DLL에 대한 호출을 안내하는 순수 기술적 인 관점에서 문제가되지 않아야합니다 (피하기를 선호하는 외부 DLL이 계속 필요함). OpenGL32.dll에 대한 종속성을 직접 변경해야하는 경우 상당히 사소 할 것입니다. 대부분의 실제적인 목적을 위해 링커가 실행 파일을 생성하기 위해 수행하는 대부분의 작업을 복제해야합니다. 이론적으로 가능하지만 이론적으로는 불가능하다고하는 것은 매우 과장된 말입니다.

+0

하지만이 솔루션은 다른 DLL 종속성을 생성하고 의존성을 피하는 envolves이 일을 내 요점입니다 : – jmasterx

+0

@ Jex : 편집을 참조하십시오. 진짜 질문은 어떻게 그리고 왜 당신이'opengl.dll'에 의존하는 무언가를 생산하고 있는지입니다. –

4

당신은 "전달 DLL 만들기"로 이름 OPENGL.DLL을 실험 할 수 있습니다 단순히 전달합니다 OPENGL32.DLL에 :

,이 API를이 같은 서명이 있다고 가정합니다. 그렇지 않다면 올바른 API 서명이있는 래퍼 OPENGL.DLL을 작성한 다음 OpenGL32.dll 함수를 호출하면됩니다. 함수가 많은 경우 지루한 작업 일 수 있지만 API에 차이가있을 경우 이러한 차이를 처리하기 위해 뭔가가 있어야합니다.

1

.dll을 16 진수로 편집하지 마십시오. 올바른 버전의 OpenGL에 연결하기 만하면됩니다. http://www.opengl.org/resources/faq/technical/gettingstarted.htm#0010에서 :

당신이 그런 및 glut.lib opengl.lib 등의 파일을 볼 경우, 이러한 마이크로 소프트 Windows 용 SGI의 지원되지 않는 라이브러리입니다. 그들은 사용되어서는 안됩니다. 하드웨어 가속을 사용하려면 Microsoft 라이브러리를 사용하는 것이 좋습니다. More info on the SGI libraries can be found here. 항상 중 모든 Microsoft 라이브러리 (예를 들어, glu32.lib, glut32.lib 및 opengl32.lib) 또는 모든 SGI 라이브러리 (예를 들어, glu.lib, glut.lib 및 opengl.lib)로 연결합니다.Microsoft libarires 및 SGI 라이브러리 모두의 조합을 사용할 수 없습니다. 그러나 두 시스템 모두 라이브러리 세트를 설치할 수 있습니다. SGI의 .lib 파일을 사용하는 경우 시스템 폴더에 해당 .dll 파일이 설치되어 있어야합니다. (즉, 에 대해 opengl.lib를 연결하려면 런타임에 opengl.dll이 설치되어 있어야합니다.)

+0

glu가 안되는 동안 내 문제는 glu32 충돌입니다. – jmasterx

+0

@ Jex, 충돌은 무엇입니까? 콜 스택 등? – MSN

0

어쨌든 절대로 시스템 DLL의 이름을 바꾸지 마십시오.

아무 일도하지 않는다면 .EXE 폴더로 복사하고 OpenGLMYHACKEDVERSION.dll과 같은 이름으로 바꿉니다. 이렇게하면 REAL 시스템 .dll이 "자신의"버전을 사용하는 것을 찾는 다른 응용 프로그램에서는 불가능할 것입니다.

관련 문제