博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计算机病毒实践汇总六:IDA Pro基础
阅读量:5116 次
发布时间:2019-06-13

本文共 3345 字,大约阅读时间需要 11 分钟。

在尝试学习分析的过程中,判断结论不一定准确,只是一些我自己的思考和探索。敬请批评指正!

1. IDA使用

(1)搜索、下载并执行IDA Pro,对可执行程序lab05-01.dll进行装载,分别以图形模式和文本模式查看程序的反汇编结果

  • 运行IDA Pro,打开Lab05-01.dll,以图形化界面显示:

    744787-20160609211056105-2004162357.png

  • 直接定位到DLLMain开始的位置上。用空格键可以切换到文本模式查看:

    744787-20160609211109824-779638703.png

(2)查看程序中的所有函数

程序中的所有函数包括:导入函数、导出函数、在中间过程中使用的函数。
  • 我们可以从Import窗口查看导入函数,Export窗口查看导出函数,Function Window查看程序中所有函数:

    744787-20160609205347074-1802014943.png

(3) 查看程序中的所有字符串:

  • 打开字符串strings视图:

    744787-20160609212548496-778401696.png

  • 这里就可以看到所有的字符串:

    744787-20160609205355855-1131470495.png

(4)查看某个函数调用其它函数的情况

  • 随便在左侧函数栏找一个函数,双击到达这个函数所在位置.text节10011F40:

    744787-20160609205400855-1282755763.png

  • 使用图形化工具查看:

    744787-20160609205406308-684683884.png

    • Function calls 显示所有的函数调用;
    • Xrefs to 查看哪些函数调用了这个函数:

      744787-20160609205411027-1840841134.png

    • Xrefs from 查看这个函数调用了那些函数:

      744787-20160609205414371-558124942.png

    • User Xrefs chart 可以让用户选择显示内容:

      744787-20160609205402121-894595855.png

      • Cross references to:显示被那些函数调用,相当于Xrefs to
      • Cross references from:显示调用那些函数,相当于Xrefs from
      • Recursive:递归显示, 若取消则仅显示上下直接调用函数
      • Follow only current direction:仅当前函数,若取消就变成了显示全部的函数调用
      • Recursion depth:显示调用的深度
      • Externals:是否忽略外部Windows API函数
      • Data:是否忽略数据
      • From Library Functions:是否忽略库函数内部的交叉参考
      • To Library functions:是否忽略外部的交叉参考
      • Print Comment:是否对外部函数打印注释

2. 使用IDA对lab05-01.dll进行分析

(1)DLLMain的地址是?

  • 一打开lab05-01.dll程序,自动停到入口地址DLLMain的位置:

    744787-20160609211221761-1269348272.png

  • 可以看到DLLMain的地址是在.text节1000D02E的位置

(2)调用了gethostbyname的函数有?

  • 打开导入表:

    744787-20160609211529699-1545211083.png

  • 通过ALT+T调出查找gethostbyname:

    744787-20160609211532730-602541012.png

  • 然后被定位到:

    744787-20160609211538886-293778554.png

  • 双击该项,跳转到其定位的地址100163CC的位置上:

    744787-20160609211625980-1623638656.png

  • 使用IDAPro的交叉引用功能,在上述位置用快捷键Ctrl+X打开交叉引用窗口:

    744787-20160609211602230-1280771607.png

  • p是gethostbyname被调用的引用,经过观察可得,在5个不同的位置调用了gethostbyname。

(3)分析地址为0x10001757处对gethostbyname的调用,确定DNS请求的目标。

  • 使用快捷键G快速定位到0x10001757:

    744787-20160609212149793-1978023719.png

  • 这里是一段汇编代码,call指令调用gethostbyname:

    744787-20160609212204324-1264413326.png

  • 这一段里面,首先在eax中压入偏移,双击off_10019040可以查看:

    744787-20160609212215293-205255092.png

  • 这里可以通过IDA的自动注释功能看到部分内容,双击aThisIsRdoPics查看完整的内容:

    744787-20160609212223121-416516161.png

    • 这里就是这个偏移指向的字符串“[This is RDO]pics.praticalmalwareanalysis.com”。
  • 接着,eax加上了0Dh,我们通过hex界面可能看得更直观,右击aThisIsRdoPics选择在新的十六进制视图打开:

    744787-20160609212541543-605799548.png

  • 光标放在网址最前位置,可以在下方看到相对偏移,除去中括号中内容的网址部分开始位置的偏移就是0Dh:

    744787-20160609212559918-1683647345.png

  • 然后将这个指向这个URL的eax压入栈,调用gethostbyname函数。

(4)字符串“\cmd.exe /c”出现在内存中的什么位置?分析引用“\cmd.exe /c”的代码所在区域可能完成的作用。

  • 在字符串视图查找字符串“\cmd.exe /c”:

    744787-20160609212601949-1363662698.png

  • 双击打开:

    744787-20160609212608011-1159692689.png

  • 可以看到位置是xdoors_d:10095B34。通过双击字符串后面注释中的上箭头或Ctrl+C查看交叉引用找到其引用:

    744787-20160609212622386-323640000.png

  • 定位到:

    744787-20160609212627558-673920028.png

  • 汇编学的不好,在这里看汇编代码也实在是费劲,为了大体判断这一部分的功能,我采用图形化界面,直接双击蓝色无条件跳转指向线、绿色条件跳转指向线查看代码的流程。
  • 可以看到一些有用的信息:

    call ds:GetCurrentDirectoryA:是一个系统参数,在一个缓冲区中装载当前目录。  call ds:GetLocalTime:获取本地时间。
  • 字符串位置:

    744787-20160609212635136-1701218517.png

  • 双击查看:

    744787-20160609213643340-1079967177.png

    • 获得关键信息:“Shell Session”会话

      call ds:CreatePipe:创建匿名管道的同时返回两个句柄:管道读句柄和管道写句柄。  call ds:GetStartupInfoA:获取进程起始信息。  call ds:recv:套接字接收函数  call ds:closesocket:关闭套接字。
  • 综合来看,这一部分可能完成的作用是使用套接字的一个远程会话。

(5)函数sub_10004E79调用了哪些函数?其中的API函数有哪些?根据API函数信息猜测该函数的作用,并尝试对该函数进行重命名。

  • 在左侧函数栏查找到sub_10004E79,双击查看:

    744787-20160609213649715-1832576485.png

  • 使用图形化工具查看这个函数调用了那些函数:

    744787-20160609213700027-784141703.png

  • 函数sub_10004E79调用了直接调用了四个函数,间接调用了四个函数。
    • API函数有:

      GetSystemDefaultLangID:取得系统的默认语言ID   Sprintf:把格式化的数据写入某个字符串中
    • C语言库函数有:

      Send:向一个已经连接的socket发送数据  Strlen:检测字符串实际长度  Malloc:向系统申请分配指定个字节的内存空间  Free:释放指向的存储空间
  • 猜测这个函数应该是获取了系统语言并打印出来,可以在左侧函数栏右击函数编辑:

    744787-20160609213708230-638290968.png

  • 重命名函数,方便进一步研究:

    744787-20160609213713777-817416806.png

  • 更改后可以看到函数名都已经被修改了:

    744787-20160609213720480-1891521679.png

(6)在0x10001701处是一个对socket的调用,它的三个参数分别是什么?结合MSDN中socket帮助和IDA中的命名符号常量,你认为这三个参数实际分别是什么?

  • 首先到达0x10001701处,看到其三个参数分别为:2,1,6:

    744787-20160609214321730-1769919368.png

  • 可以使用hex-ray反汇编C语言伪代码看得更清楚:

    744787-20160609213728715-1434843885.png

  • 在中查找:

    744787-20160609214329230-465734300.png

  • 可以找到我们需要的参数:

    • AF

      744787-20160609214342449-791657428.png

    • Type

      744787-20160609214350496-148184477.png

    • protocol

      744787-20160609214356433-1461111704.png

  • Socket函数中的三个参数分别为:

    2:AF_INET使用IPv4协议  1:SOCK_STREAM使用流式Socket  6:IPPROTO_TCP使用tcp协议
  • 可以右击更改为对应的名称方便理解:

    744787-20160609214400793-2086415893.png

  • 这个标志实际上是一个枚举型变量:

    744787-20160609214405324-521981027.png

  • 更改后效果:

    744787-20160609214409074-400293799.png

4. 实践小结

  • 有同学遇到了这样一个问题来问我:在Function window中搜索后面某一题中调用的函数没有找到,在Import中搜索到了,这个Function Window不应该包含这个程序里所有的函数吗,为什么会找不到一个确实被调用了的函数呢?
  • 我看了一下,确实是这样,打开其它程序,同样不显示导入函数:

    744787-20160609205352636-304929972.png

  • 查看Function Window中的标志F,因为标志F表示可能是导入函数,也可能是自己写的函数,没有看到有该标志的,可能是因为IDA版本问题或者是本身导入函数就不算在程序中写的函数?

  • IDA Pro功能实在是太强大了,在这么短的时间内只做到了根据问题粗略的使用,《恶意代码分析实战》用了一章的篇幅讲这个强大的反汇编器,读完了之后感觉有很多可拓展的使用方法(有些插件需要付费才能下载,免费版的功能和上面说的不大一样),还需要一定时间的学习。

  • 在做这次实践的过程中,我一直在想如何在没有这些问题的提示下使用IDAPro对一个恶意代码进行高级静态分析。汇编和反汇编很重要,对程序及工具交互能力的利用也很重要。在接下来的学习过程中需要逐步解决这个问题。


参考资料:

转载于:https://www.cnblogs.com/hyq20135317/p/5572810.html

你可能感兴趣的文章
待整理
查看>>
一次动态sql查询订单数据的设计
查看>>
C# 类(10) 抽象类.
查看>>
Vue_(组件通讯)子组件向父组件传值
查看>>
jvm参数
查看>>
我对前端MVC的理解
查看>>
Silverlight实用窍门系列:19.Silverlight调用webservice上传多个文件【附带源码实例】...
查看>>
2016.3.31考试心得
查看>>
mmap和MappedByteBuffer
查看>>
Linux的基本操作
查看>>
转-求解最大连续子数组的算法
查看>>
对数器的使用
查看>>
【ASP.NET】演绎GridView基本操作事件
查看>>
ubuntu无法解析主机错误与解决的方法
查看>>
尚学堂Java面试题整理
查看>>
MySQL表的四种分区类型
查看>>
[BZOJ 3489] A simple rmq problem 【可持久化树套树】
查看>>
STM32单片机使用注意事项
查看>>
swing入门教程
查看>>
好莱坞十大导演排名及其代表作,你看过多少?
查看>>