1. C++ / Говнокод #8757

    +1001

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    // Функция регистрирующая ошибку
    VOID SetError(DWORD dwError)
    {
        CHAR szErr[256];
        sprintf(szErr, "%lu", dwError);
        SetEnvironmentVariable("0xdeadc0de", szErr);
    }
    
    // Шеллкод
    __declspec(dllexport)
    VOID WINAPI Shell(REMSTART *pCtx)
    {
        pCtx->pLoadLibraryA(pCtx->sz);
        
        CHAR szVar[] = {'0','x','d','e','a','d','c','0','d','e','\0'};
            
        CHAR szErr[256];
        
        if (!pCtx->pGetEnvironmentVariableA(szVar, szErr, sizeof(szErr)))
            pCtx->pExitThread(ERROR_LOAD_HOOK_DLL);
        
        DWORD dwError = 0;
    
        for (DWORD i = 0; szErr[i]; i++)
        {
            dwError *= 10;
            dwError += szErr[i] - '0';
        }
    
        pCtx->pExitThread(dwError);
    }

    Удивительнейший способ регистрации ошибок в функции DllMain при инжекте библиотеки шеллкодом из другого процесса (кто знает - тот поймет)... линк: http://www.wasm.ru/forum/viewtopic.php?id=43291

    Запостил: ReL, 07 Декабря 2011

    Комментарии (22) RSS

    • Эээ... говно в том, что константа '0xdeadcode' повторяется дважды, но никак не названа?
      Ответить
      • хм, наверное в том что переменные окружения не лучшее место для возврата кода ошибки
        Ответить
        • да... но еще сама идея подобной схемы удивляет...
          Ответить
          • парниша придумал зону видимости больше, чем приложение...
            Ответить
      • константа '0xdeadcode' во стором случае объявлена так для того, чтобы она попала в сам шеллкод (mov esp[id], char), а не в секцию данных... так что в это комментарии "акелла промахнулся" явно)))
        Ответить
        • А х ты ж ёбаный ты ж нахуй, как всё хитрожопо, оказывается. Я вот никогда не имел дело с программами, которым важно, где на самом деле находится константа.
          Короче, я таки хуй и облажался, ладно.
          Ответить
    • Ой, я знаю ещё один глупый вопрос: где здесь тот самый крестоблядский язык?
      Ответить
      • Си позволяет объявлять переменные только в начале функции, так что судя по коду автор собирает его, как С++ код, поэтому я запостил его в секцию С++, так как Си компилятор его не собирет))
        Ответить
        • have you tried C99?
          Ответить
          • не уверен, но мне раньше казалось, что студия 2010 не поддерживает C99... могу ошибаться канеш... опять же судя по коду, он собирается именно студией...
            Ответить
        • ЛПП, в си тоже можно обьявляить переменные где угодно.
          Ответить
        • > Си позволяет объявлять переменные только в начале функции

          Правда?
          Ответить
          • В стандарте C89 можно объявлять переменные только в начале блока (т.е. внутри блока if можно). Сейчас все нормальные компиляторы поддерживают объявление переменных в произвольном порядке.
            http://ideone.com/VNgEC
            Ответить
            • Ааа, блока... А я понять не мог, чё сионистые на Паскаль гонят, если у них так же.
              Ответить
              • Негибко же! Вот бывает пишешь комментарий, вдруг захотелось функцию объявить, а говнокомпилятор говорит - нельзя.
                Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий