zorro59 Posted June 27, 2012 Report Posted June 27, 2012 Ok, deci eu trebuie sa filtrez niste mesaje pe care o anumita fereastra le primeste(Task Manager).In momentul in care apare mesajul LVM_INSERTITEMA sau LVM_INSERTITEMW eu trebuie sa le opresc daca ele contin numele aplicatiei mele.Am reusit sa obtin mesajele, dar nu pot sa obtin in nici un fel textul care este trimis (primesc valori de genul "409:00000409;041e:0000041e").Are cineva idei? (mentionez ca sunt pe x64).LRESULT CALLBACK WndProc(int nCode, WPARAM wParam,LPARAM lParam){ CWPSTRUCT* msg = (CWPSTRUCT*)lParam; if (msg->message == LVM_INSERTITEMW) { LVITEMW* l2 = (LVITEMW*)lParam; fstream file("C:\\test.txt", ios::app); file<<CW2A(l2->pszText)<<" wide"<<endl; file.close(); } if (msg->message == LVM_INSERTITEMA) { LVITEM* lv = (LVITEM*)msg->lParam; fstream file("C:\\test.txt", ios::app); file<<lv->pszText<<endl; file.close(); } return CallNextHookEx(hook, nCode, wParam, lParam);} Quote
Nytro Posted June 27, 2012 Report Posted June 27, 2012 Nu prea inteleg cum ai procedat. Dll-ul e injectat in TaskManager.exe nu? Cum ai facut sa preiei mesajele? Mai exact, codul tau ruleaza in cadrul procesului de Task Manager? Pentru ca pointerii (LVITEMW*) sunt relativi la proces, si daca lucrezi cu siruri de caractere trebuie sa tot ReadProcessMemory/WriteProcessMemory nu numai pe acei pointeri, dar si pe pointerii la sirurile de caractere l2->pszText. Quote
zorro59 Posted June 27, 2012 Author Report Posted June 27, 2012 WndProc ruleaza in spatiul de memorie al taskmanagerului.#pragma data_seg (".shared")HWND task = 0;HHOOK hook = 0;char name [128] = { '\0' };UINT WM_TEST = 0;#pragma data_seg ()#pragma comment(linker,"/SECTION:.shared,RWS") HINSTANCE hDll;char* SetTaskManagerHook(){ task = FindWindow(NULL, TEXT("Windows Task Manager")); task = FindWindowEx(task, NULL, NULL, "Processes"); task = FindWindowEx(task, NULL, NULL, "Processes"); if (!task) return "Error finding window!"; hook = SetWindowsHookEx( WH_CALLWNDPROC,(HOOKPROC)WndProc, hDll, GetWindowThreadProcessId(task, NULL) ); while (strcmp(name, "") == 0) { Sleep(30); } UnhookWindowsHookEx(hook); return name;}BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } hDll = (HINSTANCE) hModule; return TRUE;}Daca de exemplu modific variabila name, care este in shared, trebuie sa folosesc ReadProcessMemory pentru a obtine valoarea? Quote
Nytro Posted June 27, 2012 Report Posted June 27, 2012 Nu e nevoie de ReadProcessMemory in cazul de fata, SetWindowHookEx iti va injecta DLL-ul in proces si codul se va executa in cadrul acelui proces.Nu stiu exact cum se trimit mesajele de adaugare de element in ListView, dar e posibil sa se foloseasca LVM_SETITEM si LVM_SETITEMTEXT pentru setarea textului pe un element adaugat anterior cu LVM_INSERTITEM.Pentru ca e dubios acel pszText, se poate seta ca LPSTR_TEXTCALLBACK fiind apoi necesara apelarea LVM_SETITEM sau LVM_SETITEMTEXT pentru a fi setat. Quote
Paul4games Posted June 27, 2012 Report Posted June 27, 2012 Tu vrei sa faci hooking ca sa nu mai apara numele aplicatiei tale in task manager?Daca da atunci de ce nu faci hook la API-ul NtQuerySystemInformation()?Cateva exemple:API hooking revealed - CodeProjectsau in stilul tau:Hack Windows Task Manager - CodeProject Quote
aphex Posted June 27, 2012 Report Posted June 27, 2012 pszText este un pointer catre un sir de caractere ( cel mai probabil unicode) . Nu stiu exact cum anume scrii in c++ sirul in fisier pentru ca nu sunt fluent in c++. Dar problema este la scriere ... incearca mai degraba sa fisezi un messagebox poate ai mai mult noroc. Quote
zorro59 Posted June 27, 2012 Author Report Posted June 27, 2012 Am ajuns la un compromis, pana reusesc sa implementez ceva cel putin decent folosind api hooking.Am observat tiparul mesajelor, si atunci cand primeste anumite mesaje, verific daca un item exista in listview si atunci il sterg.Nu am observat flickering, nici pe viteza mare si nici impact asupra performantei, dar stiu ca nu e cum trebuie. Quote
aphex Posted June 27, 2012 Report Posted June 27, 2012 Am ajuns la un compromis, pana reusesc sa implementez ceva cel putin decent folosind api hooking.Am observat tiparul mesajelor, si atunci cand primeste anumite mesaje, verific daca un item exista in listview si atunci il sterg.Nu am observat flickering, nici pe viteza mare si nici impact asupra performantei, dar stiu ca nu e cum trebuie.Nu e chiar cea mai buna metoda daca vrei ca aplicatia ta sa fie stealth ... Iti recomand sa treci pe api hooking sau cea mai bune idee sa iti injectezi codul intr-un executabil care ruleaza la startup eventual sa il faci sa incarce un dll . Quote
staticwater Posted June 27, 2012 Report Posted June 27, 2012 Corect!@aphexCea mai bune idee sa iti injectezi codul intr-un executabil care ruleaza la startup1. PE injection: Portable Executable (P.E.) Code Injection: Injecting an Entire C Compiled Application - CodeProject@aphexEventual sa il faci sa incarce un dll 2. Dll hijacking: DLL Hijacking: Facts and Fiction | threatpostDLL Hijacking Vulnerable ApplicationsOff: Era un programator cu numele Aphex, a scris multe snipett-uri de calitate. Is that you? Quote
zorro59 Posted June 29, 2012 Author Report Posted June 29, 2012 (edited) Ok, am facut api hooking pentru toate procesele de tipul task manager.Acum mai trebuie sa il asculd de explorer.exe si aplicatiile de tipul regedit.Problema este ca functia RegEnumKey este definita ca DECLSPEC_IMPORT LSTATUS APIENTRY si nu pot sa obtin functia originala (GetProcAdress returneaza ERROR_PROC_NOT_FOUND). Am folosit dependancy walker si am vazut ca functia este importata de catre advapi32 din dll-ul "API-MS-WIN-CORE-LOCALREGISTRY-L1-1-0.DLL", dar nu reusesc sa obtin un pointer valid (primesc null).EDIT: am facut o greseala mult prea stupida. Incercam sa importez RegEnumKeyW, dar defapt imi trebuia RegEnumKeyExW, acum obtin un pointer valid, revin cu detalii.EDIT2: am terminat asta, acum am probleme cu FindNextFileW. Daca injectez dll-ul in cmd si folosesc comanda dir, totul este ok, fisierul este ascuns. Insa explorer.exe nu apeleaza functia de fiecare data cand acceseaza un folder de exemplu. Aveti idee cum sa il determin sa creada ca trebuie sa o apleleze (un fel de refresh). Edited June 29, 2012 by zorro59 Quote