Pizza的脚本中是通过get_bytes和patch_bytes两个API来将所有机器码读出然后再Patch回去的
中间匹配pattern的过程是构造字符串然后find来控制

这样操作的优点是find的效率奇高,对于大量数据的处理非常的快
而我们之前使用的逐字符匹配pattern的优点是可控性比较强,例如通配符的存在
然而缺点就是速度很慢,对于数量级较大时格外明显,因此试图修复

刚开始以为速度在于多次取Byte,改成python同样用get_bytes取出后再匹配,发现仍然很慢
于是想到了通过find来快速找到pattern开头非?的部分,然后再用原来的matchBytes匹配,发现能得到一定的效率提升,但还是有点问题

from ida_bytes import get_bytes, patch_bytes
addr = 0x401000
end = 0x4b9cd0
buf = "".join(["%02x"%ord(i) for i in get_bytes(addr,end-addr)]).lower()
def patch_at(p, ln):global bufbuf = buf[:p] + "90" * ln + buf[p+ln:]def matchBytes(s, Condition):l = len(Condition)for i in range(len(Condition)):if(Condition[i]!="?" and s[i]!=Condition[i]):return Falsereturn TrueCondition = "E801000000??83C404".lower()
l = len(Condition)/2
# for i in range(end-addr):
i = buf.find(Condition[:Condition.find("?")])
tmp = -1
while(i!=tmp):i = tmpif(matchBytes(buf[i:], Condition)):patch_at(i, l)print(i, l)tmp = i+1+buf[i+1:].find(Condition[:Condition.find("?")])# print(buf)
buf = "".join([chr(int(buf[2*i]+buf[2*i+1], 16)) for i in range(len(buf)//2) ])
patch_bytes(addr,buf)
print("Done")

然后优化着优化着突然灵光一闪才想起来正则表达式
自己实现匹配pattern的都是傻哔-!

from ida_bytes import get_bytes, patch_bytes
import re
addr = 0x401000
end = 0x4b9cd0
# buf = "".join(["%02x"%ord(i) for i in get_bytes(addr,end-addr)])
buf = get_bytes(addr, end-addr)
def handler1(s):s = s.group(0)print("".join(["%02x"%ord(i) for i in s]))s = "\x90"*len(s)return sdef handler2(s):opcode1 = ord(s.group(1))opcode2 = ord(s.group(2))if(opcode1|1 == opcode2|1):return "\x90"*5else:return s.group(0)pattern1 = r"\xE8[\x01-\x03]\x00\x00\x00((?!\xE8).){1,5}(\x83\xC4\x04|\x58|\x83\x04\x24\x06\xc3)"
pattern2 = r"([\x70-\x7f])\x03([\x70-\x7f])\x01."
buf = re.sub(pattern1, handler1, buf, flags=re.I)
# buf = "".join([chr(int(buf[2*i]+buf[2*i+1], 16)) for i in range(len(buf)//2) ])
patch_bytes(addr, buf)
print("Done")

又简单又快(╯‵□′)╯︵┻━┻现成的sub函数提供了替换功能,handler提供了截取通配符并有选择地修改替换内容的功能,简直量身定做啊这个

pattern里有一个((?!E8).)的部分,是(.*?)的对.的替换,要求中间部分不存在E8,否则可能会导致前一个E8衔接到后一个E8的83C404上,造成大范围的匹配

做完上述的以后突然想起来可以通过{1,5}来限定通配符.的匹配次数,进而控制大范围匹配的orz
另外还有\xE8之后的第二个字符用[\x01-\x03]做了限定

一共三处防止多余匹配的措施,对于其他题目可能会导致漏解,届时请自行修正~

另外还有(\x83\xc4\x01 | \x58 | \x83\x04\x24\x06\xc3)的多选结构,意味着以\x83\xc4\x01(add esp,4)或\x58(pop eax)或\x83\x04\x24\x06\xc3(add [esp], 6 ; retn)结尾的三种情况都会被匹配到并全部清除

这里可以想到的一种漏解可能情况是add [esp], 7; retn ; bad byte ; correct bytes;这种形式,因为它没有确定的结束字符所以相对麻烦一点
感觉可以通过多写几个通配符做冗余匹配,然后在handler中做判断

190321 逆向-花指令去除(脚本)相关推荐

  1. CTF逆向-[MRCTF2020]VirtualTree-恒成立的jz花指令去除及smc变换原执行流程在二叉树上的应用,通过逆向思维编写脚本以解决

    CTF逆向-[MRCTF2020]VirtualTree-恒成立的jz花指令去除及smc变换原执行流程在二叉树上的应用,通过逆向思维编写脚本以解决 来源:https://buuoj.cn/ 内容: 附 ...

  2. 190319 逆向-花指令

    以前也接触过简单的花指令,基本上就是jz/jnz式的固定跳转 前几天的某比赛中出现了一个相对而言比较复杂的花指令,参考pizza的笔记开始一阵学习XD 前言 花指令指的是没有卵用,会干扰代码阅读甚至反 ...

  3. 逆向分析基础 --- 花指令实现及清除

    一.基本概念 花指令:目的是干扰ida和od等软件对程序的静态分析.使这些软件无法正常反汇编出原始代码. 常用的两类反汇编算法: 1.线性扫描算法:逐行反汇编(无法将数据和内容进行区分) 2.递归行进 ...

  4. CTF逆向基础----花指令总结

    什么是花指令? 花指令实质就是一串垃圾指令,它与程序本身的功能无关,并不影响程序本身的逻辑.在软件保护中,花指令被作为一种手段来增加静态分析的难度,花指令也可以被用在病毒或木马上,通过加入花指令改变程 ...

  5. 【逆向学习】花指令的去除

    花指令 我在做逆向的题目的时候,经常会遇到需要自己将一堆乱码用IDA分析构建成函数,但函数却无法仍然无法使用f5进行编译,就是因为存在花指令的缘故.花指令经常被作为一种手段来增加代码分析的难度.我就打 ...

  6. 逆向分析软件去除易语言花指令完成注册

    文章目录 用到的软件 查壳 去除花指令 寻找关键跳或者关键CALL 完成注册 用到的软件 OD PEID 会员管理软件 查壳 直接拖进PEID看一下,这里没壳,直接干了 去除花指令 查找关键字 首先我 ...

  7. 花指令如何用c语言编写,逆向学习笔记之花指令

    概念 花指令是企图隐藏掉不想被逆向工程的代码块(或其它功能)的一种方法,在真实代码中插入一些垃圾代码的同时还保证原有程序的正确执行,而程序无法很好地反编译, 难以理解程序内容,达到混淆视听的效果. 简 ...

  8. 抗去除花指令(一)——花指令基础

    转自 http://blog.csdn.net/yangbostar/article/details/6194133 入门知识,高手勿读 一. 概述 花指令是对抗反汇编的有效手段之一,正常代码添加了花 ...

  9. 2022CTF培训(四)花指令字符串混淆入门

    附件下载链接 花指令 花指令的介绍 花指令(JunkCode)指的是使用一些技巧将代码复杂化,使人难以阅读的技术.广义上花指令与代码混淆(ObfusedCode)同义,包括结构混淆.分支混淆.语句膨胀 ...

最新文章

  1. mysql和html的联系_前台与PHP与Mysql三者的联系
  2. 钱学森在30年前对虚拟现实和元宇宙的思考
  3. MySQL:Innodb DB_ROLL_PTR指针解析
  4. 来自艾斯维尔的计算机科学系的期刊排行,研究生必备!
  5. 《操作系统实现之路》源代码下载路径及求助途径
  6. @query传参_vue-router中params传参和query传参的区别及处理方法
  7. 大学计算机一级word,大学计算机基础一级考试复习资料
  8. 自定义模块_Nginx自定义模块开发
  9. 天黑时间跟经度还是纬度有关_经纬度和时间气候
  10. 贝叶斯公式理解与应用
  11. Echarts 环图 颜色渐变、灰色背景、自适应
  12. 读书笔记:《产品经理手册》(第4版)
  13. 手把手教你在群晖中设置阿里云DDNS
  14. 用计算机计算勾股定理,勾股计算器(勾股定理计算器)
  15. 【协议基础】DNS协议概述DNS抓包分析
  16. 冬瓜哥对时间和空间的理解方式—时空参悟(上)
  17. html鼠标经过状态,30种炫酷html5鼠标滑过图片标题显示效果
  18. Linux网络适配器不见了,linux – lspci未显示HyperV网络适配器
  19. 幽夜至,辞夏迎秋月抒怀
  20. 首款国产全画幅8K50P广播级摄像机

热门文章

  1. LeetCode 399 除法求值 题解
  2. 海康练习设备网络抓图错误代码29
  3. ACdreM-1061 郭式树 没文化真可怕
  4. H5视频之video.js 视频直播前端
  5. u9服务器系统,U9服务器选型和部署方案doc .doc
  6. JS 和 CSS 是如何影响页面渲染的?
  7. redis_day_23_twitter/ twemproxy代理集群代理redis
  8. The Download Sites
  9. 微信小程序之滔搏运动
  10. 爬虫爬取中国大学排名