恶意代码分析实战 第五章课后实验
问题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比较。下面还有dwMajorVersion与5比较,这是查看我们的操作系统是vista以下,还是vista以上。分析下一个call:sub_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异或再重新写回去。