本章主要是讲IDA的使用
笔记
IDA加载文件:
- 正常情况下,用PE模式来加载就行
- 如果目标在PE文件里藏有shellcode等东西,则需要从Binary file模式加载
重新定义数据和代码:
- 在选中区域按C,可以指定原始字节为代码,,还可以通过按键D和A来将目标分别定义为数据或ASCII数据
作业
lab 5-1
目标文件:lab05-01.dll
-
Dllmain的地址是什么?
-
gethostbyname导入函数定位到什么地址?
-
有多少函数调用了gethostbyname?
被五个不同函数调用9次(看签名type=p的就是调用)
-
对0x10001757处的调用,哪个DNS请求将被执行?
将会执行对
pics.praticalmalwareanalysis.com
的DNS请求 -
在0x1001656处的子过程有多少局部变量?
23个局部变量(负的是局部变量)
-
在0x1001656处的子过程有多少参数?
1个参数(正的是参数)
-
定位字符串“\cmd.exe /c”在哪里?
-
引用这个字符串的区域发生了什么?
cmd.exe /c 命令
是执行完命令关闭窗口:这里看起来是拼接命令,然后进行网络通信,疑似shell
-
在同样的区域,在0x100101C8处,看起来好像dword_1008e5c4是个全局变量,它帮助决定走哪条路径,恶意代码是如何设置这个变量的呢?
进入上一个call看看:
获取系统版本,然后存到这个全局变量里
-
在位于0x1000FF58处的子过程中的几百行指令中,一系列使用memcmp来比较字符串的比较。如果对robotwork的字符串比较是成功的(当memcmp返回0),会发生什么?
对比成功后会调用一个函数,然后jmp跳转走
调用的这个函数会查询注册表:
SOFTWARE\Microsoft\Windows\CurrentVersion
,然后拼接一个字符串,jmp跳走之后通过send发送出去 -
PSLIST导出函数做了什么?
遍历进程获取进程名:
-
使用图模式来绘制出对sub_10004E79的交叉引用图。当进入这个函数时,哪个API函数可能被调用?仅仅基于这些API函数,你会如何重命名这个函数?
GetSystemDefaultLangID函数用来获取系统语言,然后调用的子函数里有调用send发包函数,推测这里的功能是把系统语言信息发出去,重命名为:Send_SystemLangID
-
DllMain 直接调用了多少个WindowsAPI?多少个在深度为2时被调用?
深度为2图太大了,这是深度为1的时候
-
在0x10001358处,有一个对sleep(一个使用一个包含要睡眠的毫秒数的参数的API函数)的调用。顺着代码向后看,如果这段代码执行,这个程序会睡眠多久?
会睡眠30秒
-
在0x10001701处是一个对socket的调用。它的3个参数是什么?
-
使用MSDN页面的socket和IDAPro中的命名符号常量,你能使参数更加有意义吗?在你应用了修改以后,参数是什么?
如上题15的图
-
搜索in指令(opcode0xED)的使用。这个指令和一个魔术字符串VMXh用来进行VMware检测。这在这个恶意代码中被使用了吗?使用对执行in指令函数的交叉引用,能发现进一步检测VMware的证据吗?
交叉引用往上走,看到字符串:
这里有虚拟机检测
-
将你的光标跳转到0x1001D988处,你发现了什么?
看起来是乱码
-
如果你安装了IDAPython插件(包括IDAPro的商业版本的插件),运行Lab05-01.py,一个本书中随恶意代码提供的IDAPro Python脚本,(确定光标是在0x1001D988处。)在你运行这个脚本后发生了什么?
书上给的lab05-01.py上面调用的函数已经过时了,改成ida7.5版本能用的如下:
sea = get_screen_ea() for i in range(0x00,0x50): b = get_wide_byte(sea+i) # 获取当前指向的字节 decoded_byte = b ^ 0x55 # 将获取到的字节和0x55异或 patch_byte(sea+i,decoded_byte) # 将原来显示的字节替换成解码后的字节
运行之后,这里的乱码变成了正常的字符串:
-
将光标放在同一位置,你如何将这个数据转成一个单一的ASCII字符串?
使用A快捷键即可
-
使用文本编辑器打开这个脚本,它是如何工作的?
见题19的注释