Добрый день! Кто-нибудь знает как в #define запихать inline ассемблер? (В VisualStudio2005) Вот этот код работает прекрасно (для меня ) Код (Text): #define _KEY_ 21323455 void __declspec(naked) s1() { __asm __emit 'h' __asm __emit 'e' __asm __emit 'l' __asm __emit 'l' __asm __emit 'o' __asm __emit 0 } void main() { char *p1; __asm push [s1+_KEY_] __asm mov eax, [esp] __asm mov ebx,eax __asm sub ebx,_KEY_ __asm mov p1,ebx MessageBoxA(0,p1,"",0); } а вот так не хочет: Код (Text): ... #define addrEx(p, x) (__asm push [s1+_KEY_] __asm mov eax, [esp] __asm mov ebx,eax __asm sub ebx,_KEY_ __asm mov p1,ebx) ... char *p1; addrEx(p1,s1) ... Выдает: error C2059: syntax error : '__asm'
Код (Text): #define addrEx(p, x) \ __asm {push [s1+_KEY_]}; \ __asm {mov eax, [esp]}; \ __asm {mov ebx,eax}; \ __asm {sub ebx,_KEY_}; \ __asm {mov p1,ebx}
Код (Text): #define xxx_HOOK_PTR(rva,hook) __asm{ \ LOAD_BASE_TO_EAX \ __asm mov eax,[eax+g_hEngine + RANDOM] \ __asm mov dword ptr [eax+rva],offset hook \ } #define LOAD_BASE_TO_EAX \ __asm call BASE \ __asm BASE: pop eax \ __asm sub eax,offset BASE + RANDOM
Great Спасибо, чет я сразу не сообразил В ИДЕ получается так: Код (Text): public start start proc near var_C= dword ptr -0Ch lpText= dword ptr -4 push ebp mov ebp, esp push ecx push ebx push 1856EBFh mov eax, [esp+0Ch+var_C] mov ebx, eax sub ebx, 1455EBFh mov [ebp+lpText], ebx mov eax, [ebp+lpText] push 0 ; uType push offset Caption ; lpCaption push eax ; lpText push 0 ; hWnd call ds:MessageBoxA pop ebx mov esp, ebp pop ebp retn start endp ; sp-analysis failed И попробуй на глаз догадайся, что за текст выводится
GoldFinch Можешь вот это пояснить? Код (Text): #define xxx_HOOK_PTR(rva,hook) __asm{ \ LOAD_BASE_TO_EAX \ __asm mov eax,[eax+g_hEngine + RANDOM] \ __asm mov dword ptr [eax+rva],offset hook \ } #define LOAD_BASE_TO_EAX \ __asm call BASE \ __asm BASE: pop eax \ __asm sub eax,offset BASE + RANDOM
__asm нужен как разделитель команд если они идут в одну строчку (а макросы раскрываются в одну строчку!) обертка __asm{ } не нужна над ними. скобки излишни. чудесно заменить можно на __asm push [s1+_KEY_] __asm mov eax, [esp] __asm .... gloomyraven __asm { } лишнее
Defining __asm Blocks as C Macros http://msdn.microsoft.com/en-us/library/352sth8z%28VS.80%29.aspx внешний __asm{} нужен если писать дефайн в одной строке с чем-то другим
GoldFinch Ну это само собой, но помещать асм-вставку в одной строке с чем-то другим это уже плохой стиль.
Great и асм вставки, и дефайны, говорят о том что это нестандартная ситуация, что средствами языка проблему решить не удалось, и в такой нестандартной ситуации может потребоваться написать С\С++ код после асм вставки. Код (Text): #define GET_ADDR(ptr,var) __asm{ \ LOAD_DELTA_TO_EAX \ add eax,offset var \ mov ptr,eax \ } #define GLOBAL(var) *TMP; GET_ADDR(TMP,var); *TMP // использование float g_time; ... void set_time(float t) { float GLOBAL(g_time) = t; } не лучший пример, но мало ли что бывает %)
Решил продолжить тему Код (Text): #include <windows.h> #pragma comment(linker,"/ENTRY:main") #pragma comment(lib,"kernel32.lib") void __declspec(naked) s1() { __asm __emit 'h' __asm __emit 'e' __asm __emit 'l' __asm __emit 'l' __asm __emit 'o' __asm __emit 0 } #define _KEY1 21323455 #define _KEY2 0xffffd inline DWORD __declspec(naked) delta_offset() { __asm { call delta delta: pop eax sub eax, offset delta } } // Вычисляет значение p = (DeltaOffset+x+KEY)-KEY // Использует регистр EAX #define addrEx(p, x) \ __asm push eax \ __asm call DELTA \ __asm DELTA: pop eax \ __asm neg eax \ __asm lea eax,[eax+DELTA+_KEY2] \ __asm lea eax,[eax-_KEY2] \ __asm lea eax,[eax+x+_KEY1] \ __asm lea eax,[eax-_KEY1] \ __asm mov p, eax \ __asm pop eax // тоже самое и для адреса функции #define callEx(pFunc, pOrig_func) \ __asm push ebx \ addrEx(ebx, pOrig_func) \ __asm mov [pFunc], ebx \ __asm pop ebx typedef bool * Tmy_messagebox(DWORD x); bool my_messagebox(DWORD x) { char *p1; addrEx(p1,s1) MessageBoxA(0,p1,"",0); return x; } void main() { Tmy_messagebox *pFunc; callEx(pFunc, my_messagebox) pFunc(1); return; } В дизассемблере получается мясо (для хацкеров-новичков). Есть у кого предложения по усовершенствованию обфускции c++ кода? Я вот думаю, если вместо _KEY1 и _KEY2 на этапе компилляции будут использоваться случайные числа, то это еще больше обфусцирует код. Конечно никто не мешает прогнать код отладчиком, узнать какие функции вызываются и с какими параметрами, написать парсер, который вырежет эти шаблоны (addrEx и callEx), подставив оригинальные адреса, но это прибавит время для взлома, что уже приятно Еще думал насчет того, чтобы макросы addrEx и callEx сдлеать полиморфными, вроде бы это можно реализовать с помощью pre-build events, добавить кучу антиотладочных приемов и получится полнейшая жесть на СИ++ )))) Ну как?
GoldFinch Для получения адреса глобально переменной я делаю так Код (Text): // макрос для вычисление адреса переменной с учетом дельта-смещения #define ADDR(x) (DeltaOffset()+(DWORD)(x))
Ну, собственно, как я делаю вставки (описание): 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 Может, поможет.