恶意代码分析-第五章-IDApro

目录

 

笔记

实验


笔记

设置

           Options - General,选择Line prefixes并设置Number of Opcode Bytes 为6.可以看到16进制代码

           Options - General,选择Auto comments,IDA帮助注释

窗口

           函数窗口:左拖拽,可以看到长度,以函数长度排序,过滤出规模大的函数

           每个函数也关联了一些标志位(F,L,S)。L--库函数

名字窗口:函数名,命名代码,命名数据,字符串

字符串窗口:默认显示长度超过5个的字符ASCII字符串 通过setup来改动

导入表窗口

导出表窗口

结构窗口

链接

子链接:printf /sub_4010A0

本地链接:loc_40107E

偏移链接:内存偏移链接 字符串引用

导航栏

代码

        浅蓝色:被FLIRT识别的库代码

        红色:编译器生成的代码

        深蓝色:用户编写的代码

数据

        粉红色:导入数据

        灰色:已定义数据

        棕色:未定义数据

跳转

G键---跳转到虚拟地址或命名位置

Jump->Jump to File Offset---跳转到原始文件

搜索

Search--Next Code,移动光标到包含所指定的下一个位置

Search--Text,在整个反汇编窗口搜索一个指定的字符串

Search--Sequence of bites ,搜索指定数据和操作码组合

交叉

代码交叉:函数名 按X

数据交叉:跟踪二进制数据访问

p:是被调用的引用

r:是读取的引用

分析函数:

bp-based:基于EBP栈针的使用,局部变量和参数都通过EBP寄存器引用

var_4:局部变量,负位置

arg_0:参数,正位置

Alt+P 修正函数 勾选BP based frame 指定4bytes for Saved Registers

图形:

-----对当前的交叉引用,生成所有指向这一个函数

----本函数对其他函数的调用

使用命名常量:

可以任意选择

加载类型库:view - open subviews - type libraries查看当前加载的库

获取本地API的符号常量,ntapi

分析一个linux二进制时,gnuunx

重定义代码和数据:

U:取消定义

C :定义代码

D:定义数据

A:定义ASCII

IDAPython:

from idautils import *
from idc import *
heads = Heads(SegStart(ScreenEA()),SegEnd(ScreenEA()))
functionCalls = []
for i in heads:
    if GetMnem(i) == "call":
        functionCalls.append(i)
print "Number of calls found: %d" % (len(functionCalls))
for i in functionCalls:
    SetColor(i,CIC_ITEM,0xc7fdff)

 额外插件

zynamics bindiff使用:https://blog.csdn.net/lostspeed/article/details/71599430

Hex-Rays:

实验

Lab5

利用python 显示部分题的答案

print "1.------------------_DllMain@12处的地址-------------------"
print hex(LocByName("_DllMain@12"))

print "2.------------------gethostbyname处的地址-------------------"
print hex(LocByName("gethostbyname"))

print "3.------------------对gethostbyname的引用-------------------"
for addr in CodeRefsTo(LocByName("gethostbyname"), 0):
    print (addr, GetDisasm(addr))

print "4.------------------0x10001757处的DNS-------------------"
for i in range(5):
    ea = PrevHead(0x10001757-i)
    print (hex(ea), GetDisasm(ea))

print "5.6.------------------0x10001656处的变量-------------------"
stack_frame = GetFrame(0x10001656)
frame_counter = 0
var_count = 0
frame_size = GetStrucSize(stack_frame)

while frame_counter < frame_size:
    member = str(GetMemberName(stack_frame, frame_counter))
    if member != ' r' and member != 'None':
        var_count += 1
        try:
            frame_counter += GetMemberSize(stack_frame, frame_counter)
        except:
            frame_counter += 1
    else:
        frame_counter += 1
print var_count

print "7.-----------------\cmd.exe /c处的地址-------------------"
for item in Strings():
    if "\cmd.exe /c" in str(item):        
        for addr in DataRefsTo(item.ea):
            print hex(addr)

猜你喜欢

转载自blog.csdn.net/m0_37809075/article/details/81394637