HITCON ENT 惡意軟體新型API呼叫行為實作(Patten式GetProcAddress找碴呼叫API)
動機 這次HITCON Enterprise正好坐在R0場有幸聽到PK大神講的議程XD。不過本來想聽這場是想知道實際Google Drive C2 API呼叫過程的Olly分析,不過似乎整場議程重點不放在那Otz... 但正好聽到一件有趣的事情,議程內提到新型惡意軟體呼叫不再像以前是用GetProcAddress,而是自幹了一個叫做GetProcAddressEx呼叫方式會像是: GetProcAddressEx( ModuleBase, "0=L;3=d;4=L;11=A"); //找尋一個API根據函數名,第0個為L、第3個為d、第4個為L、第11個為A 這手法聽起來像是在逃避正常靜態分析軟體(如IDA Pro)可以很容易根據Import Address Table得知呼叫過程或者透過對GetProcessAddress下斷點動態反查API過程,所以我想這個GetProcAddressEx內部應該: 不該使用到任何API來增加分析難度 暴力分析DLL模組結構體找碴外導函數 暴力列舉API過程中根據Pattern(也就是0=L;3=d...)找到第一筆合適的API名 根據這個原則,於是我開始實做惹XD Visual C++實作 關於這種奇怪的要求,想到之前有研究過類似的發文 [Windows][PE][ASM]純組語手幹Dll Header解析外導函數表撈出函數地址(如LoadLibraryA動態地址) 索性我就拿這個的部分Code來改成VC++函數版本了XD 首先Pattern檢測部份,我寫了一支簡單的函數 int StrVal(std::string Data) { return std::stoi(Data); } bool ChkPatten(char* Str, char* Patten) { bool retn = true; std::string n = ""; for (int i = 0; Patten[i]; i++) { if (*(char*)(Patten + i) == '=') { int LPos = StrVal(n); char RChar = *(char*)(Patten + i + 1);...