PE-заголовок одной DLL недоступен из другой DLL

Тема в разделе "WASM.BEGINNERS", создана пользователем x_000, 14 сен 2009.

  1. x_000

    x_000 New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2008
    Сообщения:
    7
    Здравствуйте. Моя проблема такова: есть программа, она грузит сначала свою длл-ку, потом ту длл-ку, которая ей была указана ключом. Так вот, когда я пытаюсь из длл-ки, которая была указана ключом (то есть загружена второй) прочитать PE-заголовок первой длл-ки, мне выдает access violation, и даже VirtualProtect отказывается менять атрибуты защиты к области памяти заголовка. Это так и должно быть или я что-то неправильно делаю (если что, указатель на заголовок длл заведомо правильный)? Может быть, попробовать делать все через ReadProcessMemory\WriteProcessMemory? Заранее спасибо.
     
  2. h3rmit

    h3rmit New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    28
    ну да, ну да, а раки синии ). Либо неправильно задаешь, либо выходишь за границы отображения, либо вместо чтения пытаешься писать туда. Код приведи.
     
  3. x_000

    x_000 New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2008
    Сообщения:
    7
    Вот код:
    Код (Text):
    1. void hook_exported_function(DWORD module, char *func_name, DWORD hook_func) {
    2.     DWORD temp;
    3.  
    4.     PIMAGE_OPTIONAL_HEADER opt_hdr = (PIMAGE_OPTIONAL_HEADER)(module + 0x3c + sizeof(IMAGE_FILE_HEADER));
    5.     PIMAGE_EXPORT_DIRECTORY edt = (PIMAGE_EXPORT_DIRECTORY)(opt_hdr->DataDirectory[0].VirtualAddress + module);
    6.     char **names = (char **)(edt->AddressOfNames + module);
    7.     DWORD *funcs = (DWORD *)(edt->AddressOfFunctions + module);
    8.     int i;
    9.    
    10.     for(i = 0; i < edt->NumberOfNames; i++) {
    11.         if(!strcmp(names[i], func_name)) break;
    12.     }
    13.    
    14.     VirtualProtect((PVOID)(edt->AddressOfFunctions + module + i), 4, PAGE_READWRITE, &temp); // сомневаюсь насчет того, нужно ли это
    15.     funcs[i] = (hook_func - module);
    16.     VirtualProtect((PVOID)(edt->AddressOfFunctions + module + i), 4, temp, &temp);
    17. }
    Собственно, ошибка возникает, когда инициализирую edt.
    Нееет, все заведомо правильно, это я точно знаю :) . Первая длл всегда грузится по адресу 0х30000000 вторая - по 0х35000000. Знаю, что закладываться на это - неправильно, но специфика конкретно этой программы такова, что эти адреса всегда свободны для длл-ок.
    P.S. На мой метод хука экспорта не ругайтесь, не зря я вторую длл гружу выше, чем первую, поэтому тут можно так хукать :) .
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    x_000
    Код (Text):
    1. PIMAGE_OPTIONAL_HEADER opt_hdr = (PIMAGE_OPTIONAL_HEADER)(module + 0x3c + sizeof(IMAGE_FILE_HEADER));
    В первой строчке уже ерунда какая-то. По смещению 3Ch хранится смещение PE-заголовка, а не его начало.
     
  5. x_000

    x_000 New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2008
    Сообщения:
    7
    l_inc
    Эээ, маленькая опечатка. Это я старую функцию выложил, в новой писал
    Код (Text):
    1. (module + (DWORD)*(module + 0x3c) + sizeof(IMAGE_FILE_HEADER)
    , но тоже ничего не работает. Не читается даже MZ-сигнатура.
     
  6. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    4 байта где потерял?

    Signature ("PE")
    IMAGE_FILE_HEADER
    IMAGE_OPTIONAL_HEADER
    IMAGE_DIRECTORIES_DATA
     
  7. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    и во вторых.
    Дай код, в котором грузишь модуль и получаешь его базу. Что-то подсказывает, что ошибка там.
     
  8. x_000

    x_000 New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2008
    Сообщения:
    7
    intel_x128
    Да, насчет четырех байтов - это я оплошал, спасибо за замечание. А база модуля конкретно в этой программе всегда постоянная - 0х30000000.
    К слову о получении базы модуля - вроде как GetModuleHandle выдает как раз указатель на начало образа? Или я не прав?
     
  9. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    x_000
    Прав.
    Поэтому чтобы не гадать, дай кусок кода, которым получаешь базу образа. И кусок кода, где вызываешь функцию.
     
  10. x_000

    x_000 New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2008
    Сообщения:
    7
    Ничего особенного в этом куске нет, вот он:
    Код (Text):
    1. HMODULE hMainDll = GetModuleHandle("main.dll");
    2. hook_exported_function((DWORD)hMainDll, "CreateInterface", (DWORD)CreateInterfaceHook);
    Сейчас попробую сделать чтение\запись через Read\WriteProcessMemory.
     
  11. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    гм. Скомпилил. Работает.
    Скинь в пм модуль - отдебажим. Приватный функционал можешь поубирать нафиг. Наличие дебаг-символов приветствуются.
     
  12. x_000

    x_000 New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2008
    Сообщения:
    7
    Хм, через ReadProcessMemory тоже ничего не выводит. Похоже, это уже специфика программы. Буду дальше мучаться с ее дизассемблированием. Спасибо за ответы.
    P.S. А существует какие-нибудь средства для процесса ограничивать права доступа своих загружаемых длл-ок?
     
  13. h3rmit

    h3rmit New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    28
    Код (Text):
    1. char **names = (char **)(edt->AddressOfNames + module);
    2. ...
    3.  
    4. for(i = 0; i < edt->NumberOfNames; i++) {
    5.         if(!strcmp(names[i], func_name)) break;
    6.     }
    Омфг, ты формат хотябы читал? В таблице имен хранятся RVA ... Естественно при names ты не попадаешь в отображение и в strcmp у тебя будет access violation. Нормализуй адреса имен функций!