Skip to content

Instantly share code, notes, and snippets.

@alexander-hanel
Created July 28, 2020 17:16
Show Gist options
  • Save alexander-hanel/2566aed66ab7e22402688a3c1315949c to your computer and use it in GitHub Desktop.
Save alexander-hanel/2566aed66ab7e22402688a3c1315949c to your computer and use it in GitHub Desktop.
IDAPython Regex Example
import idautils
import re
import struct
"""
String Storage
Example 1
.text:004344F5 8D 05 47 3E 50 00 lea eax, stru_503E47
.text:004344FB 89 04 24 mov [esp+8+s.str], eax ; s
.text:004344FE C7 44 24 04 09 00 00 00 mov [esp+8+s.len], 9
"""
GO_STR_PATTERN = b"\x8D.(?P<offset>....)\x89\x04\$\xC7\x44\$\x04(?P<size>....)"
class MemHelper:
def __init__(self):
self.mem_results = b""
self.mem_offsets = []
if not self.mem_results:
self._get_memory()
def _get_memory(self):
result = b""
segments_starts = [ea for ea in idautils.Segments()]
offsets = []
start_len = 0
for start in segments_starts:
end = idc.get_segm_end(start)
result += idc.get_bytes(start, end - start)
offsets.append((start, start_len, len(result)))
start_len = len(result)
self.mem_results = result
self.mem_offsets = offsets
def to_virtual_address(self, offset):
va_offset = 0
for seg in self.mem_offsets:
if seg[1] <= offset < seg[2]:
va_offset = seg[0] + (offset - seg[1])
return va_offset
mem = MemHelper()
match = re.finditer(GO_STR_PATTERN, mem.mem_results, re.DOTALL)
if match:
for m in match:
g = m.groupdict()
offset = struct.unpack('<I', g.get('offset'))[0]
if offset == ida_idaapi.BADADDR:
break
length = struct.unpack('<I', g.get('size'))[0]
if idc.get_segm_name(offset) == '.text':
ida_bytes.del_items(offset, 2, length)
print(hex(mem.to_virtual_address(m.start())), hex(offset),hex(length))
ida_bytes.create_strlit(offset, length, -1)
ida_auto.auto_wait()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment