文章目录
- 参考文章
 - IDAPython简介
 - 常用函数
 - 获取界面地址的函数
 - 数值获取函数
 - 数值判断函数
 - patch操作函数
 - 去除花指令实例
 
参考文章
IDAPython入门教程 基于IDA7.5_Python3 第一讲 简介与地址获取
IDAPython简介
IDAPython拥有强大的功能,在使用IDA分析程序时非常有用,可以简化许多操作例如花指令的特征码匹配修改
学习IDAPython需要了解一点Python语言的基本知识以及查询IDAPython文档
 IDAPython官方文档: IDAPython documentation
 直接在搜索框搜索即可匹配相关项
 
 
常用函数
获取界面地址的函数
-  
idc.here()
获取当前光标选择的指令地址

 -  
idc.get_screen_ea()
功能同idc.here() -  
ida_ida.inf_get_min_ea()
获取程序的最小地址 -  
ida_ida.inf_get_max_ea()
获取程序最大地址 -  
idc.read_selection_start()
获取选中区块的起始地址

 -  
idc.read_selection_end()
获取选中区块的终止地址 -  
idc.BADADDR
这是一个常量,定义为4294967295(0xffffffff),用于表示不可访问的空地址(类似于值等于NULL的指针),用于判断地址是否存在

 
数值获取函数
- idc.get_wide_byte(addr)
 - idc.get_wide_word(addr)
 - idc.get_wide_dword(addr)
 - idc.get_qword(addr)
 
数值判断函数
- ida_bytes.is_byte(addr)
 - ida_bytes.is_word(addr)
 - ida_bytes.is_dword(addr)
 - ida_bytes.is_qword(addr)
 
patch操作函数
- ida_bytes.patch_byte(addr,value)
 - ida_bytes.patch_word(addr,value)
 - ida_bytes.patch_dword(addr,value)
 - ida_bytes.patch_qword(addr,value)
 
去除花指令实例
NKCTF2023 Reverse earlier
 该题有多个相同的花指令
 
 
.text:00401527 33 C0                         xor     eax, eax
.text:00401529 85 C0                         test    eax, eax
.text:0040152B 74 03                         jz      short near ptr loc_40152F+1
.text:0040152B
.text:0040152D 75 00                         jnz     short $+2
.text:0040152D
.text:0040152F
.text:0040152F                               loc_40152F:                             
.text:0040152F                                                                       
.text:0040152F E8 8B F4 FF 15                call    near ptr 164009BFh
 
很显然,xor eax,eax之后eax置零,此时test指令得到的结果必定是0
 所以必定执行jz指令而非jnz (jnz指令的意思是跳转到该条指令地址+2后)
 也就是说必定跳转到0x00401530处,不可能跳转到0x0040152f
 我们手动去除完全可以,取消定义,nop,重新识别为代码即可
 
 
 来试试IDAPython脚本:
import idc
import idautils
import ida_bytes
pattern = "33 C0 85 C0 74 03 75 00 E8" 	# 匹配花指令字节码
cur_addr = 0x401000						# 程序起始地址
while cur_addr != idc.BADADDR:			# 遍历程序可访问地址
    cur_addr = idc.find_binary(cur_addr,SEARCH_DOWN,pattern) 
    # 匹配花指令所在地址,第一个参数是起始地址,第二个参数是搜索方式,这里是向下(低地址向高地址搜索),第三个是格式字符串
    if cur_addr == idc.BADADDR:								 # 如果未匹配到
        break;
    else:
        print("patch address: ",hex(cur_addr)) 				 # 打印起始地址
        for i in range(9):									 # 开始patch
            ida_bytes.patch_byte(cur_addr,0x90)
            cur_addr += 1
 
可以看到所有相同的花指令都被去除了
 

 后续内容随着学习补充ing











![[渗透教程]-013-网络实体标识及网络监听](https://img-blog.csdnimg.cn/img_convert/a418c6f8f4a3c6eb43a0c5580d3ea7b3.jpeg)







