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

    +159

    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
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    #define цой_жив(...) , ## __VA_ARGS__
    
    #define COUNT_PARMS2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _, ...) _
    #define REPEAT_PARAMS(...) (__VA_ARGS__)
    #define COUNT_PARMS(...) \
       COUNT_PARMS2 REPEAT_PARAMS(цой_жив(__VA_ARGS__) 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
    
    template<class>
    struct call_type;
    
    #define NUM_ARGS 13
    
    #define C_CALL_REPEAT(z,n,data) \
    	template<class R BOOST_PP_ENUM_TRAILING_PARAMS(n,class A)> \
    	struct call_type<R __cdecl(BOOST_PP_ENUM_PARAMS(n,A))> \
    	{ \
    	enum{j}; \
    	};
    
    BOOST_PP_REPEAT(BOOST_PP_INC(NUM_ARGS),C_CALL_REPEAT,~);
    
    #define STD_CALL_REPEAT(z,n,data) \
    	template<class R BOOST_PP_ENUM_TRAILING_PARAMS(n,class A)> \
    	struct call_type<R __stdcall(BOOST_PP_ENUM_PARAMS(n,A))> \
    	{ \
    	enum{j=1}; \
    	}; 
    
    BOOST_PP_REPEAT(BOOST_PP_INC(NUM_ARGS),STD_CALL_REPEAT,~);
    
    #define VAR_CALL_REPEAT(z,n,data) \
    	template<class R BOOST_PP_ENUM_TRAILING_PARAMS(n,class A)> \
    	struct call_type<R __cdecl(BOOST_PP_ENUM_PARAMS(n,A) BOOST_PP_COMMA_IF(n) ...)> \
    	{ \
    	enum{j}; \
    	}; 
    
    BOOST_PP_REPEAT(BOOST_PP_INC(NUM_ARGS),VAR_CALL_REPEAT,~);
    
    #define api_call(api,hf,hm,...) \
    	((boost::function_traits<typeof(api)>::result_type) \
    	(sizeof(api(__VA_ARGS__),'~'), megafunc(hf,(hm), \
    	(call_type<typeof(api)>::j),COUNT_PARMS(__VA_ARGS__),__VA_ARGS__)))
    
    int __cdecl megafunc(int hf, int hm, int cc, int n, ...)
    {
    	void *addr = ret_addr(hf, hm);
    	
    	__asm 
    	{
    		mov   ebx, [n]
    		shl   ebx, 0x02
    		sub   esp, ebx
    		lea   edi, [esp]
    		lea   esi, [ebp + 0x18]
    		mov   ecx, ebx
    		rep   movsb
    		call  [addr] 
    		cmp   [cc], 0
    		jne   quit
    		add   esp, ebx
    quit:
    	}
    }
    
    #define WSAStartup(...) api_call(WSAStartup,0xcdde757d,0xd6bc4bcc,__VA_ARGS__)
    #define sprintf(...) api_call(sprintf,0x2d3a75e1,0xb634b9cd,__VA_ARGS__)
    ...

    Запостил: 4c7497f8e9d9462d, 01 Мая 2011

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

    • Жуткий код.
      Ответить
    • mov рот, маца
      Ответить
    • >#define цой_жив(...)
      разве возмжно сделать макросы с переменным числом параметров?
      Ответить
      • точно, в стандарте этого нет. есть только в С99, но не в С++
        Ответить
      • возможно...
        Ответить
    • я не верю, что такое есть в бусте
      если есть, то мысленно плюсую гк
      Ответить
      • впрочем, >#define цой_жив
        доказывает, что это не код из буста
        Ответить
    • Ну и говнище...
      Ответить
      • лол, ну ты на свой дельфи посмотри...
        Ответить
        • Посмотрел. Всё чистенько, аккуратненько...
          Ответить
          • да ладно, тебе тарас, сам же срал на свою дельфу:
            http://govnokod.ru/2172
            где аккуратненько?
            Ответить
            • Ну есть глюки...

              Отсутствие инлайна бесит, да.
              И ещё бесит дебильное изобретение ботланда - деструкторы, которые надо ВЫЗЫВАТЬ РУКАМИ.
              Ответить
              • в принципе, программировать на дельфи - это закат солнца руками, так что не тебе по этому поводу переживать
                такие индусы, как ты все сделают руками за еду, и не только руками
                Ответить
                • Крестушок, не шали.
                  Ответить
                  • Чем отличаются Дельфийские дженерики от C++ шаблонов?
                    http://dmgate.k210.org/?id=1302032335&n=3

                    >делфи - костыли, надстройка, нарост, опухоль
                    >Delphi generics имеют ошибки
                    >Имеют недореализации, нет constraints для массивов.
                    >Кто-то, приводил код с TList. На дженериках оказалось не оптимально.
                    Ответить
                    • Особенно аргументирован вот этот аргумент:
                      > делфи - костыли, надстройка, нарост, опухоль

                      А в С++ они изначально были? Или они в С++ были стырены с другого паскалоподобного языка названием на букву "А"?
                      Ответить
                      • LOLChto? Не было в ADA шаблонов.
                        Ответить
                        • Не было только рекурсивной срани (и не будет). А остальное(включая настраиваемые модули) было, и поудобнее, чем в С++ сейчас - я про указание необходимых операций в заголовке шаблона.
                          Ответить
                  • >Крестушок, не шали.
                    приятно познакомиться, а меня Иван
                    Ответить
                    • какой остроумный ответ! сами придумали?
                      ЛОЛ, это пиздец какой-то, ГК захвачен детсадовцами
                      Ответить
                    • это шутка на уровне Высоцкого! или даже выше
                      Ответить
        • вот именно на дельфе такое не сделаеш
          а говно комментаторы типа тараса даже не пониманиющие
          зачем этот код идут нахуй или пусть покажут функциональный аналог на паскале
          Ответить
        • вот именно на дельфе такое не сделаеш
          а говно комментаторы типа тараса даже не пониманиющие
          зачем этот код идут нахуй или пусть покажут функциональный аналог на паскале
          Ответить
          • Ты хакер?..
            Ответить
          • Функциональный аналог чего? Словами опиши, что этот код делает?
            Я вот крестокод читать умею, но только без шаблономакросового говна.
            Ответить
            • вызов произвольной апи-функции по хешу ее имени и с учетом конвекции вызова, указанного в хедере... касательно этого фрагмента дельфе видимо всосет по полной программе)

              ЗЫ делфе - дерьмо кстати!)
              Ответить
              • И что из этого Дельфи не может? Массив адресов функций (индекс-хеш) + принудительная ретипизация адреса к соответствующему функциональному типу, учитывающему сигнатуру и конвенцию.
                Ответить
                • тут тип возвращаемого значения конвенция вызова
                  проверка типов и количества аргуметов вычисляется автоматически
                  для каждой сигнатуры во время компиляции и кстати так как
                  функция не шаблонная механизм лкгко встравивается в шеллкод ты пишеш просто
                  WSAStarup(...); и даже не знаеш через какой механизм все работает
                  точно так же как простой вызов апи теперь напиши это на паскале очень интересно
                  посмотреть что получится если сделаеш тогда я неправ когда сказал
                  что на дельфе это невозможно если не сделаеш то докажеш что это невозможно
                  Ответить
                  • > проверка типов и количества аргуметов вычисляется автоматически
                    для каждой сигнатуры

                    Что-то я не вижу в коде "автоматичности".

                    > 0xcdde757d,0xd6bc4bcc

                    Это что такое?
                    Ответить
                    • это хеши посчитанные от имени библиотеки например (advapi32) и имени функции
                      наример (RegCloseKey) генерится отдельный хедер сразу для нескольких библиотек
                      в котором такое
                      #define WSAStartup(...) api_call(WSAStartup,0xcdde757d,0xd6bc4bc c,__VA_ARGS__)
                      #define sprintf(...) api_call(sprintf,0x2d3a75e1,0xb634b9cd,_ _VA_ARGS__)
                      ...
                      еще вопросы не по теме и ты слил если не предоставиш реализацию
                      Ответить
                      • Я до сих пор не могу понять, реализацию ЧЕГО я должен предоставить.
                        Ручного вычисления хеша и подстановки его в код?
                        Вызова функции по имени, не зная сигнатуры, подставляя непойми какие параметры?
                        Какой смысл?
                        Да, на Дельфи это можно сделать, если что.
                        Ответить
                        • ты должен представить решение вызова функции MessageBoxA по хешу имени функции и имени библиотеки таким образом, чтобы он повторял стандартный вызов функции... то есть в стандартном случае ты пишешь MessageBoxA(NULL, "Test!", "Test!", 0), в случае вызова по хешу пишешь MessageBoxA(NULL, "Test!", "Test!", 0), а в последствии компилятор (препроцессор + компилятор в компайл тайме) преобразует в вызов функции ApiCall(<хеш_user32dll>, <хеш_MessageBoxA>, NULL, "Test!", "Test!", 0)... причем для программиста это должно происходить прозрачно, то есть вызов апи по хешу не должен отличаться от стандартного вызова... вроде понятно объяснил, не?
                          Ответить
                          • > а в последствии компилятор преобразует в вызов функции ApiCall

                            Нахуя?
                            А я ногти на ногах грызть умею.

                            Народ, может вы понимаете, что он имеет в виду, и зачем всё это? Я нихера понять не могу...
                            Ответить
                            • Он хакер.
                              Ответить
                            • Тарас, забей... тебе не дано))
                              Ответить
                              • Почему не дано? Я только что проверил - как нефиг до большого пальца ноги зубами дотягиваюсь.
                                Ответить
                                • Чьими зубами? И до чьей ноги?
                                  --

                                  Из разряда: "На деревьях висели почки. Опять проделки гестапо, подумал Штирлиц"
                                  Ответить
                                • > Почему не дано?
                                  не сечешь фишку так сказать)
                                  Ответить
                          • sprintf(...) api_call(sprintf,0x2d3a75e1,0xb634b9cd,_ _VA_ARGS__)

                            procedure sprintf(s: string; a: array of const); begin
                            api_call(module2.sprintf, $12345678, $9ABCEDF0, s, a);
                            end;

                            Не то?
                            Ответить
                        • опять не по теме
                          слил :-Р
                          Ответить
                          • ты так говоришь, как будто знаешь С++
                            Ответить
                            • ты так говоришь, как будто знать С++ - плохо
                              Ответить
                              • я отвечу завтра, когда придумаю что бы гаденького ответить
                                Ответить
                              • не знать С++ - отстойно
                                знать С++ - кошмарно
                                знать С++, не знать больше ничего - уныло
                                знать С++, знать остальное С++подобное - райское наслаждение.
                                Ответить
                • Кажется срач начинается, кажется срач начи... OH SHI~
                  Ответить
                  • ничё не начинается. все заканчилось давно
                    Ответить
              • > конвекции
                когда унтерменш что-то обсирает это выглядит убого
                Ответить
    • Да ещё и асмокод, в котором сначала считается число, умноженное на 4, а потом делается мовсб вместо мовсд без умножения на 4.
      Ответить
    • Миша, все хуйня, давай заново!
      Ответить

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