恶意代码分析Lab09-03

实验二 动态分析实践

【实验目的和要求】
熟悉OllyDbg和IDA Pro的使用,用其分析恶意文件,分析DLL文件的导入过程;分析DLL提供的函数的具体功能;
熟悉API函数功能及其涉及到的参数理解;分析netschedulejobadd、at_info。

【实验工具】
PeEdtior、OllyDbg、IDA Pro等

【实验步骤】
1、样本导入了哪些 DLL?
一共六个:KERNEL32.dll;NETAPI32.dll;DLL1.dl1;DLL2.dll;DLL3.dll;user32.dll
直接查看到四个:
在这里插入图片描述
往下翻,看到DLL3.dll,带着个LoadLibraryA。于是接着找别的LoadLibraryA,能够看到还有个user32.dll
在这里插入图片描述

2、DLL1.dll、DLL2.dll、 DLL3.dll要求的基地址分被是多少?
都是10000000
在这里插入图片描述

3、DLL3.dll导入方式和前面2个DLL有何不同?
DLL3.dll是显式链接,执行过程中实时加载,执行完后卸载。
前面两个是隐式链接,一开始就加载到了内存中。

4、当使用OllyDbg调试样本时,为DLL1.dll、DLL2.dll、 DLL3.dll 分配的基地址是什么?是否符合第2步DLL声明的基地址相同?为什么出现这种情况?(OD查看-内存)
在这里插入图片描述

00590000,005C0000,10000000;不同;进行了基地址重定位,因为他们预设的基地址都是10000000.

5、样本调用DLL1.dll中的一个导入函数,该函数名称是什么?
KERNEL32.dll
在这里插入图片描述

6、分析该函数功能。
(提示:分析该导入函数用到的参数及该函数调用的其他函数,如分析GetCurrentProcessId函数功能。)
DLL1打印的数据是什么?
在这里插入图片描述

GetCurrentProcessId作用:获取当前进程一个唯一的标识符
打印的数据:47600(pid)
里面的指令,以及对应语句执行的寄存器状态:

6.1样本调用了WriteFile函数,分析WriteFile函数功能及其参数。
在这里插入图片描述

WriteFile函数功能:
从文件指针指向的位置开始将数据写入到一个文件中, 如果文件打开方式没有指明FILE_FLAG_OVERLAPPED的话,当程序调用成功时,它将实际写入文件的字节数保存到lpNumberOfBytesWriten指明的地址空间中
参数:
HANDLE hFile,//文件句柄
LPCVOID lpBuffer,//数据缓存区指针
DWORD nNumberOfBytesToWrite,//你要写的字节数
LPDWORD lpNumberOfBytesWritten,//用于保存实际写入字节数的存储区域的指针
LPOVERLAPPED lpOverlapped//OVERLAPPED结构体指针

6.2当样本调用WriteFile函数时,它写入的文件名是什么,写入该文件的内容是什么?
(提示:结合样本及样本导入的DLL2.dll进行分析;找到某个地址,分析不同函数对其引用;IDA中,选中某个地址,然后快捷键X键,可以显示引用于该地址的函数地址)
DLL2打印的数据是什么?

要想知道WriteFile函数写入的文件名是什么,只要找到参数里的文件句柄就好。可以看到,这里的ecx存着hFile,观察前面的语句能够知道,这里的ecx肯定和DLL2ReturnJ的返回值有关。
在这里插入图片描述

于是我们打开DLL2.dll,找到DLL2ReturnJ函数
在这里插入图片描述

不难发现,这里的dword_1000B078就是返回值,我们找找看这个值
在这里插入图片描述

跟进第一个就能看到,CreateFileA这个函数创建了个temp.txt文件,即CreateFileA函数写入的文件名为temp.txt。如果CreateFileA成功的话,会返回一个打开的指定文件的句柄 ,这里是存在eax里面的,所以dword_1000B078就是存的temp.txt这个文件的句柄。
在这里插入图片描述
OD调试运行一下,打开创建的temp.txt文件,就能看到写入的内容了:

在这里插入图片描述

我们在IDA里面找到DLL2Print这个函数,能够发现这里压的两个参数eax和"DLL 2 mystery data %d\n"。
在这里插入图片描述

于是在OD里面调试一下,看看eax是什么
在这里插入图片描述

16进制里100就是256。所以DLL2Print打印的就是eax的值,也就是文件的句柄。

7.1当样本使用NetScheduleJobAdd创建一个job时,从哪里获取第二个参数的数据?从这里获取什么信息?

找到NetScheduleJobAdd这个函数,我们能看到第二个参数是Buffer,被存放在ecx里面,是指向AT_INFO结构的指针。这里是将[ebp+Buffer]的值付给了ecx,不过我们并不知道这个值是多少,于是找到上面的DLL3GetStructure函数,对DLL3进行调试。
在这里插入图片描述

找到DLL3GetStructure,发现他用eax存放返回值stru_1000B0A0,于是找一下stru_1000B0A0的值。
在这里插入图片描述

找到stru_1000B0A0后,添加结构体AT_INFO,然后点击Edit下的Struct var,再看的话能够识别出该结构体。
在这里插入图片描述

所以NetScheduleJobAdd函数的第二个参数来自DLL3中的DLL3GetStructure函数。

7.2 DLL3打印的数据是什么?
找到DLL3Print函数,发现有两个参数,我们找一下offset WideCharStr
在这里插入图片描述
在这里插入图片描述

MultiByteToWideChar函数将字符串映射到 UTF-16(宽字符)字符串,10001004处将ping www.malwareanalysisbook.com在内存中的偏移地址保存,然后利用MultiByteToWideChar函数将刚才的偏移地址进行字符串转换,返回值既是WideCharStr。
在这里插入图片描述

DLL3打印的是ping www.malwareanalysisbook.com在内存中的地址。

【实验小结】

扩展知识:
https://docs.microsoft.com/en-us/windows/win32/api/lmat/nf-lmat-netschedulejobadd
https://docs.microsoft.com/en-us/windows/win32/api/lmat/ns-lmat-at_info

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值