Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.27 KB | None | 0 0
  1. #ifndef _WIN64
  2. #error x64 builds supported only!
  3. #endif
  4.  
  5. #include <Windows.h>
  6. #include <map>
  7. #include <string>
  8. #include <memory>
  9. #include <thread>
  10. #include "scanner.h"
  11.  
  12. bool WinDefScanner::m_isAPIloaded = false;
  13.  
  14. namespace windefapi
  15. {
  16. MpManagerOpen_t* MpManagerOpen;
  17. MpHandleClose_t* MpHandleClose;
  18. MpErrorMessageFormat_t* MpErrorMessageFormat;
  19. MpFreeMemory_t* MpFreeMemory;
  20. MpThreatOpen_t* MpThreatOpen;
  21. MpThreatEnumerate_t* MpThreatEnumerate;
  22. MpScanStartEx_t* MpScanStartEx;
  23. WDStatus_t* MpWDStatus;
  24. MpScanResult_t* MpScanResult;
  25. MpScanControl_t* MpScanControl;
  26. }
  27.  
  28. using namespace windefapi;
  29.  
  30. static std::wstring AnsiToWstring(const std::string& input, DWORD locale /*= CP_ACP*/)
  31. {
  32. wchar_t buf[8192] = { 0 };
  33. MultiByteToWideChar(locale, 0, input.c_str(), (int) input.length(), buf, ARRAYSIZE(buf));
  34. return buf;
  35. }
  36.  
  37. static std::string WstringToAnsi(const std::wstring& input, DWORD locale /*= CP_ACP*/)
  38. {
  39. char buf[8192] = { 0 };
  40. WideCharToMultiByte(locale, 0, input.c_str(), (int) input.length(), buf, ARRAYSIZE(buf), nullptr, nullptr);
  41. return buf;
  42. }
  43.  
  44. static void event_handler(void *pUserData, MPCALLBACK_DATA *pData)
  45. {
  46. /*std::wcout << L"\t--- callback invoked ---\n";
  47. std::wcout << L" pData->Type= " << pData->Type << "\n";
  48. std::wcout << L" pData->Notify= " << pData->Notify << "\n";
  49. std::wcout << L" unk0= " << (ULONG64)unk0 << "\n";*/
  50.  
  51. HANDLE *pEventStop = (HANDLE*) pUserData;
  52.  
  53. switch (pData->Notify)
  54. {
  55. /*
  56. case MPNOTIFY::MPNOTIFY_SCAN_INFECTED:
  57. std::wcout << L"Callback: MPNOTIFY_SCAN_INFECTED!\n";
  58. break;
  59.  
  60. case MPNOTIFY::MPNOTIFY_SCAN_START:
  61. std::wcout << L"Callback: MPNOTIFY_SCAN_START\n";
  62. break;
  63. */
  64. case MPNOTIFY::MPNOTIFY_SCAN_COMPLETE:
  65. {
  66. /*
  67. std::wcout << L"------------------------\n";
  68. std::wcout << L"Callback: MPNOTIFY_SCAN_COMPLETE\n";
  69. std::wcout << L" ThreatCount: " << ((MPSCAN_DATA*) pData->Data.pEngineData)->ThreatStats.ThreatCount << "\n";
  70. std::wcout << L" SuspiciousThreatCount: " << ((MPSCAN_DATA*) pData->Data.pEngineData)->ThreatStats.SuspiciousThreatCount << "\n";
  71. std::wcout << L" Timestamp: " << pData->TimeStamp.LowPart << "\n\n";
  72. std::wcout << L">>> scan complete <<< " << "\n";
  73. */
  74.  
  75. SetEvent(*pEventStop);
  76. break;
  77. }
  78.  
  79. case 8193: // occurs when no file at the resource path/scan abort
  80. {
  81. // std::wcout << L"Callback: possible no file at the target path/no access/scan aborted!\n";
  82. SetEvent(*pEventStop);
  83. break;
  84. }
  85.  
  86. // default:
  87. // std::wcout << L"[Callback invoked with unhandled reason]\n";
  88. }
  89.  
  90. }
  91.  
  92. bool WinDefScanner::load_api()
  93. {
  94. if (WinDefScanner::m_isAPIloaded)
  95. return true;
  96.  
  97. HMODULE winDefLibHandle = LoadLibraryA(WINDEF_CLIENT_DLL);
  98.  
  99. MpManagerOpen = (MpManagerOpen_t*) GetProcAddress(winDefLibHandle, "MpManagerOpen");
  100. MpHandleClose = (MpHandleClose_t*) GetProcAddress(winDefLibHandle, "MpHandleClose");
  101. MpErrorMessageFormat = (MpErrorMessageFormat_t*) GetProcAddress(winDefLibHandle, "MpErrorMessageFormat");
  102. MpFreeMemory = (MpFreeMemory_t*) GetProcAddress(winDefLibHandle, "MpFreeMemory");
  103. MpScanStartEx = (MpScanStartEx_t*) GetProcAddress(winDefLibHandle, "MpScanStartEx");
  104. MpThreatOpen = (MpThreatOpen_t*) GetProcAddress(winDefLibHandle, "MpThreatOpen");
  105. MpThreatEnumerate = (MpThreatEnumerate_t*) GetProcAddress(winDefLibHandle, "MpThreatEnumerate");
  106. MpWDStatus = (WDStatus_t*) GetProcAddress(winDefLibHandle, "WDStatus");
  107. MpScanResult = (MpScanResult_t*) GetProcAddress(winDefLibHandle, "MpScanResult");
  108. MpScanControl = (MpScanControl_t*) GetProcAddress(winDefLibHandle, "MpScanControl");
  109.  
  110. if (MpManagerOpen &&
  111. MpHandleClose &&
  112. MpErrorMessageFormat &&
  113. MpFreeMemory &&
  114. MpScanStartEx &&
  115. MpThreatOpen &&
  116. MpThreatEnumerate &&
  117. MpWDStatus &&
  118. MpScanResult &&
  119. MpScanControl)
  120. {
  121. WinDefScanner::m_isAPIloaded = true;
  122. return true;
  123. }
  124.  
  125. return false;
  126. }
  127.  
  128. bool WinDefScanner::execute()
  129. {
  130. if (!load_api())
  131. return false;
  132.  
  133. return true;
  134. }
  135.  
  136. void WinDefScanner::stop()
  137. {
  138. SetEvent(m_hEvtExecutionRestricted);
  139. }
  140.  
  141. void WinDefScanner::scan_folder(const std::shared_ptr<IScanObj>& scanObj)
  142. {
  143. ResetEvent(m_hEvtExecutionRestricted);
  144. std::thread t(&WinDefScanner::proceed_single, this, scanObj);
  145. t.detach();
  146. }
  147.  
  148. ESCANSTAT WinDefScanner::proceed_single(std::shared_ptr<IScanObj>& item) //thread
  149. {
  150. if (item->is_compleat())
  151. return ESCANSTAT::SCANNEDPREVIOSLY;
  152.  
  153. MPHANDLE managerHandle = NULL;
  154. MPHANDLE scanHandle = NULL;
  155. HRESULT hres = NULL;
  156. MPRESOURCE_INFO resInfo = { 0 };
  157. MPSCAN_RESOURCES res;
  158.  
  159. hres = MpManagerOpen(0, &managerHandle);
  160.  
  161. if (FAILED(hres)) return ESCANSTAT::E_CANTOPENMANAGER;
  162.  
  163. resInfo.Class = MP_RESOURCE_CLASS::MP_RESOURCE_CLASS_UNKNOWN;
  164. resInfo.Scheme = L"folder";
  165.  
  166. wchar_t path[256];
  167. wsprintfW(path, AnsiToWstring(item->folderForScan(), CP_ACP).c_str());
  168. resInfo.Path = path;
  169.  
  170. res.dwResourceCount = 1;
  171. res.pResourceList = &resInfo;
  172.  
  173. HANDLE hCurrentComplete = CreateEvent(nullptr, TRUE, FALSE, nullptr);
  174. char custom_data[256];
  175.  
  176. memset(custom_data, 0, 256);
  177. memcpy(custom_data, &hCurrentComplete, sizeof(HANDLE));
  178.  
  179. struct {
  180. void *cbHandler;
  181. void *pUserData;
  182. }param = { &event_handler, custom_data };
  183.  
  184. const DWORD MpCmdRunOpts = 0x02001031; // set minor bit for async call to MpScanStartEx
  185.  
  186. size_t startTicks = GetTickCount();
  187.  
  188. hres = MpScanStartEx(
  189. managerHandle,
  190. MPSCAN_TYPE::MPSCAN_TYPE_RESOURCE,
  191. MpCmdRunOpts,
  192. 0,
  193. &res,
  194. (PMPCALLBACK_INFO) &param,
  195. &scanHandle
  196. );
  197.  
  198. if (FAILED(hres))
  199. {
  200. CloseHandle(hCurrentComplete);
  201. MpHandleClose(scanHandle);
  202. MpHandleClose(managerHandle);
  203. return ESCANSTAT::E_SCANSTARTEXFAILED;
  204. }
  205.  
  206. HANDLE h_run_conditions []{ hCurrentComplete , m_hEvtExecutionRestricted };
  207.  
  208. DWORD waitstate = WaitForMultipleObjects(2, h_run_conditions, FALSE, INFINITE);
  209.  
  210. // if waitstate == 1, then it means that m_hEvtExecutionRestricted
  211. // has been triggered (event index in h_run_conditions array)
  212. if (waitstate == 1)
  213. {
  214. CloseHandle(hCurrentComplete);
  215. MpHandleClose(scanHandle);
  216. MpHandleClose(managerHandle);
  217. return ESCANSTAT::E_SCANFORCETERMINATED;
  218. }
  219.  
  220. BYTE arg1[0x90] = { 0 };
  221. hres = MpScanResult(scanHandle, arg1); // mpclient!MpScanResult(__int64 a1, void *a2): memset_0(v2, 0, 0x90ui64);
  222.  
  223. if (FAILED(hres)) {
  224. CloseHandle(hCurrentComplete);
  225. MpHandleClose(scanHandle);
  226. MpHandleClose(managerHandle);
  227. return ESCANSTAT::E_SCANRESULTFAILED;
  228. }
  229.  
  230. auto store_scan_data = [scanHandle, &item]() -> bool
  231. {
  232. MPHANDLE hThreatEnumHandle;
  233. HRESULT rc;
  234.  
  235. rc = MpThreatOpen(scanHandle, nullptr, nullptr, &hThreatEnumHandle);
  236.  
  237. if (FAILED(rc)) return false;
  238.  
  239. PMPTHREAT_INFO pInfo;
  240. std::map<std::string, std::string> m_rc;
  241.  
  242. while (MpThreatEnumerate(hThreatEnumHandle, &pInfo) == S_OK)
  243. {
  244. for (size_t i = 0; i < pInfo->ResourceCount; i++)
  245. {
  246. m_rc[WstringToAnsi(std::wstring(pInfo->ResourceList[i]->Path), CP_ACP)] =
  247. WstringToAnsi(std::wstring(pInfo->Name), CP_ACP);
  248. }
  249. }
  250. rc = MpHandleClose(hThreatEnumHandle);
  251. item->submitResult(m_rc);
  252. return true;
  253. };
  254.  
  255. bool b_dstored = store_scan_data();
  256.  
  257. CloseHandle(hCurrentComplete);
  258. MpHandleClose(scanHandle);
  259. MpHandleClose(managerHandle);
  260.  
  261. item->setElapsedTime(GetTickCount() - startTicks);
  262. item->finish();
  263.  
  264. return b_dstored ? ESCANSTAT::SUCCEEDED : ESCANSTAT::FAILURE;
  265. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement