Dll injecting

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Frostman, 19 Aug 2012.

  1. Frostman

    Frostman New Member

    Joined:
    17 Aug 2012
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Здравствуйте! У меня есть чужая программа, в которой есть ряд функций... например мне нужно получить результат функции int myfunc(). можно ли воспользовавшись dll инжектом вызвать эту функцию? если да то как?
     
  2. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Можно. Но насколько я понимаю int myfunc() находится в exe. Надо вручную найти адрес этой функции с помощью отладчика. Дальше можно вызывать эту функцию с помощью call адрес_функции или jmp адрес_функции, либо же устанавливать перехват на нее путем замены первых 5 байт или любым другим способом.
     
  3. Frostman

    Frostman New Member

    Joined:
    17 Aug 2012
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    да, она находится в ехе. то есть такой метод можно применять, если адрес такой функции постоянен?

    просто такой странный этот ехе. Эта функция находится в dll_ex.dll, но в программе я не могу найти не одного вызова этой функции с библиотеки, но эта функция экспортируется самой ехе... но вызвать ее не могу... проблемы с памятью возникают, даже когда я соблюдаю декларацию... нечего не понимаю...

    ПС: а можно по подробней, как вызываются такие функции и получить от них можно результат?
     
  4. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Так все таки функция находится в DLL? Тогда загрузите свой exe через отладчик (Olly Debugger, например) и установите бряк (Toggle breakpoint) на данную функцию. Выполните в программе некоторые действия, при которых предположительно должна вызываться эта функция. Прерывание сработает при ее вызове (если она где то вызывается, конечно) и вы сможете посмотреть, в каком месте в exe она вызывается, какие параметры принимает и что возвращает.

    А по поводу
    Импортируется, наверное? Тогда это полностью возможно.
     
    #4 Chrome~, 19 Aug 2012
    Last edited: 19 Aug 2012
  5. Frostman

    Frostman New Member

    Joined:
    17 Aug 2012
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Да, эта функция находится в самой dll, но я не могу найти ни одного вызова этой функции в самой программе, тогда как программа экспортирует эту функцию.
    Я уже ставил бряк на эту функцию, доходило выполнение к этому моменту, (функция одной переменной), передавалось текстовое значение, и возвращалось целочисленное. Но когда я хотел в своей программе ее использовать - я получал ошибку связанной с памятью. так как доступа получить я не мог... декларация соблюдена верно.

    в ида про эта функция находится в таблице экспорта самой ехе, и в длл в таблице экспорта
     
  6. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Если это не приватный проект - выложите exe и dll, чтобы можно было взглянуть.
    На каком этапе происходит ошибка при вызове этой функции из вашей программы пробовали разобраться?
    Если dll написана в Delphi и принимает string, то есть некоторые особенности, при которых может появляться Access violation.
    На каком языке написана библиотека?
     
  7. Frostman

    Frostman New Member

    Joined:
    17 Aug 2012
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Происходит ошибка именно при вызове.
    На сколько я понимаю библиотека как и сама программа написаны на VC++.

    Вызов программы осуществляется с файла info.exe. Сама dll - qpile.dll. Функция имеет название IS_CONNECTED

    вот сама программа http://dl.dropbox.com/u/9129402/arch.rar
     
  8. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    ну дак функция экспортируется приложением info.exe и возвращает просто значение какой-то переменной, которая в свою очередь инициализируется при "нормальном" запуске программы, то есть:
    Code:
    double __cdecl IS_CONNECTED(int a1)
    {
      *(double *)a1 = (double)bEnable;
      return *(double *)a1;
    }
    
    если просто пытаться вызвать функцию примерно таким кодом:
    Code:
    hLib:= LoadLibrary('info.exe');
    if hLib <> 0 then begin
      IS_CONNECTED:= GetProcAddress(hLib, 'IS_CONNECTED');
      ...
    
    то переменная bEnable будет не инициализирована, соответственно отсюда и ошибка доступа
     
  9. Frostman

    Frostman New Member

    Joined:
    17 Aug 2012
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Извините, очень туплю, подскажите, можно ли вызвать функцию напрямик с qpile.dll и получить результат ее выполнения? или каким другим образом можно вызвать и получить значение...
     
    #9 Frostman, 20 Aug 2012
    Last edited: 20 Aug 2012
  10. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,021
    Likes Received:
    1,200
    Reputations:
    327
    если автор проги особо не химичил, то код функции должен быть в сегменте кода, который ReadOnly.

    даже если образ будет релоцироваться, то функцию можно найти по паттерну - то бишь просто ища последовательность скажем из 10 байт, но сперва ее конечно нужно найти отладчиком.