-
UID:17777
-
- 注册时间2007-05-02
- 最后登录2025-05-02
- 在线时间18636小时
-
- 发帖786303
- 搜Ta的帖子
- 精华0
- 飞翔币211574
- 威望215717
- 飞扬币2615486
- 信誉值8
-
访问TA的空间加好友用道具
- 发帖
- 786303
- 飞翔币
- 211574
- 威望
- 215717
- 飞扬币
- 2615486
- 信誉值
- 8
|
[font=-apple-system, BlinkMacSystemFont, "]实验二 动态分析实践[font=-apple-system, BlinkMacSystemFont, "]【实验目的和要求】[font=-apple-system, BlinkMacSystemFont, "]熟悉OllyDbg[font=-apple-system, BlinkMacSystemFont, "]和IDA Pro的使用,用其分析恶意文件,分析DLL文件的导入过程;分析DLL提供的函数的具体功能;熟悉API函数功能及其涉及到的参数理解;分析netschedulejobadd、at_info。[font=-apple-system, BlinkMacSystemFont, "]【实验工具】[font=-apple-system, BlinkMacSystemFont, "]PeEdtior、OllyDbg、IDA Pro等[font=-apple-system, BlinkMacSystemFont, "]【实验步骤】[font=-apple-system, BlinkMacSystemFont, "]1、样本导入了哪些 DLL?[font=-apple-system, BlinkMacSystemFont, "]一共六个:KERNEL32.dll;NETAPI32.dll;DLL1.dl1;DLL2.dll;DLL3.dll;user32.dll[font=-apple-system, BlinkMacSystemFont, "]直接查看到四个: [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]往下翻,看到DLL3.dll,带着个LoadLibraryA。于是接着找别的LoadLibraryA,能够看到还有个user32.dll [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]2、DLL1.dll、DLL2.dll、 DLL3.dll要求的基地址分被是多少?[font=-apple-system, BlinkMacSystemFont, "]都是10000000 [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]3、DLL3.dll导入方式和前面2个DLL有何不同?[font=-apple-system, BlinkMacSystemFont, "]DLL3.dll是显式链接,执行过程中实时加载,执行完后卸载。前面两个是隐式链接,一开始就加载到了内存中。[font=-apple-system, BlinkMacSystemFont, "]4、当使用OllyDbg调试样本时,为DLL1.dll、DLL2.dll、 DLL3.dll 分配的基地址是什么?是否符合第2步DLL声明的基地址相同?为什么出现这种情况?[font=-apple-system, BlinkMacSystemFont, "](OD查看-内存) [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]00590000,005C0000,10000000;不同;进行了基地址重定位,因为他们预设的基地址都是10000000.[font=-apple-system, BlinkMacSystemFont, "]5、样本调用DLL1.dll中的一个导入函数,该函数名称是什么?[font=-apple-system, BlinkMacSystemFont, "]KERNEL32.dll [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]6、分析该函数功能。(提示:分析该导入函数用到的参数及该函数调用的其他函数,如分析[font=-apple-system, BlinkMacSystemFont, "]GetCurrentProcessId[font=-apple-system, BlinkMacSystemFont, "]函数功能。)DLL1打印的数据是什么?[font=-apple-system, BlinkMacSystemFont, "]GetCurrentProcessId作用:获取当前进程一个唯一的标识符打印的数据:47600(pid)里面的指令,以及对应语句执行的寄存器状态: [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]6.1样本调用了[font=-apple-system, BlinkMacSystemFont, "]WriteFile[font=-apple-system, BlinkMacSystemFont, "]函数,分析WriteFile函数功能及其参数。 [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]WriteFile函数功能:从文件指针指向的位置开始将数据写入到一个文件中, 如果文件打开方式没有指明FILE_FLAG_OVERLAPPED的话,当程序调用成功时,它将实际写入文件的字节数保存到lpNumberOfBytesWriten指明的地址空间中参数:HANDLE hFile,//文件句柄LPCVOID lpBuffer,//数据缓存区指针DWORD nNumberOfBytesToWrite,//你要写的字节数LPDWORD lpNumberOfBytesWritten,//用于保存实际写入字节数的存储区域的指针LPOVERLAPPED lpOverlapped//OVERLAPPED结构体指针[font=-apple-system, BlinkMacSystemFont, "]6.2当样本调用WriteFile函数时,它写入的文件名是什么,写入该文件的内容是什么?(提示:结合[font=-apple-system, BlinkMacSystemFont, "]样本[font=-apple-system, BlinkMacSystemFont, "]及[font=-apple-system, BlinkMacSystemFont, "]样本导入的DLL2.dll[font=-apple-system, BlinkMacSystemFont, "]进行分析;找到某个地址,分析不同函数对其引用;IDA中,选中某个地址,然后快捷键X键,可以显示引用于该地址的函数地址)DLL2打印的数据是什么?[font=-apple-system, BlinkMacSystemFont, "]要想知道WriteFile函数写入的文件名是什么,只要找到参数里的文件句柄就好。可以看到,这里的ecx存着hFile,观察前面的语句能够知道,这里的ecx肯定和DLL2ReturnJ的返回值有关。 [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]于是我们打开DLL2.dll,找到DLL2ReturnJ函数 [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]不难发现,这里的dword_1000B078就是返回值,我们找找看这个值 [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]跟进第一个就能看到,CreateFileA这个函数创建了个temp.txt文件,[font=-apple-system, BlinkMacSystemFont, "]即CreateFileA函数写入的文件名为temp.txt。[font=-apple-system, BlinkMacSystemFont, "]如果CreateFileA成功的话,会返回一个打开的指定文件的句柄 ,这里是存在eax里面的,所以dword_1000B078就是存的temp.txt这个文件的句柄。 [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]OD调试运行一下,打开创建的temp.txt文件,就能看到写入的内容了: [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]我们在IDA里面找到DLL2Print这个函数,能够发现这里压的两个参数eax和"DLL 2 mystery data %dn"。 [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]于是在OD里面调试一下,看看eax是什么 [font=-apple-system, BlinkMacSystemFont, "] [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]16进制里100就是256。[font=-apple-system, BlinkMacSystemFont, "]所以DLL2Print打印的就是eax的值,也就是文件的句柄。[font=-apple-system, BlinkMacSystemFont, "]7.1当样本使用[font=-apple-system, BlinkMacSystemFont, "]NetScheduleJobAdd[font=-apple-system, BlinkMacSystemFont, "]创建一个job时,从哪里获取第二个参数的数据?从这里获取什么信息?[font=-apple-system, BlinkMacSystemFont, "]找到NetScheduleJobAdd这个函数,我们能看到第二个参数是Buffer,被存放在ecx里面,是指向AT_INFO结构的指针。这里是将[ebp+Buffer]的值付给了ecx,不过我们并不知道这个值是多少,于是找到上面的DLL3GetStructure函数,对DLL3进行调试。 [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]找到DLL3GetStructure,发现他用eax存放返回值stru_1000B0A0,于是找一下stru_1000B0A0的值。 [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]找到stru_1000B0A0后,添加结构体AT_INFO,然后点击Edit下的Struct var,再看的话能够识别出该结构体。 [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]所以NetScheduleJobAdd函数的第二个参数来自DLL3中的DLL3GetStructure函数。[font=-apple-system, BlinkMacSystemFont, "]7.2 DLL3打印的数据是什么?[font=-apple-system, BlinkMacSystemFont, "]找到DLL3Print函数,发现有两个参数,我们找一下offset WideCharStr [font=-apple-system, BlinkMacSystemFont, "] [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]MultiByteToWideChar函数将字符串映射到 UTF-16(宽字符)字符串,10001004处将ping www.malwareanalysisbook.com在内存中的偏移地址保存,然后利用MultiByteToWideChar函数将刚才的偏移地址进行字符串转换,返回值既是WideCharStr。 [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]DLL3打印的是ping www.malwareanalysisbook.com在内存中的地址。[font=-apple-system, BlinkMacSystemFont, "]【实验小结】 扩展知识:https://docs.microsoft.com/en-us/windows/win32/api/lmat/nf-lmat-netschedulejobaddhttps://docs.microsoft.com/en-us/windows/win32/api/lmat/ns-lmat-at_info
|