Lab5-1
1、DllMain 的地址是啥
直接在函数列表里面找到就行
2、使用 Imports 窗口并浏览到 gethostbyname,导入函数定位到什么地址
3、有多少函数调用了 gethostbyname
光标留在函数那里,然后 ctrl+x 就行,这里面的类型 p 是引用,r 是读取,共有然而实际上有两个函数调用了多次,比如:sub_10001074,所以一共 5 个函数调用了 gethostbyname
4、将精力集中于 sub_10001656+101 处对 gethostbyname 的调用,能找出哪个 DNS 请求被触发
注意看这里的调用,前面 push 了 eax 作为参数,那么 eax 存的是 off_10019040 字符串的指针加 0xd 偏移,正好是
5、IDA pro 识别了在 0x10001656 处的子过程中的多少个局部变量、多少个参数
不同版本的 IDA 是别的不一样,书中只有二十多个,我这里识别了好多
6、使用 string 窗口,定位字符串 “\cmd.exe /c” 位于哪里
shitf+f12 打开字符串窗口,直接找一下这个字符串然后双击跟过去
双击跟过去来到代码段
7、在引用 “\cmd.exe /c” 的代码所在的区域发生了什么
看上面那个图,这个字符串被压倒了栈上面作为参数传给后面要调用的函数
8、0x100101C8 处的 dword_1008E5C4 看起来是个全局变量,恶意代码是如何设置它的
摁下 X 看一下交叉引用,然后跟过去看看是怎么赋值的
可以看到是把 eax,赋值给了它,eax一般是上面那个函数的返回值
跟进函数看一下,调用了 GetVersionExA 来获取系统的版本
为0表示为win3x系统
为1表示为win9x系统
为2表示为winNT
为3表示为win2000系统
下面还有个 setz 来把 ZF 标志位的值赋给 al,是否赋值要看前面 cmp 的结果,我们 GetVersionExA 的结果为 2,cmp 的结果是 0,ZF 标志位为 1,所以会把 al 赋值为 1,也就是说 dword_1008E5C4 为 1
9、0x1000FF58 的子过程中的几百行指令中,一些列 memcmp 对字符串进行比较,如果对 ‘robotwork’ 的字符串比较是成功的(当 memcmp 返回 0)会发生什么?
往下找一下,定位到 ‘robotwork’ 然后看一下如果一样的话是会进入 sub_100052A2 的
10、PSLIST 导出函数做了什么
找到 PSLIST,双击跟过去,sub_100036C3 是判断系统版本的,有两个路径
未完。。。。。。
Lab6-1
main 函数调用的唯一子过程是一处 if 语句,里面条件是:InternetGetConnectedState,可以用来判断本地有没有连接网络,有的话返回 true
0x40105F 处的子过程是一个 printf 函数(IDA 没法识别出来,猜的)
程序目的是检查本地是否连接有网络
Lab6-2
第一个子过程还是上面那个 if,里面的条件也还是之前的
0x40117F 的子过程是 printf 函数
被 main 函数调用的第二个子过程使用 Internet Explorer 7.5/pma 作为 UA,去访问 http://www.practicalmalwareanalysis.com/cc.htm,如果 InternetReadFile 有结果的话就跳到 loc_4010E5
这里正好是 ‘<!—‘,html 的注释,获取 html 的注释中存好的恶意代码是攻击者常用的方法,让程序看起来像是在访问一个正常的网页
程序后面有 sleep 了一段时间然后退出
Lab6-3
比上一个多了个 401130 函数,这个函数接受了两个参数,一个是 html 的注释,一个是程序的名字(argv)
这几个分支依次是:
创建目录:C:\Temp
拷贝自身到 C:\Temp\cc.exe
当 C:\Temp\cc.exe 存在时删除 C:\Temp\cc.exe
设置注册表 Software\Microsoft\Windows\CurrentVersion\Run 为 C:\Temp\cc.exe 来达到开机自启的目的
休眠一段时间
Lab6-4
相比上一个,这个是在 for 循环中循环执行的,UA 会跟着循环的次数进行变化