恶意代码分析实战 第九章课后实验 Lab09-03

问题1:

首先用peid查看导入表:

这里发现了四个,分别是kernel32.dll  netapi32.dll  DLL1.dll  DLL2.dll 。还有些.dll是在程序运行时加载的,用ida打开Lab09-03.exe。如果想要在程序运行时动态加载.dll文件一般要调用LoadLibrary这个函数,点开Imports,找到LoadLibrary:

双击查看,然后在地址查查看交叉引用窗口,快捷键Ctrl+x;

 

重点看一下前两个调用:

看到这两个调用也分别出现了.dll文件,分别是DLL3.dll  user32.dll。所以呢,一共导入了六个.dll。

问题2:

基地址利用peid查看发现三个.dll的基地址都是10000000。

问题3:

使用OD载入Lab09-03.exe,点击M。

看到了DLL1与DLL2的基地址分别是003C0000与10000000。这个和第二个问题查看的结果是不同的,这是可能存在的。还有不同的系统也有可能造成不同的结果。

DLL3.dll是在程序中动态加载的,首先用ida查看一下LoadLibrary的地址:

然后用OD跳转的这个地址:

在下一行设置一个断点,然后运行

这样就能加载DLL3.dll了,点击M查看:

DLL3.dll的基地址是00430000。

问题4:

在ida开始的地方,看到调用了DLL1Print,这个函数是保存在DLL1.dll中的。

用ida打开DLL1.dll,然后找到DLLPrint的位置,如下:

这里调用了sub_10001038,一共有两个参数,第一个是"DLL 1 mystery data %d\n",这个参数里出现了%d\n,就说明这是一个printf函数。第二个参数的内容就是dword_10008030的内容,双击之后对其进行交叉引用:

双击查看写入的操作:

可以看到dword_10008030这里保存的是GetCurrentProcess的返回值,也就是当前进程的ID值,也是DLL1的神秘数据(问题7 的第一小问)。

问题5:

查看WriteFile,

WriteFile里的一个参数保存了一个句柄,hFile是DLL2ReturnJ的返回值,所以用ida打开DLL2.dll。

同时分析一下DLL2Print。

在这里再一次的看到了神秘数据,这个神秘数据想要打印的内容保存在了dword_1000B078里,双击之后交叉引用查看:

CreateFileA的返回值是dword_1000B078,也就说明了,第二处神秘数据所打印的就是temp.txt这个文件的句柄(问题7的第二小问)。

下面分析DLL2ReturnJ

这段程序很简单,就是将dword_1000B078给eax,然后也就返回了。经过上面的分析指导dword_1000B078这个就是temp.txt的句柄。所以呢,WriteFile的写入对象,也就是temp.exe

问题6:

 

使用MSDN查询可知,NetScheduleJobAdd这个函数的作用就在于制定一个任务,并且在未来的一个特定的时间来执行。这个函数的第二个参数Buffer,是一个指向AT_INFO结构的指针,该结构用于描述我们所提交的任务。   在上图的反汇编代码中,程序首先调用了LoadLibrary来加载DLL3.dll,接着利用GetProcAddress获取了DLL3Print以及DLL3GetStructure这两个函数的地址。

 

使用ida来打开DLL3.dll,首先分析一下DLL3Print这个函数:

在这里在一次的看到了神秘数据,这次的神秘数据指的是WideCharStr里的内容,双击然后交叉引用查看一下:

这里发现了DLLMain函数,双击:

这里调用了MultiByteToWideChar函数,通过MSDN查询知道这个函数用于将多字节转换成宽字符的形式。它会将lpWideCharStr参数的内容进行转换,保存在WideCharStr中。而lpWideCharStr中的内容就是“ping www.malwareanalysisbook.com”这段字符串在内存中的地址。那也就知道了神秘地址就是在内存中的地址(问题7的第三小问)。

看一下DLL3GetStructure

将dword_1000B0A0的地址赋给以eax的值为地址的内存空间中,双击dword_1000B0A0利用交叉引用查看一下

双击DLLMain:

这是一系列的赋值操作,而最终这个区域的地址,会成为NetScheduleJobAdd这个函数的第二个参数。其实,它的第二个参数是一个AT_INFO结构,而dword_1000B0A0中的内容就是一个结构体。我们找到Structures窗口按下键盘上的Fn+Insert键(或者insert,这个应该是版本不同造成的),选择“Add standard structure”,添加AT_INFO结构从而将这个结构体显示出来。然后来到dword_1000B0A0在内存中的位置,选择菜单中的Edit下面的Struct Var,单击AT_INFO,就转换成功了:

问题7:

这个在前面都已经提到过了,就不在说了。

问题8:

首先用ida加载DLL2.dll,在load a new file页面选择Manuai load也就手动加载,然后点击OK。然后要求再输入基地址

然后查看OD中的DLL2的地址是003C0000,将地址输入后连续点击几个yes,

选择就可以看到地址是003C1000。

为什么不是003C0000呢?

因为当前属于代码的区段,看一下OD

代码的区段也是从003C1000开始的,这就说明了OD与ida加载的地址匹配了。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 数据预处理的目的是什么? 数据预处理的目的是为了减少或消除数据中的噪声、缺失值、异常值等问题,使得数据更加干净、准确、可靠,为后续的数据分析和建模提供良好的数据基础。 2. 数据清洗的主要步骤有哪些? 数据清洗的主要步骤包括数据去重、缺失值处理、异常值处理、数据类型转换和数据标准化等。 3. 数据去重的方法有哪些? 数据去重的方法包括基于列去重、基于行去重和基于列和行的去重。基于列去重是指对某一列中的重复数据进行去重,基于行去重是指对数据表中的重复行进行去重,基于列和行的去重是指同时对某一列和数据表中的重复行进行去重。 4. 缺失值处理的方法有哪些? 缺失值处理的方法包括删除缺失值、插值法、使用相似样本填补缺失值等。删除缺失值是指直接删除包含缺失值的行或列;插值法是指通过对已有数据进行插值估计缺失值;使用相似样本填补缺失值是指利用具有相似特征的样本来填补缺失值。 5. 异常值处理的方法有哪些? 异常值处理的方法包括基于统计学方法、基于聚类方法和基于规则的方法。基于统计学方法是指利用统计学方法对数据进行描述和分析,发现异常值并进行处理;基于聚类方法是指利用聚类算法将数据分成不同的类别,对于不属于任何类别的数据视为异常值并进行处理;基于规则的方法是指利用领域知识或经验规则对数据进行分析和处理。 6. 数据类型转换的方法有哪些? 数据类型转换的方法包括数值型类型转换、字符型类型转换和日期型类型转换等。数值型类型转换是指将数据从字符串类型转换为数值类型,字符型类型转换是指将数据从数值类型转换为字符串类型,日期型类型转换是指将数据从字符串类型转换为日期类型。 7. 数据标准化的方法有哪些? 数据标准化的方法包括最小-最大标准化、z-score标准化和小数定标标准化等。最小-最大标准化是指将数据缩放到[0,1]区间内;z-score标准化是指将数据转换为均值为0,标准差为1的正态分布;小数定标标准化是指将数据除以一个比较大的基数,使得所有数据都在[-1,1]之间。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值