Hex редактировать DLL, чтобы изменить имя зависимости? - PullRequest
1 голос
/ 06 августа 2010

У меня есть DLL, которая зависит от OPENGL.DLL. Тем не менее, Windows поставляется с OpenGL32.dll. Я хочу изменить это имя зависимости в двоичном файле DLL, чтобы он вместо этого ищет OpenGL32.dll. Я попытался открыть его в бинарном редакторе VS, но я не могу сделать имя длиннее. Я могу, например, изменить его на OpenDD.dll, но я не могу добавить к нему. Как я мог это сделать?

Если я отредактирую его так, чтобы он был похож на OpenGLAA или OpenGLJU, это сработает, но изменение на OpenGL32 приведет к тому, что DLL-файл не найден

Ответы [ 6 ]

4 голосов
/ 06 августа 2010

Возможно, вы захотите поэкспериментировать с созданием «DLL-библиотеки пересылки» с именем OPENGL.DLL, которая просто пересылает файл OpenGL32.dll:

Конечно, это предполагает, что API имеют одинаковые подписи.Если нет, то вы можете написать оболочку OPENGL.DLL с правильными сигнатурами API, а затем обернуться вызовами функций OpenGL32.dll.Это может быть утомительной задачей, если есть много функций, но если есть различия в API, что-то должно быть там, чтобы справиться с этими различиями.

3 голосов
/ 06 августа 2010

Немного сложно объяснить по-английски, как изменить импортированное имя DLL в PE (есть довольно много уровней косвенности и RVA), но случайно у меня есть библиотека, которую можно использовать для таких вещей. Только 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 несколько хакерское, но с выделением безопасная зона в PE будет намного сложнее.

2 голосов
/ 06 августа 2010

Вы можете попытаться сделать копию OpenGL32.DLL, назвав ее OPENGL.DLL, а не редактировать двоичный файл, который ссылается на нее.

Вероятно, OPENGL.DLL и OpenGL32.DLL являются разными версиями, итаким образом, вы не сможете поменять одно на другое.

1 голос
/ 06 августа 2010

Не редактируйте .dll в шестнадцатеричном формате, просто укажите правильную версию opengl.From http://www.opengl.org/resources/faq/technical/gettingstarted.htm#0010:

Если вы видите такие файлы, как opengl.lib и glut.lib, это неподдерживаемые библиотеки SGI для Microsoft Windows.Они не должны использоваться.Для использования аппаратного ускорения рекомендуется использовать библиотеки Microsoft. Более подробную информацию о библиотеках SGI можно найти здесь . Всегда связывайте либо со всеми библиотеками Microsoft (например, glu32.lib, glut32.lib и opengl32.lib), либо со всеми библиотеками SGI (например, glu.lib, glut.lib и opengl.lib).Вы не можете использовать комбинацию библиотек Microsoft и библиотек SGI. Однако вы можете установить оба набора библиотек в одной системе.Если вы используете .lib файлы SGI, вам понадобятся соответствующие DLL-файлы, установленные в вашей системной папке.(т. е. для связи с opengl.lib необходимо, чтобы файл opengl.dll был установлен во время выполнения).

0 голосов
/ 06 августа 2010

Э-э, НИКОГДА не переименовывайте системную DLL для ВАШИХ целей.

Если вы НИЧЕГО делаете, скопируйте его в вашу папку .EXE и переименуйте в что-то вроде OpenGLMYHACKEDVERSION.dll.Таким образом, было бы НЕВОЗМОЖНО другому приложению, ищущему РЕАЛЬНУЮ систему .dll, использовать «вашу» версию.

0 голосов
/ 06 августа 2010

Вы можете установить зависимость для некоторого подходящего имени, а затем создать другую DLL-библиотеку с этим именем, которая перенаправляет все соответствующие имена в opengl32.dll.С чисто технической точки зрения, направляя вызовы в OpenGL32.DLL, не должно быть никаких проблем (кроме того факта, что для этого по-прежнему требуется внешняя DLL, которую вы можете избежать).Если вам действительно нужно изменить зависимость напрямую на OpenGL32.dll, это будет довольно нетривиально.В большинстве практических целей вам нужно дублировать большую часть того, что делает компоновщик, чтобы в первую очередь создать исполняемый файл - это теоретически возможно, но назвать его нетривиальным - серьезное преуменьшение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...