#define + __asm

Тема в разделе "WASM.BEGINNERS", создана пользователем gloomyraven, 13 авг 2009.

  1. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Добрый день!
    Кто-нибудь знает как в #define запихать inline ассемблер? (В VisualStudio2005)
    Вот этот код работает прекрасно (для меня :) )
    Код (Text):
    1. #define _KEY_ 21323455
    2.  
    3. void __declspec(naked) s1()
    4. {
    5.     __asm __emit 'h'
    6.     __asm __emit 'e'
    7.     __asm __emit 'l'
    8.     __asm __emit 'l'
    9.     __asm __emit 'o'
    10.     __asm __emit 0
    11. }
    12.  
    13. void main()
    14. {
    15.     char *p1;
    16.     __asm push [s1+_KEY_]
    17.     __asm mov eax, [esp]
    18.     __asm mov ebx,eax
    19.     __asm sub ebx,_KEY_
    20.     __asm mov p1,ebx
    21.  
    22.     MessageBoxA(0,p1,"",0);
    23. }
    а вот так не хочет:

    Код (Text):
    1.         ...
    2.         #define addrEx(p, x) (__asm push [s1+_KEY_] __asm mov eax, [esp] __asm mov ebx,eax __asm sub ebx,_KEY_ __asm mov p1,ebx)
    3.         ...
    4.     char *p1;
    5.     addrEx(p1,s1)
    6.         ...
    Выдает: error C2059: syntax error : '__asm'
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    убери скобки.
    а вообще это жуткое извращение..
     
  3. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    в msdn есть пример
     
  4. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    Код (Text):
    1. #define addrEx(p, x)          \
    2. __asm {push [s1+_KEY_]}; \
    3. __asm {mov eax, [esp]};    \
    4. __asm {mov ebx,eax};       \
    5.  __asm {sub ebx,_KEY_};   \
    6. __asm {mov p1,ebx}
     
  5. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Great
    Извращение нужно, чтобы дизассемблер, скажем IDA, не смог сделать перекрестные ссылки
     
  6. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Код (Text):
    1. #define xxx_HOOK_PTR(rva,hook) __asm{ \
    2.         LOAD_BASE_TO_EAX \
    3.         __asm   mov eax,[eax+g_hEngine + RANDOM] \
    4.         __asm   mov dword ptr [eax+rva],offset hook \
    5.         }
    6.  
    7. #define LOAD_BASE_TO_EAX \
    8.         __asm   call BASE \
    9.         __asm   BASE: pop eax \
    10.         __asm   sub eax,offset BASE + RANDOM
     
  7. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Great
    Спасибо, чет я сразу не сообразил :)

    В ИДЕ получается так:
    Код (Text):
    1. public start
    2. start proc near
    3.  
    4. var_C= dword ptr -0Ch
    5. lpText= dword ptr -4
    6.  
    7. push    ebp
    8. mov     ebp, esp
    9. push    ecx
    10. push    ebx
    11. push    1856EBFh
    12. mov     eax, [esp+0Ch+var_C]
    13. mov     ebx, eax
    14. sub      ebx, 1455EBFh
    15. mov     [ebp+lpText], ebx
    16. mov     eax, [ebp+lpText]
    17. push    0               ; uType
    18. push    offset Caption  ; lpCaption
    19. push    eax             ; lpText
    20. push    0               ; hWnd
    21. call      ds:MessageBoxA
    22. pop     ebx
    23. mov    esp, ebp
    24. pop     ebp
    25. retn
    26. start endp ; sp-analysis failed
    И попробуй на глаз догадайся, что за текст выводится
     
  8. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    в С\С++ коде надо чтоб у макроса было __asm{}
    внутри __asm{}, __asm{} не надо
     
  9. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    GoldFinch
    В MSDN не видел
     
  10. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    o14189
    И так работает, сэнкс
     
  11. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    GoldFinch
    Можешь вот это пояснить?
    Код (Text):
    1. #define xxx_HOOK_PTR(rva,hook) __asm{ \
    2.         LOAD_BASE_TO_EAX \
    3.         __asm   mov eax,[eax+g_hEngine + RANDOM] \
    4.         __asm   mov dword ptr [eax+rva],offset hook \
    5.         }
    6.  
    7. #define LOAD_BASE_TO_EAX \
    8.         __asm   call BASE \
    9.         __asm   BASE: pop eax \
    10.         __asm   sub eax,offset BASE + RANDOM
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    __asm нужен как разделитель команд если они идут в одну строчку (а макросы раскрываются в одну строчку!)

    обертка __asm{ } не нужна над ними.
    скобки излишни.
    чудесно заменить можно на __asm push [s1+_KEY_] __asm mov eax, [esp] __asm ....

    gloomyraven
    __asm { } лишнее
     
  13. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Всем спасибо :)
     
  14. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Defining __asm Blocks as C Macros
    http://msdn.microsoft.com/en-us/library/352sth8z%28VS.80%29.aspx

    внешний __asm{} нужен если писать дефайн в одной строке с чем-то другим
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    GoldFinch
    Ну это само собой, но помещать асм-вставку в одной строке с чем-то другим это уже плохой стиль.
     
  16. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Great
    и асм вставки, и дефайны, говорят о том что это нестандартная ситуация, что средствами языка проблему решить не удалось, и в такой нестандартной ситуации может потребоваться написать С\С++ код после асм вставки.

    Код (Text):
    1. #define GET_ADDR(ptr,var) __asm{ \
    2.    LOAD_DELTA_TO_EAX \
    3.    add eax,offset var  \
    4.    mov ptr,eax \
    5.    }
    6.  
    7. #define GLOBAL(var) *TMP; GET_ADDR(TMP,var); *TMP
    8.  
    9. // использование
    10. float g_time;
    11. ...
    12. void set_time(float t)
    13. {
    14.   float GLOBAL(g_time) = t;
    15. }
    не лучший пример, но мало ли что бывает %)
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ну я понимаю, я к тому, что это жуть:)
     
  18. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Решил продолжить тему :)
    Код (Text):
    1. #include <windows.h>
    2. #pragma comment(linker,"/ENTRY:main")
    3. #pragma comment(lib,"kernel32.lib")
    4.  
    5. void __declspec(naked) s1()
    6. {
    7.     __asm __emit 'h'
    8.     __asm __emit 'e'
    9.     __asm __emit 'l'
    10.     __asm __emit 'l'
    11.     __asm __emit 'o'
    12.     __asm __emit 0
    13. }
    14.  
    15. #define _KEY1   21323455
    16. #define _KEY2   0xffffd
    17.  
    18. inline DWORD __declspec(naked) delta_offset()
    19. {
    20.     __asm
    21.     {
    22.         call delta
    23.         delta:
    24.         pop eax
    25.         sub eax, offset delta
    26.     }
    27. }
    28.  
    29. // Вычисляет значение p = (DeltaOffset+x+KEY)-KEY
    30. // Использует регистр EAX
    31. #define addrEx(p, x) \
    32. __asm push  eax \
    33. __asm call  DELTA \
    34. __asm DELTA: pop eax \
    35. __asm neg   eax \
    36. __asm lea   eax,[eax+DELTA+_KEY2] \
    37. __asm lea   eax,[eax-_KEY2] \
    38. __asm lea   eax,[eax+x+_KEY1] \
    39. __asm lea   eax,[eax-_KEY1] \
    40. __asm mov   p, eax \
    41. __asm pop   eax
    42.  
    43. // тоже самое и для адреса функции
    44. #define callEx(pFunc, pOrig_func) \
    45.     __asm push  ebx \
    46.     addrEx(ebx, pOrig_func) \
    47.     __asm mov   [pFunc], ebx \
    48.     __asm pop   ebx
    49.  
    50.  
    51. typedef bool * Tmy_messagebox(DWORD x);
    52. bool my_messagebox(DWORD x)
    53. {
    54.     char *p1;
    55.     addrEx(p1,s1)
    56.  
    57.     MessageBoxA(0,p1,"",0);
    58.     return x;
    59. }
    60.  
    61. void main()
    62. {
    63.     Tmy_messagebox *pFunc;
    64.     callEx(pFunc, my_messagebox)
    65.     pFunc(1);
    66.  
    67.     return;
    68. }
    В дизассемблере получается мясо (для хацкеров-новичков). Есть у кого предложения по усовершенствованию обфускции c++ кода? Я вот думаю, если вместо _KEY1 и _KEY2 на этапе компилляции будут использоваться случайные числа, то это еще больше обфусцирует код. Конечно никто не мешает прогнать код отладчиком, узнать какие функции вызываются и с какими параметрами, написать парсер, который вырежет эти шаблоны (addrEx и callEx), подставив оригинальные адреса, но это прибавит время для взлома, что уже приятно :)
    Еще думал насчет того, чтобы макросы addrEx и callEx сдлеать полиморфными, вроде бы это можно реализовать с помощью pre-build events, добавить кучу антиотладочных приемов и получится полнейшая жесть на СИ++ :)))))
    Ну как?
     
  19. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    GoldFinch
    Для получения адреса глобально переменной я делаю так
    Код (Text):
    1. // макрос для вычисление адреса переменной с учетом дельта-смещения
    2. #define ADDR(x) (DeltaOffset()+(DWORD)(x))
     
  20. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Ну, собственно, как я делаю вставки (описание):
    http://wiki.xskernel.org/doku.php/xskernel/general/inline_asm

    Вот исходники:
    http://svn.xskernel.org/viewvc/xskernel-current/xskernel/include/lang/asm.hpp?revision=96&view=markup

    Может, поможет.