Кресты / Говнокод #6523 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 4c7497f8e9d9462d, (Updated )

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

  • >#define цой_жив(...)
    разве возмжно сделать макросы с переменным числом параметров?
    Ответить
  • я не верю, что такое есть в бусте
    если есть, то мысленно плюсую гк
    Ответить
    • впрочем, >#define цой_жив
      доказывает, что это не код из буста
      Ответить
          • Ну есть глюки...

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

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

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

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

                          Не то?
                          Ответить
            • > конвекции
              когда унтерменш что-то обсирает это выглядит убого
              Ответить
  • Да ещё и асмокод, в котором сначала считается число, умноженное на 4, а потом делается мовсб вместо мовсд без умножения на 4.
    Ответить

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

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8