
विशिष्ट विंडोज APIs को भिन्न APIs से अस्पष्ट करें
PE आयातों को स्थैतिक/गतिशील विश्लेषण उपकरणों से अस्पष्ट (छिपाएं) करें।
यह काफी सीधा है, मान लें कि मैंने VirtualProtect का उपयोग किया है और मैं इसे Sleep से अस्पष्ट करना चाहता हूँ, उपकरण IAT में हेरफेर करेगा ताकि VirtualProtect की ओर इशारा करने वाला थंक इसके बजाय Sleep की ओर इशारा करेगा, अब फ़ाइल निष्पादित करने पर, विंडोज लोडर VirtualProtect के बजाय Sleep लोड करेगा, और निष्पादन को प्रवेश बिंदु पर ले जाएगा, वहाँ से निष्पादन शेलकोड की ओर पुनर्निर्देशित किया जाएगा, जिसे उपकरण ने पहले रखा था, ताकि VirtualProtect का पता खोजा जा सके और इसका उपयोग Sleep के पते को बदलने के लिए किया जा सके जिसे लोडर ने पहले निर्धारित किया था।
#include <cobf.hpp>
int main() {
cobf obf_file = cobf("sample.exe");
obf_file.load_pe();
obf_file.obf_sym("kernel32.dll", "SetLastError", "Beep");
obf_file.obf_sym("kernel32.dll", "GetLastError", "GetACP");
obf_file.generate("sample_obfuscated.exe");
obf_file.unload_pe();
return 0;
};
config.ini है) प्रदान करके।cobf.exe <input file> <out file> [config file]; Template for the config file:
; * Sections can be written as:
; [dll_name]
; old_sym=new_sym
; * The dll name is case insensitive, but
; the old and the new symbols are not.
; * You can use the wildcard on both the
; dll name and the old symbol.
; * You can use '#' at the start of
; the old or the new symbol to flag
; an ordinal.
; * The new symbol should be exported
; by the dll so the windows loader can resolve it.
; For example:
; * Obfuscating all of the symbols
; imported from user32.dll with ordinal 1600.
[user32.dll]
*=#1600
; * Obfuscating symbols imported from both
; kernel32.dll and kernelbase.dll with Sleep.
[kernel*.dll]
*=Sleep
; * Obfuscating fprintf with exit.
[*]
fprintf=exit
इस कोड नमूने को बनाएँ
#include <windows.h>
#include <stdio.h>
int main() {
SetLastError(5);
printf("Last error is %d\n", GetLastError());
return 0;
};
इसे बनाने के बाद, kernel32 आयात इस प्रकार दिखते हैं

अब दोनों SetLastError और GetLastError को Beep और GetACP से अस्पष्ट करें (वास्तव में kernel32 से कोई भी API ठीक होगा, भले ही वह आयातित न हो)।
उपयोग किए गए कॉन्फ़िगरेशन हैं
[kernel32.dll]
SetLastError=Beep
GetLastError=GetACP
यहाँ आउटपुट है (आप ऊपर दिखाए अनुसार सीधे लाइब्रेरी का उपयोग भी कर सकते हैं)।

फिर से kernel32 आयातों पर एक नज़र डालते हैं

SetLastError या GetLastError का कोई अस्तित्व नहीं है
एक पुष्टि कि दोनों फ़ाइलें ठीक से काम करेंगी

IDA HexRays Decompiler

IDA Debugger

Ghidra

ApiMonitor

ऐसा इसलिए है क्योंकि सभी स्थैतिक विश्लेषण उपकरण IAT पर लिखे गए API नाम पर निर्भर करते हैं, जिसे दिखाए अनुसार हेरफेर किया जा सकता है।
ApiMonitor के लिए, IAT हुकिंग का उपयोग करने के कारण, वही समस्या मौजूद है।
दूसरी ओर, x64dbg जैसे उपकरणों के लिए, दिखाए गए API नाम केवल वास्तव में कॉल किए गए पर निर्भर करेंगे (IAT पर लिखे गए पर नहीं)।

.cobf नामक एक नया rwx अनुभाग बनाता है।git clone https://github.com/d35ha/CallObfuscator.