zoukankan      html  css  js  c++  java
  • IDA基础

    1. IDA使用

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

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

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

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

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

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

    • 打开字符串strings视图:

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

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

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

    • 使用图形化工具查看:

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

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

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

        • 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的位置:

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

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

    • 打开导入表:

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

    • 然后被定位到:

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

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

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

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

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

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

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

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

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

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

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

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

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

    • 双击打开:

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

    • 定位到:

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

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

    • 双击查看:

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

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

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

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

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

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

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

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

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

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

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

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

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

    • MSDN中查找socket function

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

      • AF

      • Type

      • protocol

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

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

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

    • 更改后效果:

    4. 实践小结

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

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

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

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


    参考资料:《恶意代码分析实战》读书笔记 静态分析高级技术一

  • 相关阅读:
    Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column is set to 0.
    旋转二维数组
    replace empty char with new string,unsafe method和native implementation的性能比较
    判断一字符串是否可以另一字符串重新排列而成
    移除重复字符的几个算法简单比较
    也来纠结一下字符串翻转
    判断重复字符存在:更有意义一点
    程序员常去网站汇总
    sublime
    针对程序集 'SqlServerTime' 的 ALTER ASSEMBLY 失败,因为程序集 'SqlServerTime' 未获授权(PERMISSION_SET = EXTERNAL_ACCESS)
  • 原文地址:https://www.cnblogs.com/ltyandy/p/11240847.html
Copyright © 2011-2022 走看看