C: header, исполняющий код

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Nufai, 7 Dec 2017.

  1. Nufai

    Nufai Member

    Joined:
    5 Nov 2017
    Messages:
    56
    Likes Received:
    9
    Reputations:
    0
    В написании h файлов в с/c++ знаю очень мало. Нужно сделать header, который добавит в скомпилированый файл какой-нибуть код, которого нет в исходнике. То есть, такой injectcode.h, чтоб при

    #include <stdio.h>
    #include <injectcode.h>
    main(){
    printf("executing...");
    }

    сначала выполнился код, добавлен header'ом, а потом остальной код в main(в даном случае printf)
     
  2. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,481
    Reputations:
    25
    h-файлы большие, мало кто их смотрит. Добавь в какой-нибудь конструктор свой код и все получится. Можно stdio.h в папочку проекта перенести и немного его пофиксить (хотя это заметно но если файлов много - то не так чтобы очень). Во всяком случае дописать чего в конструктор уже заинклюженого хидера менее палевно чем добавить какой-то свой. Кто там смотрит в эти конструкторы ? :)
     
  3. neviens

    neviens Member

    Joined:
    9 Oct 2013
    Messages:
    82
    Likes Received:
    28
    Reputations:
    3
    Code:
    // --------------injectcode.h-----------------
    #include <windows.h>
    #pragma comment(linker, "/INCLUDE:__tls_used")
    #pragma comment(linker, "/INCLUDE:_tls_callback_func")
    
    void __stdcall tls_callback(void* h, unsigned int reason, void* unused)
    {
       if(DLL_PROCESS_ATTACH == reason)
           MessageBox(NULL, "The main() will follow.", NULL, 0);
    }
    
    #pragma data_seg(".CRT$XLF")
     PIMAGE_TLS_CALLBACK tls_callback_func = (PIMAGE_TLS_CALLBACK)tls_callback;
    #pragma data_seg()
    Это для Win C 32bit.
     
  4. Nufai

    Nufai Member

    Joined:
    5 Nov 2017
    Messages:
    56
    Likes Received:
    9
    Reputations:
    0
    Так и планировалось - дописать в stdio :)


    Хм, из-за чего может не работать? Использую devc++, пробовал GCC-64bit и GCC-32bit. Win7 64-bit у меня
     
  5. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,481
    Reputations:
    25
    Может GCC не поддерживает. Не знаю, я его не юзаю. Он ошибку тебе вываливает или просто не работает молча ?
    Попробуй на Hello World затестить а не на рабочем коде, может в этом дело.
    И вот еще, свой написал (ибо у меня чистая копипаста компилиться не захотела, чего-то вдруг линкер не нашел _tls_callback_func) только что проверил - в студии работает норм.

    И вообще загугли как юзаются TLS с твоим компилером и поддерживает ли он их вообще.

    Code:
    #include <windows.h>
     
    void NTAPI tls_callback(void* DllHandle, DWORD Reason, void* Reserved)
    {
        if(DLL_PROCESS_ATTACH == Reason)
        {
            MessageBox(0, L"Hi there!", L"TLS callback", MB_ICONEXCLAMATION);
        }
    }
     
    #pragma comment (linker, "/INCLUDE:__tls_used")
    #pragma comment (linker, "/INCLUDE:__chk")
     
    #pragma data_seg(".CRT$XLB")
    EXTERN_C
    PIMAGE_TLS_CALLBACK _chk = tls_callback;
    #pragma data_seg()
    
     
  6. neviens

    neviens Member

    Joined:
    9 Oct 2013
    Messages:
    82
    Likes Received:
    28
    Reputations:
    3
    Это код для MSVC, для GCC будет:
    Code:
    // --------------injectcode.h-----------------
    #include <windows.h>
    
    void __stdcall tls_callback(void* h, unsigned int reason, void* unused)
    {
       if(DLL_PROCESS_ATTACH == reason)
           MessageBox(NULL, "The main() will follow.", NULL, 0);
    }
    
    PIMAGE_TLS_CALLBACK mtl_tls_callback_ __attribute__ ((section(".CRT$XLB"))) = (PIMAGE_TLS_CALLBACK)tls_callback;
     
    Nufai and DartPhoenix like this.
  7. Nufai

    Nufai Member

    Joined:
    5 Nov 2017
    Messages:
    56
    Likes Received:
    9
    Reputations:
    0
    Спасибо, теперь все заработало :)
    А этот код, как и предыдущий, молча не работает безо всяких ошибок. На HelloWorld'е и проверялось. А про TLS погуглю, спасибо ;)