计算机病毒复习1
复习 一、概念 1. (填空题)计算机病毒的定义: 计算机病毒是指编制或者在计 算机程序中插入的(破坏计算机 功能)或者(毁坏数据),影响 计算机使用,并能自我复制的一 组计算机指令或者程序代码。 2. 计算机病毒的一般特征: (1) 程序性:计算机病毒具有 正常程序的一切特性:可存储 性、可执行性。 (2) 传染性:计算机病毒会通 过各种渠道从已被感染的计算 机扩散到未被感染的计算机,在 某些情况下造成被感染的计算 机工作时常甚至瘫痪。 3. 蠕虫病毒Worm;宏病毒: Macro 二、windbg 调 试 1. 常用命令:bp打断点; !process查看系统当前 进程; db, dw, dd 查看内存单元内容 2. 符号文件 调试时需要被调试机的符号文 件;符号文件的后缀名是pdb。 三、动态链接库DLL 1. DLL中的函数根据能否被外 部程序调用分为导出函数和内 部函数。 2. 导出方式 (1) 声明时在函数声明中加上: extern “C“ _declspec(dllexport) 返回类型函数名(参数类型 参 数等); (2) 创建和动态链接库同名的 def文件, dllTest.dll LIBRARY dllTest EXPORTS add @n 3. DLL调用方式(可能是综合分 析) (1) 静态调用: 特点:由编译系统完成对DLL 的加载和应用程序结束时DLL 的卸载。 步骤:1)将生成的lib和dll文 件拷贝到应用程序所在路径; 2 ) #pragma commentdib,“ dllTest.lib“ )//告诉 编译器与dll对应的lib文件所在 的路径及文件名; 3 (extern “ C ” _declspec(dllimmport) add(int x,inty); 〃声明导入函数; 代码: #include include Tib.h“ #pragmacomment(lib, “dllTest.lib”) extern “C“ _declspec(dllimmport) ExportFunc (param); void main() { ExportFunc(“Hello World!”); } (2) 动态调用 特点:由程序中调用API函数加 载和卸载DLL,程序中可以决定 DLL文件何时加载或不加载,在 运行时■决定加载哪个DLL。 步骤:1)用LoadLibrary函数加 载 DLL; 2) 用 GetProcAddress 获 取DLL函数地址; 3) DLL使用完毕后,用 FreeLibrary 函数释放 DLL。 LoadLibrary-GetProcAddre ss-FreeLibrary “DLL加载-DLL函数地址 获取-DLL释放” 代码: #include typedefvoid (*PFNEXPORTFUNC)(LPCTST R); int main(int argc, char* argv[]) { HMODULE hModule = LoadLibrary (“. .WDebugWDllDemo .dll”); if(hModule != NULL) ( PFNEXPORTFUNC mExportFunc= (PFNEXPORTFUNC)GetProcAd dress(hModule, “ExportFunc“); if(mExportFunc != NULL)( mExportFunc(“ Hello World! 1); 1 FreeLibrary (hModule); } return 0; } 四、代码注入 1. windows 消息 Hook (1) 按监视范围可分为:局部 钩子和全局钩子; (2) 截获消息后对消息进行处 理的代码称为钩子函数。 2. D11远程线程注入步骤(简答) 1) 使用OpenProcess得到远程进 程的HANDLE 2) 在远程进程中为DLL全路径 分配内存 3) 把DLL的全路径写到分配的 内存中 4) 使用 CreateRemoteThread 和 LoadLibrary把DLL映射进远程 进程。 5) 等待远程线程结束,即等待 LoadLibrary 返回。 6) 取回远程线程的结束码,即 LoadLibrary的返回值,即DLL 加载后的基地址(HMODULE)。 T)释放第2步分配的内存。 8 )用 CreateRemoteThread 和 FreeLibrary把DLL从远程进程 中卸载。调用时传递第6步取得 的 HMODULE 给 FreeLibrary 9 )等待线程的结束 (WaitSingleObject)。 五、PE文件格式 1. , DLL, SYS 等都是 PE 文件格式,而doc不是。 2. PE包含四部分:DOS头、PE 头、节表、节。其中前二部分称 为PE文件头。 3. DOS头中的DOS-MZ头中的 ejfanew字段是PE头的地址。 4. PE 头: PE文件标识“PE\0\0” 映像文件头 可选映像文件头 其中可选映像文件头包含的字 段有: (1)优先加载基地址 (2)入口地址 C3)文件/内存对齐粒度 (4)数据目录 例:下面哪一项不是可选映像文 件头的内容? 5. VA (虚拟地址),RVA (相对 虚拟地址) 例:基地址:0 x00400000, VA: 0 x00401000 计算 RVA„(RVA = VA-基 地址) 6. 对齐粒度 例:内存对齐粒度为1000H, sectionA 基地址:0 x00401000, sectionA 的 size: 0 x000000256,卜 一个 section 的 基地址是多少? (0 x00402000) 7. 数据目录:第一项:导出表的 RVA和大小 第二项:导入 表的RVA和大小 8. 导入表描述符结构 (若调用两个DLL则至少需要 三个段落) 桥1 (指向INT表) Name (指向D11名 称):user32.dll 桥2 (指向IAT表) 桥1 (指向INT表) Name (指向D11名称) 桥2 (指向IAT表) (全零) 修改IAT表(重点内容): (1)找导入表:首先获取进程 的基地址;找到PE头结构;在 PE头中找到可选映像文件头结 构,该结构中的数据目录的第二 项记录的是导入表的RVA和大 小。 (2)根据导入表找到IAT表: 遍历导入表描述符结构中的 Name字段,看是否与user32.dll 相同,若相同则找到了正确的导 入表描述如结构。 (3)通过结构中的桥1字段找 到INT表,若INT表中的第n 项指向的是Messagebox,则修改 IAT表中的第n项即可。 9. 重定位 (1)代码重定位的概念:把可 执行代码从内存的一个地方移 动到另一个地方,可执行代码仍 能够正确执行