9.3 追加导入表

随机增加导入表可以干扰杀毒软件的检测,为了更加逼真,还需要使用常见的库和导入函数来创建导入表。我们将常见的库文件和导入函数搜集一下,保存到文件small_dll_imports.json中。

代码如下:


{
 "ADVAPI32.DLL": [
  "CryptSetProvParam", 
  "RegQueryInfoKeyW", 
  "AddUsersToEncryptedFileEx", 
  "CheckAppInitBlockedServiceIdentity", 
  "LsaEnumerateAccounts", 
  "RegSaveKeyA", 

将small_dll_imports.json中的数据加载到变量COMMON_IMPORTS中:


COMMON_IMPORTS = json.load(open('small_dll_imports.json', 'r'))

从COMMON_IMPORTS随机选择库文件的名称和导入函数名称:


libname = random.choice(list(COMMON_IMPORTS.keys()))
funcname = random.choice(list(COMMON_IMPORTS[libname]))
lowerlibname = libname.lower()

解析PE文件,获取当前的导入表,遍历导入表,如果随机选择的库不存在,就创建一个新库,如果导入函数也不存在,就增加一个新入口,代码如下:


binary = lief.PE.parse(self.bytez)
for im in binary.imports:
    if im.name.lower() == lowerlibname:
        lib = im
        break
if lib is None:
    lib = binary.add_library(libname)
names = set([e.name for e in lib.entries])
if not funcname in names:
    lib.add_entry(funcname)