Отправка данных из dll в exe файл

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by fire64, 20 Mar 2011.

  1. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    Здравствуйте.

    Есть программа, назовем её скажем text.exe, которая вызывает функцию testfunc, в dll файле lib.dll и передает в нее параметр teststr в виде const char*

    Вопрос, как мне из другой программы получить значение teststr, а так же результат выполнения testfunc ?

    я конечно без проблем могу сделать прокси библиотеки lib.dll и через нее работать с нужными мне данными, но возникает вопрос: как мне потом из фальшивой lib.dll, передать нужные мне данные в программу injekt.exe ?
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    всё что угодно придумать можно, начиная от пайпов и мейлслотов и заканчивая передачей по TCP.
    НО самое лучшей - другая прога твоя должна подгрузить этуже библиотеку.
    Но у библиотеки должны быть следующие фишка - секция данных в которую ты закинешь эту строку, она должна иметь атрибут - расшаренная тогда данные будут общими между процессами.

    А вообще то что ты описал - это вообще както сильно обзорно, опиши что конкретно надо?

    Если ты внедняешь фальшиую DLL чтобы хукать чтото, и передавать данные в оригинальную прогу, то тут можно и сообщения окну делать, но лучше через Pipe
     
  3. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    slesh, я пока решил обойтись ReadProcessMemory.

    Кстати. не подскажешь, что не так в коде WriteMemoryData ?

    PHP:
    bool ReadMemoryDataHANDLE pProcessDWORD pAddresvoid *buffint bufflen )
    {
        
    DWORD numRead;

        
    BOOL res ReadProcessMemory(pProcess, (LPCVOID)pAddresbuffbufflen, &numRead);

        if (
    res && (numRead == bufflen))
        {
            return 
    true;
        }

        return 
    false;
    }

    bool WriteMemoryDataHANDLE pProcessDWORD pAddresvoid *buffint bufflen )
    {
        
    DWORD numRead;

        
    BOOL res WriteProcessMemory(pProcess, (LPCVOID *)pAddresbuffbufflen, &numRead);

        if (
    res && (numRead == bufflen))
        {
            return 
    true;
        }

        return 
    false;
    }

    int main(int argccharargv[])
    {
        
    HANDLE pProcess OpenExeProcess("explorer.exe");

        if(!
    pProcess)
        {
            return 
    0;
        }

        
    char test[100];

        if( 
    ReadMemoryDatapProcess0x00010000testsizeof(test) ) )
        {
            
    LogPrintf"Very Good\n" );

            
    BinPrintftestsizeof(test) );
        }

        return 
    0;
    }
    с ReadMemoryData, все отлично, а вот WriteMemoryData почему-то не срабатывает.
     
    #3 fire64, 20 Mar 2011
    Last edited by a moderator: 20 Mar 2011
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Да всё что угодно может быть, нафига разводить такой быдлокод? Откоды та знаешь что этот адерс присутствует в памяти и что к нему есть доступ? К тому же запись в чёжое адресное пространство будет антивирями принято в штыки, даже если легальная прога. так что забудь про это.

    Если тебе уж так понравился такой метод, то используй именнованный файл маппинг, это будет работать проще, быстрее и надежнее.

    hFileMapping = CreateFileMapping (******, Имя_какоенить)
    mem = MapViewOfFile(hFileMapping *******)

    mem - адрес памяти с которым ты работаешь как с обычной выделенной память. Но будет общая для всех процессов, которые сделали данные действия

    UnMapViewOfFile(mem *******)
    CloseHandle(hFileMapping)


    К томуже ты делал OpenExeProcess - откуда людям знать что ты там навоял. Может быть открываешь без прав на запись. Да и слишком много гемора тогда, а именно:
    1) открыть чужой процесс можно тока с правами админа так как потребуются права отладчика, котоыре тока под админом можно получить
    2) открыть процессы своего пользователя - можно и под гостем , но без полный прав доступа, опятьже из-за отстуствия отладочных привелений.
     
    #4 slesh, 20 Mar 2011
    Last edited: 20 Mar 2011