I have made a code which can enumerate module names associated threads.
But there is a problem in windows xp. When i enumarate modules dll names return NULL.
IN WINDOWS XP LIKE THAT :
Code:
Karacabay-Scan : Dlls : Karacabay-Scan : Dlls : Karacabay-Scan : Dlls : Karacabay-Scan : Dlls : Karacabay-Scan : Dlls : Karacabay-Scan : Dlls : Karacabay-Scan : Dlls : Karacabay-Scan : Dlls : Karacabay-Scan : Dlls : Karacabay-Scan : Dlls : Karacabay-Scan : Dlls :
Code:
Karacabay-Scan : Dlls : D:\TEMIZ METIN2 - HS CALISMA\giris.exe Karacabay-Scan : Dlls : D:\TEMIZ METIN2 - HS CALISMA\giris.exe Karacabay-Scan : Dlls : C:\Windows\SYSTEM32\ntdll.dll Karacabay-Scan : Dlls : C:\Windows\SYSTEM32\ntdll.dll Karacabay-Scan : Dlls : C:\Windows\SYSTEM32\ntdll.dll Karacabay-Scan : Dlls : C:\Windows\SYSTEM32\ntdll.dll Karacabay-Scan : Dlls : C:\Windows\SYSTEM32\ntdll.dll Karacabay-Scan : Dlls : C:\Windows\SYSTEM32\ntdll.dll Karacabay-Scan : Dlls : C:\Windows\system32\mswsock.dll
Code:
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L) #define ThreadQuerySetWin32StartAddress 9 typedef NTSTATUS (WINAPI *NTQUERYINFOMATIONTHREAD)(HANDLE, LONG, PVOID, ULONG, PULONG); BOOL MatchAddressToModule(__in DWORD dwProcId, __out_bcount(MAX_PATH) LPTSTR lpstrModule, __in DWORD dwThreadStartAddr, __out_opt PDWORD pModuleStartAddr) // by Echo { BOOL bRet = FALSE; HANDLE hSnapshot; MODULEENTRY32 moduleEntry32; hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPALL, dwProcId); moduleEntry32.dwSize = sizeof(MODULEENTRY32); moduleEntry32.th32ModuleID = 1; if(Module32First(hSnapshot, &moduleEntry32)){ if(dwThreadStartAddr >= (DWORD)moduleEntry32.modBaseAddr && dwThreadStartAddr <= ((DWORD)moduleEntry32.modBaseAddr + moduleEntry32.modBaseSize)){ wcscpy(lpstrModule, moduleEntry32.szExePath); //convert from wide char to narrow char array }else{ while(Module32Next(hSnapshot, &moduleEntry32)){ if(dwThreadStartAddr >= (DWORD)moduleEntry32.modBaseAddr && dwThreadStartAddr <= ((DWORD)moduleEntry32.modBaseAddr + moduleEntry32.modBaseSize)){ wcscpy(lpstrModule, moduleEntry32.szExePath); break; } } } } if(pModuleStartAddr) *pModuleStartAddr = (DWORD)moduleEntry32.modBaseAddr; CloseHandle(hSnapshot); return bRet; } DWORD WINAPI GetThreadStartAddress(__in HANDLE hThread) // by Echo { NTSTATUS ntStatus; DWORD dwThreadStartAddr = 0; HANDLE hPeusdoCurrentProcess, hNewThreadHandle; NTQUERYINFOMATIONTHREAD NtQueryInformationThread; if((NtQueryInformationThread = (NTQUERYINFOMATIONTHREAD)GetProcAddress(GetModuleHandle(_T("ntdll.dll")), ("NtQueryInformationThread")))){ hPeusdoCurrentProcess = GetCurrentProcess(); if(DuplicateHandle(hPeusdoCurrentProcess, hThread, hPeusdoCurrentProcess, &hNewThreadHandle, THREAD_QUERY_INFORMATION, FALSE, 0)){ ntStatus = NtQueryInformationThread(hNewThreadHandle, ThreadQuerySetWin32StartAddress, &dwThreadStartAddr, sizeof(DWORD), NULL); CloseHandle(hNewThreadHandle); if(ntStatus != STATUS_SUCCESS){ return 0; } } } return dwThreadStartAddr; } int threadmodules() { HANDLE hSnapshot, hThread; THREADENTRY32 threadEntry32; DWORD dwModuleBaseAddr, dwThreadStartAddr; TCHAR lpstrModuleName[MAX_PATH] = {0}; CHAR moduleget[MAX_PATH] = {0}; if((hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, GetCurrentProcessId())) == INVALID_HANDLE_VALUE) return 0; threadEntry32.dwSize = sizeof(THREADENTRY32); threadEntry32.cntUsage = 0; if(Thread32First(hSnapshot, &threadEntry32)){ if(threadEntry32.th32OwnerProcessID == GetCurrentProcessId()){ hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, threadEntry32.th32ThreadID); dwThreadStartAddr = GetThreadStartAddress(hThread); MatchAddressToModule(GetCurrentProcessId(), lpstrModuleName, dwThreadStartAddr, &dwModuleBaseAddr); std::wstring aaa (lpstrModuleName); std::string mystr (aaa.begin() , aaa.end()); fstream textfile; textfile.open ("mgm.log", ios::out | ios::app); textfile<< "Karacabay-Scan : " <<"Dlls : "<< mystr.c_str()<< endl; CloseHandle(hThread); } while(Thread32Next(hSnapshot, &threadEntry32)){ if(threadEntry32.th32OwnerProcessID == GetCurrentProcessId()){ hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, threadEntry32.th32ThreadID); dwThreadStartAddr = GetThreadStartAddress(hThread); MatchAddressToModule(GetCurrentProcessId(), lpstrModuleName, dwThreadStartAddr, &dwModuleBaseAddr); std::wstring aaa (lpstrModuleName); std::string mystr (aaa.begin() , aaa.end()); fstream textfile; textfile.open ("mgm.log", ios::out | ios::app); textfile<< "Karacabay-Scan : " <<"Dlls : "<< mystr.c_str()<< endl; CloseHandle(hThread); } } } CloseHandle(hSnapshot); return 0; }