前一段熟悉了用户态的API Hook,而震网采用用户态IATHook来实现文件隐藏,所以就拿来练练手,对其进行逆向分析,顺便学学其中的方法。为了躲避杀毒软件,~WTR4141.TMP入口函数首先将整个~WTR4141.TMP文件读入内存,内存中通过调用导出函数1跳转到DllGetClassObject,函数的Hook功能就在此部分完成,下面主要对其进行分析。整个函数的结构如下图所示:
函数sub_10002340加载4132.tmp(病毒主dll),然后解析,完成病毒文件更新。函数sub_100019A0完成Hook功能。从函数中我们可以看到主要Hook了FindFirstFileW、FindNextFileW、FindFirstFileExW、NtQueryDirectoryFile、ZwQueryDirectoryFile这5个函数
IATHook实现如下
PE头+78H就是PE的IMAGE_DATA_DIRECTORY[0],也就是V4的值 78H:输出表 V11:导出表地址 V5:导出表名称 V10:导出表中成员个数 v9 = v4 + a1 + 0x24 V9:导出表序列号数组 遍历导出表的导出名称表,与要Hook的函数名称进行比较 v7 = *(v6 + a2 + 12); v8 = a2 + v6; v9 = *(v8 + 16); v10 = (a2 + v7); v11 = (v9 + a2);
v12 = *v8 + a2; V9:导入地址表(IAT)的RVA V11:导入地址表 V8:dll的导入名称表(INT)的RVA V12:导入名称表地址 V7:DLL导入表映像文件的名字RVA V10:dll名称 if (!lstrcmpiA(lpString1, v10) ) { v13 = *v12; v14 = *v12 < 0; } 找到DLL所在的名称表,保存为v12和v13 接着通过DLL的名称表找到HookApi对应的地址 在DLL中找到HookDll后,直接将其值修改为自己要执行的API a5
*v11 = a5
|