Ta witryna korzysta z plików cookies. Korzystając z witryny akceptujesz: polityka prywatności. [×]
Online: 0x08 (8)
haker.iиfø — Etyczny hacking _ Spreading knowledge like a virus.
Wykrywanie okna określonego narzędzia
🕰 ✒️ Dawid Farbaniec📄 730 słów
0x01. Słowem wstępu
Ten wpis zawiera opis
prostej i znanej metody przeciwko inżynierii odwrotnej kodu (RCE).
Jej zasada działania polega na wykrywaniu czy okno określonego narzędzia (np. debuggera, disassemblera,
piaskownicy, hex edytora itp.) jest uruchomione. W przypadku wykrycia danego narzędzia
analizowana aplikacja może zmienić swój przepływ wykonania, czyli działać inaczej niż zwykle.
Można zaprogramować nieoczekiwane zamknięcie aplikacji (z komunikatem ostrzegawczym lub bez)
czy po prostu powodować jej błędne działanie w celu utrudnienia analizy wstecznej jej kodu.
Metoda ta nie jest żadną nowością, jednak chciałbym przedstawić ją na gotowych przykładach
w trzech językach programowania (Asembler, C++ i C#.NET), aby początkujący programiści, którzy jej potrzebują
mieli mocny punkt zaczepienia.
0x02. Schemat działania
Utworzenie funkcji zwrotnej EnumWindowsProc, która porównuje
pobrany tytuł (GetWindowText) bieżącego okna z szukanym napisem.
Wywołanie funkcji EnumDesktopWindows interującej po oknach bieżącego pulpitu
(podając jej adres funkcji zwrotnej typu callback).
W przypadku wykrycia okna pulpitu o określonym tytule wyświetlany jest komunikat.
Zachowanie po wykryciu okna narzędzia należy zaprogramować wedle uznania.
0x03. Przykład w Asemblerze x64 (MASM64 / ML64.EXE)
;------------------------------------------------------------+
; Coded in Assembler x64 (MASM64 / ML64.EXE) by haker.info |
; |
; PL: Program sprawdza czy okno określonego |
; narzędzia jest uruchomione (Unicode!) |
; |
; EN: Application iterates through all |
; desktop windows to check specified window title |
;------------------------------------------------------------+extrnEnumDesktopWindows:procextrnGetWindowTextW:procextrnGetWindowTextLengthW:procextrnMessageBoxW:procextrnlstrcmpW:procextrnExitProcess:proc.data;unicode string "Kalkulator"szTargetTitledw"K","a","l","k","u","l","a","t","o","r",0;bufor na aktualnie pobrany tytułszCurrentWindowdw4096dup(0);unicode string "Znaleziono!"szMessageTextdw"Z","n","a","l","e","z","i","o","n","o","!",0szCopyrightdb"haker.info",0.code;funkcja zwrotna (callback) pobierająca uchwyty okien pulpituEnumWindowsProcprochWnd:qword,lparam:qword;pobierz tytuł bieżącego oknasubrsp,30hxorr9,r9movr8,255movrdx,offsetszCurrentWindowcallGetWindowTextWaddrsp,30h;jeśli napis jest pusty zwróć TRUE (szukaj dalej)testrax,raxjz_true;porównaj bieżący tytuł okna z szukanym napisemsubrsp,30hxorr9,r9xorr8,r8movrdx,offsetszTargetTitlemovrcx,offsetszCurrentWindowcalllstrcmpWaddrsp,30h;jeśli to nie ten tytuł to zwróć TRUE (szukaj dalej)testrax,raxjnz_true;w przeciwnym wypadku wyświetl komunikat, że znaleziono :)subrsp,30hxorr9,r9movr8,offsetszMessageTextmovrdx,offsetszMessageTextxorrcx,rcxcallMessageBoxWaddrsp,30hjmp_false_true:movrax,01hret_false:movrax,0hretEnumWindowsProcendp;funkcja głównaMainproc;wywołanie funkcji wyliczającej okna bieżącego pulpitusubrsp,28hxorr9,r9movr8,offsetszTargetTitlemovrdx,EnumWindowsProcxorrcx,rcxcallEnumDesktopWindowsaddrsp,28h;zakończ programsubrsp,28hxorrcx,rcxcallExitProcessMainendpend
Budowanie powyższego kodu w Asemblerze MASM64 (BUILD.BAT):
/*Coded in Visual C++ by haker.infoPL: Program sprawdza czy okno określonegonarzędzia jest uruchomioneEN: Application iterates through alldesktop windows to check specified window title*/#include <Windows.h>#include <string>BOOLCALLBACKEnumWindowsProc(HWND hwnd,LPARAM lParam){WCHAR titleText[255]={'\0'};std::wstring title;if(GetWindowTextLength(hwnd)==0)return TRUE;GetWindowText(hwnd, titleText,255+1);
title = titleText;if(title.find((LPCWSTR)lParam)==0){MessageBox(0,(std::wstring(L"Znaleziono okno o nazwie: ")+ title).c_str(),L"Informacja", MB_ICONINFORMATION);return FALSE;}return TRUE;}int wmain(){std::wstring targetTitle =L"Kalkulator";EnumDesktopWindows(0,&EnumWindowsProc,(LPARAM)targetTitle.c_str());return EXIT_SUCCESS;}
0x05. Przykład w Visual C# (.NET)
/*Coded in C#.NET by haker.infoPL: Program sprawdza czy okno określonegonarzędzia jest uruchomioneEN: Application iterates through alldesktop windows to check specified window title*/using System;using System.Text;using System.Runtime.InteropServices;namespace ConsoleApp1
{class Program
{[DllImport("user32.dll")]staticexternbool EnumDesktopWindows(IntPtr hDesktop, EnumDesktopWindowsDelegate lpfn, IntPtr lParam);[DllImport("user32.dll", EntryPoint ="GetWindowText", ExactSpelling =false, CharSet = CharSet.Auto)]staticexternint GetWindowText(IntPtr hWnd, StringBuilder lpWindowText,int nMaxCount);[DllImport("user32.dll", CharSet = CharSet.Unicode)]staticexternint MessageBox(int hWnd,string text,string caption,uint type);constint MB_ICONINFORMATION =0x00000040;delegatebool EnumDesktopWindowsDelegate(IntPtr hWnd,int lParam);staticvoid Main(string[] args){string targetTitle ="Kalkulator";
EnumDesktopWindowsDelegate EnumWindowsProc =(IntPtr hWnd,int lParam)=>{var title =new StringBuilder(255);
GetWindowText(hWnd, title, title.Capacity +1);if(string.IsNullOrEmpty(title.ToString()))returntrue;if(title.ToString().Contains(targetTitle)){
MessageBox(0,"Znaleziono okno o nazwie: "+ title,"Informacja", MB_ICONINFORMATION);returnfalse;}returntrue;};
EnumDesktopWindows(IntPtr.Zero, EnumWindowsProc, IntPtr.Zero);}}}
0x06. Zakończenie
Dziękuję za czas poświęcony na przeczytanie tego wpisu.
Wykaz literatury (bibliografia)
[1] Microsoft Corporation, 2018 – https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-enumdesktopwindows [dostęp: 02.01.2020 r.]
Postać Mr. At nawiązuje do
gier z gatunku roguelike/ASCII RPG w których do wyświetlania
grafiki korzysta się ze znaków tekstowych. Znak @ (at) w grach
roguelike przeważnie oznacza postać bohatera.
Wszystkie treści umieszczone na tej witrynie są chronione prawem autorskim. Surowo zabronione jest kopiowanie i rozpowszechnianie zawartości tej witryny bez zgody autora. Wszelkie opublikowane tutaj treści (w tym kody źródłowe i inne) służą wyłącznie celom informacyjnym oraz edukacyjnym. Właściciele tej witryny nie ponoszą odpowiedzialności za ewentualne niezgodne z prawem wykorzystanie zasobów dostępnych w witrynie. Użytkownik tej witryny oświadcza, że z zamieszczonych tutaj danych korzysta na własną odpowiedzialność. Wszelkie znaki towarowe i nazwy zastrzeżone zostały użyte jedynie w celach informacyjnych i należą wyłącznie do ich prawnych właścicieli. Autor tej witryny w czasie tworzenia treści nie działa w imieniu firm, których technologie czy produkty opisuje — chyba, że jest to jasno oznaczone. Korzystając z zasobów witryny haker.info oświadczasz, że akceptujesz powyższe warunki oraz politykę prywatności.