恶意代码分析实战 第五章课后实验

问题1:

用ida打开Lab05-01.dll。就可以看到DllMain的地址为0x1000D02E。

问题2:

点开Imports,找到gethostbyname,双击点进去就可以看到了。

问题3:

单击地址,Ctrl+x。

一共检测到18个,但是并不全是,r为读取不是函数的调用,p才是函数的调用,看地址1047,1365,1656,208F,2CCE。一共有5个函数调用了gethostbyname。

还有一种方法,在问题2的截图处右键gethostbyname函数名选择Xrefs graph to后看到下图,有五条线指向gethostbyname,所以说明有五个函数调用它。

问题4:

快捷键G,跳转到地址0x10001757,如下:

 

 

可以发现,是off_10019040的内容赋给了eax,点击去查看,DNS请求是pics.praticalmalwareanalys.com

问题5、6:

快捷键G跳转到0x10001656,如下:

可以看到有23个局部变量,有一个参数。

问题7:

打开Strings,找到\cmd.exe /它位于地址为0x10095B34的位置

问题8:

点击上箭头发现aCmd_exeC引用了\cmd.exe /c

题目要求这个区域发生了什么,那就上下看一看。

在上面发现了Remote Shell Session,可以怀疑这是一个远程的会话。再往下看看:

发现了一个recv,以及一些命令的比较,基本可以确定这就是一个远程的shell会话。

问题9:

可以很清楚的看到一个mov其他两个都是比较,由于比较不会改变该变量,所以双击查看mov语句,

继续分析可以看到dword_ 1008E5C4所承载的就是操作系统的版本信息。

问题10:

首先快捷键G跳转到地址0x1000ff58,然后找到robotwork

在这里看到了jnz,jnz为结果不为0转移,而我们希望等于0,那就继续向下看,双击sub_100052A2,跳转到指令查看代码,发现了如下图的注册表信息

然后跳转到sub_100038EE,查看代码发现了send ,这就很明朗了,得到某注册表值并且发送给远端。

问题11:

找到PSLIST,双击进去看一下,分析call ,你一个call地址sub_100036C3进去发现如下图:

看到了dwpaltformid与2比较。下面还有dwMajorVersion5比较,这是查看我们的操作系统是vista以下,还是vista以上。分析下一个callsub_10006518

双击点进去看到了CreateToolhelp32Snapshot API函数,这是获取系统中的进程列表,在下面还发现了process32next ,process32first。分析下一个call sub_1000664C:同样发现了CreateToolhelp32Snapshot,这个PSLIST导出函数可以认为他有可能通过网络发送我们的进程列表给远端。

问题12:

在functions window中找到sub_10004e79,双击点进去,Viewà Graphsà User xrefs chart 点进去如图所示:

箭头所指向的API函数都有可能被调用,我认为GetSystemDefaultLangID以及send都是比较重要的,所以我们可以重命名为GetSystemLangID_send

问题13:找到DLLMain,然后打开User xrefs chart,设置深度为2如下:

可以看多基本上已经数不清有多少个第二级被调用了

问题14:

依然快捷键G跳转到地址0x10001358

休眠多长时间决定于上面的eax,看到了是由off_10019020赋值的,点进去看一下:

看到了30.下一行加上0Dh,也就是跳过前面的字符,直接调用30,后面还有一个乘以3E8h,结果为30000毫秒,也就是30秒。说明会休眠30秒。

问题15:

同样的快捷键G跳转到地址0x10001701如下

很明先看到了三个参数,第一个参数为2,第二个参数为1,第三个参数为6.

问题16:

在MSDN搜索socket function找到2,1,6所对应的如下图所示:

 

将2,1,6改为上图所对应的就可以了。右键找到下图

然后找到对应修改就可以了。改完后如图:

问题17:

Searchàsequencu of bytes  搜索ED,找到

双击进入

发现存在VMXh。

可以看到关键字符"Found Virtual Machine,Install Cancel."

 

问题18:

同样快捷键G跳转到地址0x1001D988

问题19:

使用Python脚本,代码如下

sea = ScreenEA( )

for i in range(0x00,0x50):

        b = Byte(sea+i)

        decoded_byte = b ^ 0x55

        PatchByte(sea+i,decoded_byte

运行结果为:

问题20:

光标选中,按A即可:

问题21:

sea = ScreenEA( )

for i in range(0x00,0x50):

        b = Byte(sea+i)

        decoded_byte = b ^ 0x55

        PatchByte(sea+i,decoded_byte

如何工作就是这段代码,获得光标位置将0-0x50个字节和0x55异或再重新写回去。

猜你喜欢

转载自blog.csdn.net/Stronger_99/article/details/89193267