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 buf
buf = buf[:p] + "90" * ln + buf[p+ln:]
def matchBytes(s, Condition):
l = len