Jump to content
zorro59

Callback in Dll

Recommended Posts

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);
}

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 .

Link to comment
Share on other sites

Corect!

@aphex

Cea mai bune idee sa iti injectezi codul intr-un executabil care ruleaza la startup

1. PE injection:

@aphex

Eventual sa il faci sa incarce un dll

2. Dll hijacking:

Off: Era un programator cu numele Aphex, a scris multe snipett-uri de calitate. Is that you? :)

Link to comment
Share on other sites

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 by zorro59
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...