그 (간접 및 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에 안전한 장소가 얻을 것이다 .
OPENGL.DLL과 OpenGL32.dll이 서로 바뀔 가능성은 거의 없습니다. 그들은 아마도 다른 버전 일 수 있습니다. –
아니, 나는 그것을 시도하고 작동 – jmasterx
당신은 자신을 모순하는 것 같습니다. 예를 들어 "OpenDD.dll"(10 바이트)로 "OPENGL.DLL"(10 바이트)를 변경하도록 이진 파일을 편집 할 수 있지만 "OpenGL32.dll"(10 바이트)로 변경할 수 없다는 말은 들리는군요. "(12 바이트). 그렇다면 "OpenGLAA 또는 OpenGLJU와 같이 편집하면됩니다"라고 말하면서 자신을 모순됩니다. 그래서 어떤가? –