前一段熟悉了用户态的API Hook,而震网采用用户态IATHook来实现文件隐藏,所以就拿来练练手,对其进行逆向分析,顺便学学其中的方法。将DLL模块释放为磁盘文件然后加载,而是直接拷贝到内存中,然后模拟DLL的加载过程。内存中通过调用导出函数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的函数名称进行比较 然后定位到要Hook的Dll的位置,利用同样的方法找到其导入表地址IMAGE_DATA_DIRECTORY[1] 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名称 f (!lstrcmpiA(lpString1, v10) ) { v13 = *v12; v14 = *v12 < 0; } 找到DLL所在的名称表,保存为v12和v13 接着通过DLL的名称表找到HookApi对应的地址 在DLL中找到HookDll后,直接将其值修改为自己要执行的API a5 *v11 = a5 A5的值为sub_100019A0的参数 Hook后执行的函数主要完成对函数返回结果的过滤 病毒样本下载地址: accK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3c8G2N6$3&6D9L8$3q4V1i4K6u0W2j5%4y4V1L8W2)9J5k6h3&6W2N6q4)9J5c8X3c8W2N6r3q4A6L8q4)9J5c8X3k6D9P5i4m8#2j5h3#2Q4x3V1j5^5x3o6j5H3x3o6l9K6
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课