├── __init__.py
├── ui
├── __init__.py
├── mk.py
├── warning.ui
├── elf.ui
├── selectName.ui
├── CMD.ui
├── emulate.ui
├── trace.ui
├── traceDump.ui
├── offset.ui
├── ea_view.ui
├── heap.ui
└── restyle.ui
├── .gitignore
├── arrow.png
├── screens
├── cmd.png
├── cmd2.png
├── emu.png
├── heap.png
├── trace.png
├── view.png
├── view2.png
├── screen.png
├── screen3.png
├── trace10.png
├── trace2.png
├── trace4.png
├── trace5.png
├── trace6.png
├── trace7.png
├── trace8.png
└── trace9.png
├── ea_main.py
├── chunk_template.html
├── ea_read_t.py
├── get_offsets.py
├── README.md
├── api_funcs.py
├── style_template.css
├── ea_trace.py
├── ea_cmd.py
├── ea_skin.py
├── ea_emu_client.py
├── ea_view.py
├── ea_emu_server.py
├── ea_utils.py
├── ea_heap.py
└── ea_UI.py
/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | *.pyc
3 | *.ui_out
4 | config.json
5 | .idea
--------------------------------------------------------------------------------
/arrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1111joe1111/ida_ea/HEAD/arrow.png
--------------------------------------------------------------------------------
/screens/cmd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1111joe1111/ida_ea/HEAD/screens/cmd.png
--------------------------------------------------------------------------------
/screens/cmd2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1111joe1111/ida_ea/HEAD/screens/cmd2.png
--------------------------------------------------------------------------------
/screens/emu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1111joe1111/ida_ea/HEAD/screens/emu.png
--------------------------------------------------------------------------------
/screens/heap.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1111joe1111/ida_ea/HEAD/screens/heap.png
--------------------------------------------------------------------------------
/screens/trace.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1111joe1111/ida_ea/HEAD/screens/trace.png
--------------------------------------------------------------------------------
/screens/view.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1111joe1111/ida_ea/HEAD/screens/view.png
--------------------------------------------------------------------------------
/screens/view2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1111joe1111/ida_ea/HEAD/screens/view2.png
--------------------------------------------------------------------------------
/screens/screen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1111joe1111/ida_ea/HEAD/screens/screen.png
--------------------------------------------------------------------------------
/screens/screen3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1111joe1111/ida_ea/HEAD/screens/screen3.png
--------------------------------------------------------------------------------
/screens/trace10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1111joe1111/ida_ea/HEAD/screens/trace10.png
--------------------------------------------------------------------------------
/screens/trace2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1111joe1111/ida_ea/HEAD/screens/trace2.png
--------------------------------------------------------------------------------
/screens/trace4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1111joe1111/ida_ea/HEAD/screens/trace4.png
--------------------------------------------------------------------------------
/screens/trace5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1111joe1111/ida_ea/HEAD/screens/trace5.png
--------------------------------------------------------------------------------
/screens/trace6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1111joe1111/ida_ea/HEAD/screens/trace6.png
--------------------------------------------------------------------------------
/screens/trace7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1111joe1111/ida_ea/HEAD/screens/trace7.png
--------------------------------------------------------------------------------
/screens/trace8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1111joe1111/ida_ea/HEAD/screens/trace8.png
--------------------------------------------------------------------------------
/screens/trace9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1111joe1111/ida_ea/HEAD/screens/trace9.png
--------------------------------------------------------------------------------
/ui/mk.py:
--------------------------------------------------------------------------------
1 | from pysideuic import compileUi
2 |
3 |
4 | with open(r"./warning.ui", "r") as r:
5 | with open("out.ui_out", "w") as w:
6 | compileUi(r, w)
7 |
8 | quit()
--------------------------------------------------------------------------------
/ea_main.py:
--------------------------------------------------------------------------------
1 | from ea_cmd import ea_cmd
2 | from ea_emu_client import ea_emulate
3 | from ea_heap import ea_heap
4 | from ea_skin import apply_skin, ea_reskin
5 | from ea_trace import ea_trace
6 | from ea_utils import QtWidgets, config
7 | from ea_view import ea_view
8 |
9 | if config["apply_skin_on_startup"]:
10 | apply_skin(init=True)
11 | # apply_initial_skin()
12 |
13 | menu_bar = next(i for i in QtWidgets.qApp.allWidgets() if isinstance(i, QtWidgets.QMenuBar))
14 | menu = menu_bar.addMenu("IDA EA")
15 | menu.addAction("Viewer").triggered.connect(ea_view)
16 | menu.addAction("Heap").triggered.connect(ea_heap)
17 | menu.addAction("Emulate").triggered.connect(ea_emulate)
18 | menu.addAction("Trace Dump").triggered.connect(ea_trace)
19 | menu.addAction("CMD").triggered.connect(ea_cmd)
20 | menu.addAction("Reskin").triggered.connect(ea_reskin)
21 |
--------------------------------------------------------------------------------
/ui/warning.ui:
--------------------------------------------------------------------------------
1 |
2 |
| address | 14 |%s | 15 |
| prev_size | 18 |%s | 19 |
| size | 22 |%s | 23 |
| fd | 26 |%s | 27 |
| bk | 30 |%s | 31 |
| fd_nextsize | 34 |%s | 35 |
| bk_nextsize | 38 |%s | 39 |
| prev_inuse | 42 |%s | 43 |
| ismmapped | 46 |%s | 47 |
"
18 |
19 | for x in range(n):
20 | regions = []
21 | get_mem_recursive(addr + x * 4, regions, int_size=int_size)
22 | string += parse_mem(regions) + "
"
23 |
24 | string += "
"
48 |
49 | for addr in matches:
50 | regions = []
51 | get_mem_recursive(addr, regions, int_size=int_size)
52 | string += parse_mem(regions) + "
"
53 |
54 | string += "
").join(mem)
28 |
29 |
30 | def get_bits():
31 |
32 | global file_name
33 | global _32_bit
34 |
35 | new_name = get_root_filename()
36 |
37 | if new_name != file_name:
38 | file_name = new_name
39 |
40 | # avoid IDA bug
41 | if get_inf_structure().is_32bit() and get_inf_structure().is_64bit():
42 | _32_bit = (next((False for i in ("r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15")
43 | if get_rg(i) != 0xffffffffffffffff), True) and
44 | next((False for i in ("rax", "rbx", "rcx", "rdx", "rsi", "rdi", "rbp", "rsp", "rip")
45 | if get_rg(i) > 0xffffffff), True))
46 | else:
47 | _32_bit = get_inf_structure().is_32bit()
48 |
49 | return _32_bit
50 |
51 |
52 | def get_mem_recursive(mem, matches, prev_mem=False, get_perm=True, int_size=4):
53 |
54 | global iterations
55 |
56 | mem_str = hex(mem)[2:].strip("L").zfill(int_size * 2)
57 |
58 | if get_perm:
59 | try:
60 | perm = bin(GetSegmentAttr(mem, SEGATTR_PERM))[2:].zfill(3)
61 | if "1" in perm:
62 | perm = '(' + "".join(sym if int(v) else "-" for v, sym in zip(perm, ("r", "w", "x"))) + ')'
63 | else:
64 | perm = ""
65 | except:
66 | perm = ""
67 | else:
68 | perm = ""
69 |
70 | offset = None
71 |
72 | if codeSegment and codeStart < mem < codeEnd:
73 | offset = GetFuncOffset(mem)
74 | if offset:
75 | text = cPrint("code", "0x" + mem_str) + cPrint("code", " <" + offset + ">")
76 | code = True
77 |
78 | if not offset:
79 | if perm or not get_perm:
80 | text = cPrint("valid", "0x" + mem_str)
81 | elif next((False for i in mem_str if i != "0"), True):
82 | text = cPrint("null", "0x" + mem_str) # + "(NULL)"
83 | else:
84 | text = "0x" + mem_str
85 |
86 | if next((False for i in reversed(mem_str.decode("HEX")) if i not in printable), True) and prev_mem:
87 | r_mem = dbg_read_memory(prev_mem, 50)
88 | if r_mem:
89 | text += '(' + cPrint("string", '"' + r_mem.split("\x00")[0].replace("\n", "") + '"') + ')'
90 |
91 | code = False
92 |
93 | matches.append(text)
94 |
95 | if not code and iterations < max_iterations:
96 | iterations += 1
97 | next_mem = dbg_read_memory(mem, int_size)
98 |
99 | if next_mem:
100 | get_mem_recursive(int("".join(reversed(next_mem)).encode("HEX"), 16), matches, mem, int_size=int_size)
101 |
102 | iterations = 0
103 |
104 |
105 | def ea_warning(text, buttons=(("OK", None, True),), checkboxes=[], title="EA Warning"):
106 |
107 | global warning
108 | global form
109 |
110 | warning = QtWidgets.QFrame()
111 | form = Warning_UI()
112 | form.setupUi(warning)
113 | form.label.setText(text)
114 |
115 | for button, handler, close_on_click in buttons:
116 | setattr(form, button, QtWidgets.QPushButton(warning))
117 | getattr(form, button).clicked.connect(handler if handler else warning.close)
118 | getattr(form, button).setText(QtWidgets.QApplication.translate("Dialog", button, None))
119 |
120 | if close_on_click:
121 | getattr(form, button).clicked.connect(warning.close)
122 |
123 | form.horizontalLayout.addWidget(getattr(form, button))
124 |
125 | for checkbox, handler, checked in checkboxes:
126 | setattr(form, checkbox, QtWidgets.QCheckBox(warning))
127 | getattr(form, checkbox).stateChanged.connect(handler)
128 | getattr(form, checkbox).setText(QtWidgets.QApplication.translate("Dialog", checkbox, None))
129 | getattr(form, checkbox).setChecked(checked)
130 | form.horizontalLayout_2.addWidget(getattr(form, checkbox))
131 |
132 | warning.setWindowFlags(warning.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
133 | warning.setWindowTitle(QtWidgets.QApplication.translate("Dialog", title, None))
134 | warning.show()
135 |
136 |
137 | def set_style():
138 |
139 | global style
140 |
141 | s = QtCore.QSettings()
142 | s.beginGroup("Font")
143 | s.beginGroup("Disassembly")
144 | font_name = s.value("Name")
145 |
146 | style[0] = str(
147 | (
148 | "" % (
158 | (config["current_skin"][0] if config["match_background"] else config["current_skin"][9]),
159 | "consolas",
160 | config["current_skin"][11],
161 | config["current_skin"][10],
162 | config["current_skin"][12],
163 | config["current_skin"][13])
164 | )
165 | )
166 |
167 |
168 | def save_config():
169 |
170 | with open(root_dir + "config.json", "w") as w:
171 | dump(config, w)
172 |
173 |
174 | def load_config():
175 |
176 | global config
177 |
178 | init_config = {
179 | "libc_offsets": [0, 0, 0, 0],
180 | "trace_dir": "",
181 | "stack_display_length": 25,
182 | "apply_skin_on_startup": True,
183 | "show_rewind_warning": True,
184 | "match_background": True,
185 | "current_skin": ["1c1c2a", "ffffff", "818181", "00d5ff", "ffffff", "202030", "ffffff", "00e6ff", "ffffff", '1c1c2a', 'FFFFFF', '00FFFF', 'C4F0C5', '737DFF'],
186 | "skins": [["Neon Dark", "212121", "ffffff", "414141", "00fff7", "ffffff", "282828", "ffffff", "00ffea", "ffffff", '212121', 'FFFFFF', '00FFFF', 'C4F0C5', '737DFF'],
187 | ["Neon Blue", "1c1c2a", "ffffff", "818181", "00d5ff", "ffffff", "202030", "ffffff", "00e6ff", "ffffff", '1c1c2a', 'FFFFFF', '00FFFF', 'C4F0C5', '737DFF']]
188 | }
189 |
190 | if not isfile(root_dir + "config.json"):
191 | config = init_config
192 |
193 | else:
194 | try:
195 | with open(root_dir + "config.json", "r") as f:
196 | config = load(f)
197 | except:
198 | print 'IDA EA Error: Config File ("config.json") contained invalid JSON. Reinitializing config...'
199 | remove(root_dir + "config.json")
200 | load_config()
201 | return
202 |
203 | for i,v in init_config.items():
204 | if i not in config:
205 | config[i] = v
206 |
207 | if len(config["current_skin"]) == 9:
208 | # Add new settings
209 | new_settings = ['212121', 'FFFFFF', '00FFFF', 'C4F0C5', '737DFF']
210 | config["current_skin"] += new_settings
211 | for i in config["skins"]:
212 | i += new_settings
213 |
214 | # Check config file integrety
215 | if len(config["current_skin"]) != 14:
216 | config["current_skin"] = init_config["current_skin"]
217 | print "IDA EA: Errors in current_skin found, Reinitializing"
218 |
219 | for i in config["skins"][:]:
220 | if len(i) != 15:
221 | config["skins"].remove(i)
222 | print "IDA EA: Errors found in %s skin found, Removing" % i[0]
223 | # Check if skin in init_config
224 | skin_names = [a[0] for a in init_config["skins"]]
225 | if i[0] in skin_names:
226 | config["skins"].append(init_config["skins"][skin_names.index(i[0])])
227 | print "IDA EA: Reinitialized %s skin" % i[0]
228 |
229 | for k in init_config:
230 | if type(config[k]) != type(init_config[k]):
231 | config[k] = init_config[k]
232 | print "IDA EA: Reinitialized incorrect value %s in config file" % k
233 |
234 | save_config()
235 |
236 |
237 |
238 | def a_sync(func, ThreadClass=QtCore.QThread):
239 |
240 | # if reference to QThread is not global,
241 | # python's garbage collection cleans up QThread whilst running causing a crash in IDA
242 | # to prevent this we have an array of global thread references which expands as nessecary
243 |
244 | thread_idx = next((i for i, v in enumerate(threads) if not v.isRunning()), False)
245 | thread = ThreadClass()
246 |
247 | if thread_idx is not False:
248 | threads[thread_idx] = thread
249 | else:
250 | threads.append(thread)
251 |
252 | thread.run = func
253 | thread.start()
254 |
255 |
256 | max_iterations = 10
257 | iterations = 0
258 |
259 | codeSegment = get_segm_by_name(".text")
260 |
261 | if codeSegment:
262 | codeStart = codeSegment.startEA
263 | codeEnd = codeSegment.endEA
264 |
265 | file_name = None
266 | _32_bit = None
267 | root_dir = __file__[:max(__file__.rfind("/"), __file__.rfind("\\"), 0)] + "/"
268 | warning = None
269 | config = None
270 | threads = []
271 | style = [""]
272 |
273 | load_config()
274 | set_style()
275 |
276 |
277 |
--------------------------------------------------------------------------------
/ea_heap.py:
--------------------------------------------------------------------------------
1 | from api_funcs import *
2 | from ea_UI import Heap_UI, Set_Offset_UI
3 | from ea_utils import QtCore, QtWidgets, config, ea_warning, get_bits, read, root_dir, save_config
4 | from idaapi import *
5 | from idautils import *
6 | from idc import *
7 | from re import findall
8 |
9 | class Hook(DBG_Hooks):
10 |
11 | def __init__(self):
12 | DBG_Hooks.__init__(self)
13 |
14 | def dbg_bpt(self, tid, bptea):
15 |
16 | if bptea == malloc_addr:
17 | addr = get_rg("RAX") - int_size*2
18 | c = chunk(*(to_list(dbg_read_memory(addr, 6 * int_size)) + [addr]))
19 | addr = hex(addr).replace("L", "")
20 |
21 | if not form.listWidget_4.findItems(addr, QtCore.Qt.MatchFlag.MatchExactly):
22 | form.listWidget_4.addItem(addr)
23 |
24 | chunkmap_2[addr] = c
25 | update_chunk(c)
26 | get_malloc_state()
27 |
28 | return 0
29 |
30 |
31 | class field():
32 |
33 | def __init__(self,val,size):
34 | self.val = val
35 | self.size = size
36 |
37 |
38 | class malloc_state():
39 |
40 | def __init__(self, address):
41 | self.mutex = field(0, 0.5 if int_size == 8 else 1)
42 | self.flags = field(0, 0.5 if int_size == 8 else 1)
43 | self.fastbinsY = field([1],10)
44 | self.top = field(0,1)
45 | self.last_remainder = field(0,1)
46 | self.bins = field([1], 254)
47 | self.binmap = field([0.5], 4)
48 | self.next = field(0,1)
49 | self.next_free = field(0,1)
50 | self.attached_threads = field(0,1)
51 | self.system_mem = field(0,1)
52 | self.max_system_mem = field(0,1)
53 |
54 | # Not a member of glibc malloc_state
55 | self.address = address
56 |
57 |
58 | class chunk():
59 |
60 | def __init__(self, prev_size, size, fd, bk, fd_nextsize, bk_nextsize, address):
61 | self.prev_size = prev_size
62 | self.size = size & 0xfffffffc
63 | self.fd = fd
64 | self.bk = bk
65 | self.fd_nextsize =fd_nextsize
66 | self.bk_nextsize = bk_nextsize
67 | self.prev_in_use = size & 0x1
68 | self.is_mmapped = 1 if size & 0x2 else 0
69 |
70 | # Not a member of glibc chunk
71 | self.data = ""
72 | self.address = address
73 |
74 | def __str__(self):
75 |
76 | a = ("prev_size" ,"size" ,"fd", "bk", "fd_nextsize", "bk_nextsize")
77 |
78 | return ( "Chunk @ " + hex(getattr(self, "address")) + " = {\n" +
79 | "".join( " " + i + " = " + hex(getattr(self, i)) + "\n" for i in a) + "\n" +
80 | " prev_in_use = " + ("True" if self.prev_in_use else "False") + "\n"
81 | " is_mmapped = " + ("True" if self.is_mmapped else "False") + "\n"
82 | + "}")
83 |
84 |
85 | def to_hex(x):
86 | return hex(x).replace("L","")
87 |
88 |
89 | def to_list(x, chunk_size = 8):
90 | return [ to_int(x[i:i+chunk_size]) for i in range(0, len(x), chunk_size) ]
91 |
92 |
93 | def to_int(x):
94 |
95 | a = "".join(reversed(x)).encode("HEX")
96 | if len(a) % 2:
97 | a = "0" + a
98 |
99 | return int(a, 16)
100 |
101 |
102 | def update_chunk(c):
103 |
104 | next_chunk = dbg_read_memory(c.address, 6 * int_size)
105 |
106 | if next_chunk:
107 | c = chunk(*(to_list(next_chunk) + [c.address]))
108 | c.data = dbg_read_memory(c.address + 2 * int_size, min(c.size, 0x500)).encode("HEX")
109 |
110 | if c.data:
111 | c.data = " ".join(c.data[i:i + 2] for i in range(0, len(c.data), 2))
112 | else:
113 | c.data = ""
114 |
115 | return c
116 |
117 |
118 | def fill_field(malloc_state, field, mem, current, list=False):
119 |
120 | field_size = getattr(malloc_state,field).size
121 |
122 | if list:
123 | var_size = getattr(malloc_state,field).val.pop()
124 | setattr(malloc_state, field, to_list(mem[current:int(current + int_size * var_size * field_size)], int(int_size*var_size)))
125 | else:
126 | var_size = 1
127 | setattr(malloc_state, field, to_int(mem[current:int(current + int_size * field_size)]))
128 |
129 | current += int(int_size * field_size * var_size)
130 |
131 | return current
132 |
133 |
134 | def get_malloc_state():
135 |
136 | main_arena = malloc_state(main_arena_addr)
137 |
138 | print main_arena
139 |
140 | mem = dbg_read_memory(main_arena.address, 2200)
141 | current = 0
142 | fields = ["mutex", "flags", "fastbinsY", "top", "last_remainder", "bins",
143 | "binmap", "next", "next_free", "attached_threads", "system_mem", "max_system_mem"]
144 |
145 | for field in fields:
146 | current = fill_field(main_arena, field, mem, current,
147 | True if isinstance(getattr(main_arena, field).val, list) else False)
148 |
149 | main_arena.fastbinsY = [[item] for item in main_arena.fastbinsY]
150 | main_arena.bins = [[item] for item in main_arena.bins]
151 | form.listWidget.clear()
152 | form.listWidget_3.clear()
153 |
154 | for n, bin in enumerate(main_arena.fastbinsY):
155 | if bin and bin[0]:
156 | get_chunks(bin, main_arena.address)
157 | if bin:
158 | name = "Fastbin %s" % hex(n)
159 | form.listWidget.addItem(name)
160 | binmap[name] = bin
161 | elif bin:
162 | bin.pop()
163 |
164 | for n, bin in enumerate(main_arena.bins):
165 | if bin and not (main_arena.address < bin[0] < main_arena.address + 2200):
166 | get_chunks(bin, main_arena.address)
167 | if bin:
168 | name = "Bin %s" % hex(n)
169 | form.listWidget_3.addItem(name)
170 | binmap[name] = bin
171 | elif bin:
172 | bin.pop()
173 |
174 |
175 | def get_chunks(bin, state_addr):
176 |
177 | next_chunk = True
178 | chunks = []
179 | addr = bin.pop()
180 |
181 | while next_chunk:
182 | next_chunk = dbg_read_memory(addr, 6 * int_size)
183 |
184 | if next_chunk:
185 | c = chunk(*(to_list(next_chunk) + [addr]))
186 | bin.append(c)
187 | chunks.append(c.fd)
188 | c.data = dbg_read_memory(addr + 2 * int_size, min(c.size, 0x500)).encode("HEX")
189 | c.data = " ".join(c.data[i:i+2] for i in range(0, len(c.data), 2))
190 | if state_addr < c.fd < state_addr + 2200:
191 | break
192 |
193 | addr = c.fd
194 | else:
195 | break
196 |
197 |
198 | def get_main_arena():
199 |
200 | global base_addr
201 |
202 | for addr in Segments():
203 | if findall("libc_.*\.so",SegName(addr)):
204 | seg = getseg(addr)
205 |
206 | if seg.perm | SEGPERM_EXEC == seg.perm:
207 | return addr
208 |
209 |
210 | def select_bin(item):
211 |
212 | global chunkmap
213 |
214 | form.listWidget_2.clear()
215 | for chunk in binmap[item.text()]:
216 | form.listWidget_2.addItem(hex(chunk.address))
217 | chunkmap[hex(chunk.address).replace("L", "")] = chunk
218 |
219 |
220 | def select_chunk(item, chunkmap):
221 |
222 | chunk = chunkmap[item.text()] = update_chunk(chunkmap[item.text()])
223 | form.textEdit.clear()
224 | form.textEdit.insertHtml("" + "" + chunk.data + "
") 225 | 226 | string = (chunk_template) % ( 227 | to_hex(chunk.address), 228 | to_hex(chunk.prev_size), 229 | to_hex(chunk.size), 230 | to_hex(chunk.fd), 231 | to_hex(chunk.bk), 232 | to_hex(chunk.fd_nextsize), 233 | to_hex(chunk.bk_nextsize), 234 | "True" if chunk.prev_in_use else "False", 235 | "True" if chunk.is_mmapped else "False" 236 | ) 237 | 238 | form.textEdit_2.clear() 239 | form.textEdit_2.insertHtml(string) 240 | 241 | 242 | def set_config(restart): 243 | 244 | global b 245 | 246 | b = QtWidgets.QWidget() 247 | form = Set_Offset_UI() 248 | form.setupUi(b) 249 | b.show() 250 | 251 | form.pushButton.clicked.connect(lambda: get_text(form, restart)) 252 | 253 | 254 | def get_text(form, restart): 255 | 256 | global malloc_offset 257 | global main_arena_offset 258 | 259 | offsets = [form.lineEdit.text(), form.lineEdit_2.text(), form.lineEdit_3.text(), form.lineEdit_4.text()] 260 | 261 | for x in range(4): 262 | if offsets[x][:2] == "0x": 263 | offsets[x] = int(offsets[x][2:], 16) 264 | else: 265 | offsets[x] = int(offsets[x]) 266 | 267 | config["libc_offsets"] = offsets 268 | main_arena_offset, malloc_offset = offsets[:2] if int_size == 8 else offsets[2:] 269 | b.close() 270 | save_config() 271 | 272 | if restart: 273 | ea_heap() 274 | 275 | 276 | def ea_heap(): 277 | 278 | global form 279 | global a 280 | global item_no 281 | global hook 282 | global main_arena_addr 283 | global malloc_addr 284 | 285 | if "ELF" not in get_file_type_name(): 286 | ea_warning("Executable must be ELF fomat (glibc)") 287 | 288 | else: 289 | if main_arena_offset == 0 and malloc_offset == 0: 290 | set_config(True) 291 | else: 292 | if not is_debugger_on(): 293 | ea_warning("Application must be running") 294 | else: 295 | base_addr = get_main_arena() 296 | 297 | if not base_addr: 298 | ea_warning("Could not find C Library in Segments") 299 | 300 | else: 301 | malloc_addr = find_ins("ret", base_addr + malloc_offset) 302 | main_arena_addr = base_addr + main_arena_offset 303 | 304 | a = QtWidgets.QWidget() 305 | form = Heap_UI() 306 | form.setupUi(a) 307 | form.textEdit.setReadOnly(True) 308 | form.textEdit_2.setReadOnly(True) 309 | a.show() 310 | hook = Hook() 311 | hook.hook() 312 | a.closeEvent = lambda x: hook.unhook() 313 | form.listWidget.itemClicked.connect(select_bin) 314 | form.listWidget_3.itemClicked.connect(select_bin) 315 | form.listWidget_2.itemClicked.connect(lambda x: select_chunk(x, chunkmap)) 316 | form.listWidget_4.itemClicked.connect(lambda x: select_chunk(x, chunkmap_2)) 317 | form.pushButton_2.clicked.connect(lambda :set_config(False)) 318 | form.pushButton.clicked.connect(get_malloc_state) 319 | 320 | form.checkBox.stateChanged.connect(lambda x: ( 321 | add_bp(malloc_addr, 10), hook.hook()) if x else (add_bp(malloc_addr, 2), hook.unhook())) 322 | 323 | get_malloc_state() 324 | 325 | 326 | chunk_template = read(root_dir + "chunk_template.html") 327 | int_size = 4 if get_bits() else 8 328 | 329 | main_arena_offset, malloc_offset = config["libc_offsets"][:2] if int_size == 4 else config["libc_offsets"][2:] 330 | 331 | chunkmap = {} 332 | chunkmap_2 = {} 333 | binmap = {} 334 | 335 | form = None 336 | a = None 337 | b = None 338 | hook = None 339 | base_addr = None 340 | main_arena_addr = None 341 | malloc_addr = None 342 | -------------------------------------------------------------------------------- /ui/restyle.ui: -------------------------------------------------------------------------------- 1 | 2 |Run the script "get_offsets.py" (located in the plugin main directory) on the linux system you are debugging and enter the offsets provided, this is only required once.
", None)) 221 | self.label_6.setText(QtWidgets.QApplication.translate("Form", "32-bit Offsets:", None)) 222 | self.label.setText(QtWidgets.QApplication.translate("Form", "main_arena offset", None)) 223 | self.label_2.setText(QtWidgets.QApplication.translate("Form", "malloc offset", None)) 224 | self.label_5.setText(QtWidgets.QApplication.translate("Form", "64-bit Offsets:", None)) 225 | self.label_4.setText(QtWidgets.QApplication.translate("Form", "main_arena offset", None)) 226 | self.label_3.setText(QtWidgets.QApplication.translate("Form", "malloc offset", None)) 227 | self.pushButton.setText(QtWidgets.QApplication.translate("Form", "OK", None)) 228 | 229 | 230 | class Heap_UI(object): 231 | def setupUi(self, Form): 232 | Form.setObjectName("Form") 233 | Form.resize(970, 551) 234 | Form.setMaximumSize(QtCore.QSize(16777215, 16777215)) 235 | self.gridLayout = QtWidgets.QGridLayout(Form) 236 | self.gridLayout.setObjectName("gridLayout") 237 | self.verticalLayout_3 = QtWidgets.QVBoxLayout() 238 | self.verticalLayout_3.setObjectName("verticalLayout_3") 239 | self.horizontalLayout = QtWidgets.QHBoxLayout() 240 | self.horizontalLayout.setObjectName("horizontalLayout") 241 | self.label_3 = QtWidgets.QLabel(Form) 242 | self.label_3.setObjectName("label_3") 243 | self.horizontalLayout.addWidget(self.label_3) 244 | self.checkBox = QtWidgets.QCheckBox(Form) 245 | self.checkBox.setObjectName("checkBox") 246 | self.horizontalLayout.addWidget(self.checkBox) 247 | self.verticalLayout_3.addLayout(self.horizontalLayout) 248 | self.listWidget_4 = QtWidgets.QListWidget(Form) 249 | self.listWidget_4.setObjectName("listWidget_4") 250 | self.verticalLayout_3.addWidget(self.listWidget_4) 251 | self.label_9 = QtWidgets.QLabel(Form) 252 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) 253 | sizePolicy.setHorizontalStretch(0) 254 | sizePolicy.setVerticalStretch(0) 255 | sizePolicy.setHeightForWidth(self.label_9.sizePolicy().hasHeightForWidth()) 256 | self.label_9.setSizePolicy(sizePolicy) 257 | self.label_9.setMaximumSize(QtCore.QSize(200, 16777215)) 258 | self.label_9.setObjectName("label_9") 259 | self.verticalLayout_3.addWidget(self.label_9) 260 | self.listWidget_3 = QtWidgets.QListWidget(Form) 261 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) 262 | sizePolicy.setHorizontalStretch(0) 263 | sizePolicy.setVerticalStretch(0) 264 | sizePolicy.setHeightForWidth(self.listWidget_3.sizePolicy().hasHeightForWidth()) 265 | self.listWidget_3.setSizePolicy(sizePolicy) 266 | self.listWidget_3.setMinimumSize(QtCore.QSize(0, 0)) 267 | self.listWidget_3.setMaximumSize(QtCore.QSize(16777215, 16777215)) 268 | self.listWidget_3.setObjectName("listWidget_3") 269 | self.verticalLayout_3.addWidget(self.listWidget_3) 270 | self.label_7 = QtWidgets.QLabel(Form) 271 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) 272 | sizePolicy.setHorizontalStretch(0) 273 | sizePolicy.setVerticalStretch(0) 274 | sizePolicy.setHeightForWidth(self.label_7.sizePolicy().hasHeightForWidth()) 275 | self.label_7.setSizePolicy(sizePolicy) 276 | self.label_7.setMaximumSize(QtCore.QSize(200, 16777215)) 277 | self.label_7.setObjectName("label_7") 278 | self.verticalLayout_3.addWidget(self.label_7) 279 | self.listWidget = QtWidgets.QListWidget(Form) 280 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) 281 | sizePolicy.setHorizontalStretch(0) 282 | sizePolicy.setVerticalStretch(0) 283 | sizePolicy.setHeightForWidth(self.listWidget.sizePolicy().hasHeightForWidth()) 284 | self.listWidget.setSizePolicy(sizePolicy) 285 | self.listWidget.setMinimumSize(QtCore.QSize(0, 0)) 286 | self.listWidget.setMaximumSize(QtCore.QSize(16777215, 16777215)) 287 | self.listWidget.setObjectName("listWidget") 288 | self.verticalLayout_3.addWidget(self.listWidget) 289 | self.label_8 = QtWidgets.QLabel(Form) 290 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) 291 | sizePolicy.setHorizontalStretch(0) 292 | sizePolicy.setVerticalStretch(0) 293 | sizePolicy.setHeightForWidth(self.label_8.sizePolicy().hasHeightForWidth()) 294 | self.label_8.setSizePolicy(sizePolicy) 295 | self.label_8.setMaximumSize(QtCore.QSize(200, 16777215)) 296 | self.label_8.setObjectName("label_8") 297 | self.verticalLayout_3.addWidget(self.label_8) 298 | self.listWidget_2 = QtWidgets.QListWidget(Form) 299 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) 300 | sizePolicy.setHorizontalStretch(0) 301 | sizePolicy.setVerticalStretch(0) 302 | sizePolicy.setHeightForWidth(self.listWidget_2.sizePolicy().hasHeightForWidth()) 303 | self.listWidget_2.setSizePolicy(sizePolicy) 304 | self.listWidget_2.setMinimumSize(QtCore.QSize(0, 0)) 305 | self.listWidget_2.setMaximumSize(QtCore.QSize(16777215, 16777215)) 306 | self.listWidget_2.setObjectName("listWidget_2") 307 | self.verticalLayout_3.addWidget(self.listWidget_2) 308 | self.horizontalLayout_3 = QtWidgets.QHBoxLayout() 309 | self.horizontalLayout_3.setObjectName("horizontalLayout_3") 310 | self.pushButton_2 = QtWidgets.QPushButton(Form) 311 | self.pushButton_2.setObjectName("pushButton_2") 312 | self.horizontalLayout_3.addWidget(self.pushButton_2) 313 | self.pushButton = QtWidgets.QPushButton(Form) 314 | self.pushButton.setObjectName("pushButton") 315 | self.horizontalLayout_3.addWidget(self.pushButton) 316 | self.verticalLayout_3.addLayout(self.horizontalLayout_3) 317 | self.gridLayout.addLayout(self.verticalLayout_3, 0, 0, 1, 1) 318 | self.line = QtWidgets.QFrame(Form) 319 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) 320 | sizePolicy.setHorizontalStretch(0) 321 | sizePolicy.setVerticalStretch(0) 322 | sizePolicy.setHeightForWidth(self.line.sizePolicy().hasHeightForWidth()) 323 | self.line.setSizePolicy(sizePolicy) 324 | self.line.setMaximumSize(QtCore.QSize(10, 16777215)) 325 | self.line.setFrameShape(QtWidgets.QFrame.VLine) 326 | self.line.setFrameShadow(QtWidgets.QFrame.Sunken) 327 | self.line.setObjectName("line") 328 | self.gridLayout.addWidget(self.line, 0, 1, 1, 1) 329 | self.splitter = QtWidgets.QSplitter(Form) 330 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) 331 | sizePolicy.setHorizontalStretch(1) 332 | sizePolicy.setVerticalStretch(1) 333 | sizePolicy.setHeightForWidth(self.splitter.sizePolicy().hasHeightForWidth()) 334 | self.splitter.setSizePolicy(sizePolicy) 335 | self.splitter.setMinimumSize(QtCore.QSize(0, 0)) 336 | self.splitter.setOrientation(QtCore.Qt.Vertical) 337 | self.splitter.setObjectName("splitter") 338 | self.layoutWidget = QtWidgets.QWidget(self.splitter) 339 | self.layoutWidget.setObjectName("layoutWidget") 340 | self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.layoutWidget) 341 | self.verticalLayout_2.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint) 342 | self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) 343 | self.verticalLayout_2.setObjectName("verticalLayout_2") 344 | self.label = QtWidgets.QLabel(self.layoutWidget) 345 | self.label.setObjectName("label") 346 | self.verticalLayout_2.addWidget(self.label) 347 | self.textEdit = QtWidgets.QTextEdit(self.layoutWidget) 348 | self.textEdit.setObjectName("textEdit") 349 | self.verticalLayout_2.addWidget(self.textEdit) 350 | self.layoutWidget1 = QtWidgets.QWidget(self.splitter) 351 | self.layoutWidget1.setObjectName("layoutWidget1") 352 | self.verticalLayout = QtWidgets.QVBoxLayout(self.layoutWidget1) 353 | self.verticalLayout.setContentsMargins(0, 0, 0, 0) 354 | self.verticalLayout.setObjectName("verticalLayout") 355 | self.label_2 = QtWidgets.QLabel(self.layoutWidget1) 356 | self.label_2.setObjectName("label_2") 357 | self.verticalLayout.addWidget(self.label_2) 358 | self.textEdit_2 = QtWidgets.QTextEdit(self.layoutWidget1) 359 | self.textEdit_2.setObjectName("textEdit_2") 360 | self.verticalLayout.addWidget(self.textEdit_2) 361 | self.gridLayout.addWidget(self.splitter, 0, 2, 1, 1) 362 | 363 | self.retranslateUi(Form) 364 | QtCore.QMetaObject.connectSlotsByName(Form) 365 | 366 | def retranslateUi(self, Form): 367 | Form.setWindowTitle(QtWidgets.QApplication.translate("Form", "EA Heap", None)) 368 | self.label_3.setText(QtWidgets.QApplication.translate("Form", "In Use Chunks", None)) 369 | self.checkBox.setText(QtWidgets.QApplication.translate("Form", "Enable Malloc Trace", None)) 370 | self.label_9.setText(QtWidgets.QApplication.translate("Form", "Bins", None)) 371 | self.label_7.setText(QtWidgets.QApplication.translate("Form", "Fastbins", None)) 372 | self.label_8.setText(QtWidgets.QApplication.translate("Form", "Bin Chunks", None)) 373 | self.pushButton_2.setText(QtWidgets.QApplication.translate("Form", "Set Offsets", None)) 374 | self.pushButton.setText(QtWidgets.QApplication.translate("Form", "Refresh", None)) 375 | self.label.setText(QtWidgets.QApplication.translate("Form", "HexDump", None)) 376 | self.label_2.setText(QtWidgets.QApplication.translate("Form", "Chunk Info", None)) 377 | 378 | 379 | class Reskin_UI(object): 380 | def setupUi(self, Form): 381 | Form.setObjectName("Form") 382 | Form.resize(395, 548) 383 | self.verticalLayout = QtWidgets.QVBoxLayout(Form) 384 | self.verticalLayout.setObjectName("verticalLayout") 385 | self.horizontalLayout_10 = QtWidgets.QHBoxLayout() 386 | self.horizontalLayout_10.setObjectName("horizontalLayout_10") 387 | self.comboBox = QtWidgets.QComboBox(Form) 388 | self.comboBox.setObjectName("comboBox") 389 | self.horizontalLayout_10.addWidget(self.comboBox) 390 | self.horizontalLayout_12 = QtWidgets.QHBoxLayout() 391 | self.horizontalLayout_12.setObjectName("horizontalLayout_12") 392 | self.pushButton_18 = QtWidgets.QPushButton(Form) 393 | self.pushButton_18.setObjectName("pushButton_18") 394 | self.horizontalLayout_12.addWidget(self.pushButton_18) 395 | self.pushButton_19 = QtWidgets.QPushButton(Form) 396 | self.pushButton_19.setObjectName("pushButton_19") 397 | self.horizontalLayout_12.addWidget(self.pushButton_19) 398 | self.checkBox = QtWidgets.QCheckBox(Form) 399 | self.checkBox.setObjectName("checkBox") 400 | self.horizontalLayout_12.addWidget(self.checkBox) 401 | self.horizontalLayout_10.addLayout(self.horizontalLayout_12) 402 | self.verticalLayout.addLayout(self.horizontalLayout_10) 403 | self.label = QtWidgets.QLabel(Form) 404 | self.label.setObjectName("label") 405 | self.verticalLayout.addWidget(self.label) 406 | self.horizontalLayout = QtWidgets.QHBoxLayout() 407 | self.horizontalLayout.setObjectName("horizontalLayout") 408 | self.pushButton = QtWidgets.QPushButton(Form) 409 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) 410 | sizePolicy.setHorizontalStretch(0) 411 | sizePolicy.setVerticalStretch(0) 412 | sizePolicy.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth()) 413 | self.pushButton.setSizePolicy(sizePolicy) 414 | self.pushButton.setMinimumSize(QtCore.QSize(0, 0)) 415 | self.pushButton.setText("") 416 | self.pushButton.setObjectName("pushButton") 417 | self.horizontalLayout.addWidget(self.pushButton) 418 | self.pushButton_2 = QtWidgets.QPushButton(Form) 419 | self.pushButton_2.setEnabled(True) 420 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) 421 | sizePolicy.setHorizontalStretch(0) 422 | sizePolicy.setVerticalStretch(0) 423 | sizePolicy.setHeightForWidth(self.pushButton_2.sizePolicy().hasHeightForWidth()) 424 | self.pushButton_2.setSizePolicy(sizePolicy) 425 | self.pushButton_2.setObjectName("pushButton_2") 426 | self.horizontalLayout.addWidget(self.pushButton_2) 427 | self.verticalLayout.addLayout(self.horizontalLayout) 428 | self.horizontalLayout_14 = QtWidgets.QHBoxLayout() 429 | self.horizontalLayout_14.setObjectName("horizontalLayout_14") 430 | self.pushButton_23 = QtWidgets.QPushButton(Form) 431 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) 432 | sizePolicy.setHorizontalStretch(0) 433 | sizePolicy.setVerticalStretch(0) 434 | sizePolicy.setHeightForWidth(self.pushButton_23.sizePolicy().hasHeightForWidth()) 435 | self.pushButton_23.setSizePolicy(sizePolicy) 436 | self.pushButton_23.setMinimumSize(QtCore.QSize(0, 0)) 437 | self.pushButton_23.setText("") 438 | self.pushButton_23.setObjectName("pushButton_23") 439 | self.horizontalLayout_14.addWidget(self.pushButton_23) 440 | self.pushButton_24 = QtWidgets.QPushButton(Form) 441 | self.pushButton_24.setEnabled(True) 442 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) 443 | sizePolicy.setHorizontalStretch(0) 444 | sizePolicy.setVerticalStretch(0) 445 | sizePolicy.setHeightForWidth(self.pushButton_24.sizePolicy().hasHeightForWidth()) 446 | self.pushButton_24.setSizePolicy(sizePolicy) 447 | self.pushButton_24.setObjectName("pushButton_24") 448 | self.horizontalLayout_14.addWidget(self.pushButton_24) 449 | self.verticalLayout.addLayout(self.horizontalLayout_14) 450 | self.horizontalLayout_15 = QtWidgets.QHBoxLayout() 451 | self.horizontalLayout_15.setObjectName("horizontalLayout_15") 452 | self.pushButton_25 = QtWidgets.QPushButton(Form) 453 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) 454 | sizePolicy.setHorizontalStretch(0) 455 | sizePolicy.setVerticalStretch(0) 456 | sizePolicy.setHeightForWidth(self.pushButton_25.sizePolicy().hasHeightForWidth()) 457 | self.pushButton_25.setSizePolicy(sizePolicy) 458 | self.pushButton_25.setMinimumSize(QtCore.QSize(0, 0)) 459 | self.pushButton_25.setText("") 460 | self.pushButton_25.setObjectName("pushButton_25") 461 | self.horizontalLayout_15.addWidget(self.pushButton_25) 462 | self.pushButton_26 = QtWidgets.QPushButton(Form) 463 | self.pushButton_26.setEnabled(True) 464 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) 465 | sizePolicy.setHorizontalStretch(0) 466 | sizePolicy.setVerticalStretch(0) 467 | sizePolicy.setHeightForWidth(self.pushButton_26.sizePolicy().hasHeightForWidth()) 468 | self.pushButton_26.setSizePolicy(sizePolicy) 469 | self.pushButton_26.setObjectName("pushButton_26") 470 | self.horizontalLayout_15.addWidget(self.pushButton_26) 471 | self.verticalLayout.addLayout(self.horizontalLayout_15) 472 | self.horizontalLayout_5 = QtWidgets.QHBoxLayout() 473 | self.horizontalLayout_5.setObjectName("horizontalLayout_5") 474 | self.pushButton_9 = QtWidgets.QPushButton(Form) 475 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) 476 | sizePolicy.setHorizontalStretch(0) 477 | sizePolicy.setVerticalStretch(0) 478 | sizePolicy.setHeightForWidth(self.pushButton_9.sizePolicy().hasHeightForWidth()) 479 | self.pushButton_9.setSizePolicy(sizePolicy) 480 | self.pushButton_9.setMinimumSize(QtCore.QSize(0, 0)) 481 | self.pushButton_9.setText("") 482 | self.pushButton_9.setObjectName("pushButton_9") 483 | self.horizontalLayout_5.addWidget(self.pushButton_9) 484 | self.pushButton_10 = QtWidgets.QPushButton(Form) 485 | self.pushButton_10.setEnabled(True) 486 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) 487 | sizePolicy.setHorizontalStretch(0) 488 | sizePolicy.setVerticalStretch(0) 489 | sizePolicy.setHeightForWidth(self.pushButton_10.sizePolicy().hasHeightForWidth()) 490 | self.pushButton_10.setSizePolicy(sizePolicy) 491 | self.pushButton_10.setObjectName("pushButton_10") 492 | self.horizontalLayout_5.addWidget(self.pushButton_10) 493 | self.verticalLayout.addLayout(self.horizontalLayout_5) 494 | self.horizontalLayout_7 = QtWidgets.QHBoxLayout() 495 | self.horizontalLayout_7.setObjectName("horizontalLayout_7") 496 | self.pushButton_13 = QtWidgets.QPushButton(Form) 497 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) 498 | sizePolicy.setHorizontalStretch(0) 499 | sizePolicy.setVerticalStretch(0) 500 | sizePolicy.setHeightForWidth(self.pushButton_13.sizePolicy().hasHeightForWidth()) 501 | self.pushButton_13.setSizePolicy(sizePolicy) 502 | self.pushButton_13.setMinimumSize(QtCore.QSize(0, 0)) 503 | self.pushButton_13.setText("") 504 | self.pushButton_13.setObjectName("pushButton_13") 505 | self.horizontalLayout_7.addWidget(self.pushButton_13) 506 | self.pushButton_14 = QtWidgets.QPushButton(Form) 507 | self.pushButton_14.setEnabled(True) 508 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) 509 | sizePolicy.setHorizontalStretch(0) 510 | sizePolicy.setVerticalStretch(0) 511 | sizePolicy.setHeightForWidth(self.pushButton_14.sizePolicy().hasHeightForWidth()) 512 | self.pushButton_14.setSizePolicy(sizePolicy) 513 | self.pushButton_14.setObjectName("pushButton_14") 514 | self.horizontalLayout_7.addWidget(self.pushButton_14) 515 | self.verticalLayout.addLayout(self.horizontalLayout_7) 516 | self.horizontalLayout_16 = QtWidgets.QHBoxLayout() 517 | self.horizontalLayout_16.setObjectName("horizontalLayout_16") 518 | self.pushButton_27 = QtWidgets.QPushButton(Form) 519 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) 520 | sizePolicy.setHorizontalStretch(0) 521 | sizePolicy.setVerticalStretch(0) 522 | sizePolicy.setHeightForWidth(self.pushButton_27.sizePolicy().hasHeightForWidth()) 523 | self.pushButton_27.setSizePolicy(sizePolicy) 524 | self.pushButton_27.setMinimumSize(QtCore.QSize(0, 0)) 525 | self.pushButton_27.setText("") 526 | self.pushButton_27.setObjectName("pushButton_27") 527 | self.horizontalLayout_16.addWidget(self.pushButton_27) 528 | self.pushButton_28 = QtWidgets.QPushButton(Form) 529 | self.pushButton_28.setEnabled(True) 530 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) 531 | sizePolicy.setHorizontalStretch(0) 532 | sizePolicy.setVerticalStretch(0) 533 | sizePolicy.setHeightForWidth(self.pushButton_28.sizePolicy().hasHeightForWidth()) 534 | self.pushButton_28.setSizePolicy(sizePolicy) 535 | self.pushButton_28.setObjectName("pushButton_28") 536 | self.horizontalLayout_16.addWidget(self.pushButton_28) 537 | self.verticalLayout.addLayout(self.horizontalLayout_16) 538 | self.horizontalLayout_13 = QtWidgets.QHBoxLayout() 539 | self.horizontalLayout_13.setObjectName("horizontalLayout_13") 540 | self.pushButton_21 = QtWidgets.QPushButton(Form) 541 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) 542 | sizePolicy.setHorizontalStretch(0) 543 | sizePolicy.setVerticalStretch(0) 544 | sizePolicy.setHeightForWidth(self.pushButton_21.sizePolicy().hasHeightForWidth()) 545 | self.pushButton_21.setSizePolicy(sizePolicy) 546 | self.pushButton_21.setMinimumSize(QtCore.QSize(0, 0)) 547 | self.pushButton_21.setText("") 548 | self.pushButton_21.setObjectName("pushButton_21") 549 | self.horizontalLayout_13.addWidget(self.pushButton_21) 550 | self.pushButton_22 = QtWidgets.QPushButton(Form) 551 | self.pushButton_22.setEnabled(True) 552 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) 553 | sizePolicy.setHorizontalStretch(0) 554 | sizePolicy.setVerticalStretch(0) 555 | sizePolicy.setHeightForWidth(self.pushButton_22.sizePolicy().hasHeightForWidth()) 556 | self.pushButton_22.setSizePolicy(sizePolicy) 557 | self.pushButton_22.setObjectName("pushButton_22") 558 | self.horizontalLayout_13.addWidget(self.pushButton_22) 559 | self.verticalLayout.addLayout(self.horizontalLayout_13) 560 | self.horizontalLayout_8 = QtWidgets.QHBoxLayout() 561 | self.horizontalLayout_8.setObjectName("horizontalLayout_8") 562 | self.pushButton_15 = QtWidgets.QPushButton(Form) 563 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) 564 | sizePolicy.setHorizontalStretch(0) 565 | sizePolicy.setVerticalStretch(0) 566 | sizePolicy.setHeightForWidth(self.pushButton_15.sizePolicy().hasHeightForWidth()) 567 | self.pushButton_15.setSizePolicy(sizePolicy) 568 | self.pushButton_15.setMinimumSize(QtCore.QSize(0, 0)) 569 | self.pushButton_15.setText("") 570 | self.pushButton_15.setObjectName("pushButton_15") 571 | self.horizontalLayout_8.addWidget(self.pushButton_15) 572 | self.pushButton_16 = QtWidgets.QPushButton(Form) 573 | self.pushButton_16.setEnabled(True) 574 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) 575 | sizePolicy.setHorizontalStretch(0) 576 | sizePolicy.setVerticalStretch(0) 577 | sizePolicy.setHeightForWidth(self.pushButton_16.sizePolicy().hasHeightForWidth()) 578 | self.pushButton_16.setSizePolicy(sizePolicy) 579 | self.pushButton_16.setObjectName("pushButton_16") 580 | self.horizontalLayout_8.addWidget(self.pushButton_16) 581 | self.verticalLayout.addLayout(self.horizontalLayout_8) 582 | self.horizontalLayout_6 = QtWidgets.QHBoxLayout() 583 | self.horizontalLayout_6.setObjectName("horizontalLayout_6") 584 | self.pushButton_11 = QtWidgets.QPushButton(Form) 585 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) 586 | sizePolicy.setHorizontalStretch(0) 587 | sizePolicy.setVerticalStretch(0) 588 | sizePolicy.setHeightForWidth(self.pushButton_11.sizePolicy().hasHeightForWidth()) 589 | self.pushButton_11.setSizePolicy(sizePolicy) 590 | self.pushButton_11.setMinimumSize(QtCore.QSize(0, 0)) 591 | self.pushButton_11.setText("") 592 | self.pushButton_11.setObjectName("pushButton_11") 593 | self.horizontalLayout_6.addWidget(self.pushButton_11) 594 | self.pushButton_12 = QtWidgets.QPushButton(Form) 595 | self.pushButton_12.setEnabled(True) 596 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) 597 | sizePolicy.setHorizontalStretch(0) 598 | sizePolicy.setVerticalStretch(0) 599 | sizePolicy.setHeightForWidth(self.pushButton_12.sizePolicy().hasHeightForWidth()) 600 | self.pushButton_12.setSizePolicy(sizePolicy) 601 | self.pushButton_12.setObjectName("pushButton_12") 602 | self.horizontalLayout_6.addWidget(self.pushButton_12) 603 | self.verticalLayout.addLayout(self.horizontalLayout_6) 604 | self.label_2 = QtWidgets.QLabel(Form) 605 | self.label_2.setObjectName("label_2") 606 | self.verticalLayout.addWidget(self.label_2) 607 | self.horizontalLayout_23 = QtWidgets.QHBoxLayout() 608 | self.horizontalLayout_23.setObjectName("horizontalLayout_23") 609 | self.pushButton_43 = QtWidgets.QPushButton(Form) 610 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) 611 | sizePolicy.setHorizontalStretch(0) 612 | sizePolicy.setVerticalStretch(0) 613 | sizePolicy.setHeightForWidth(self.pushButton_43.sizePolicy().hasHeightForWidth()) 614 | self.pushButton_43.setSizePolicy(sizePolicy) 615 | self.pushButton_43.setMinimumSize(QtCore.QSize(0, 0)) 616 | self.pushButton_43.setText("") 617 | self.pushButton_43.setObjectName("pushButton_43") 618 | self.horizontalLayout_23.addWidget(self.pushButton_43) 619 | self.checkBox_2 = QtWidgets.QCheckBox(Form) 620 | self.checkBox_2.setObjectName("checkBox_2") 621 | self.horizontalLayout_23.addWidget(self.checkBox_2) 622 | self.pushButton_44 = QtWidgets.QPushButton(Form) 623 | self.pushButton_44.setEnabled(True) 624 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) 625 | sizePolicy.setHorizontalStretch(0) 626 | sizePolicy.setVerticalStretch(0) 627 | sizePolicy.setHeightForWidth(self.pushButton_44.sizePolicy().hasHeightForWidth()) 628 | self.pushButton_44.setSizePolicy(sizePolicy) 629 | self.pushButton_44.setObjectName("pushButton_44") 630 | self.horizontalLayout_23.addWidget(self.pushButton_44) 631 | self.verticalLayout.addLayout(self.horizontalLayout_23) 632 | self.horizontalLayout_2 = QtWidgets.QHBoxLayout() 633 | self.horizontalLayout_2.setObjectName("horizontalLayout_2") 634 | self.pushButton_3 = QtWidgets.QPushButton(Form) 635 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) 636 | sizePolicy.setHorizontalStretch(0) 637 | sizePolicy.setVerticalStretch(0) 638 | sizePolicy.setHeightForWidth(self.pushButton_3.sizePolicy().hasHeightForWidth()) 639 | self.pushButton_3.setSizePolicy(sizePolicy) 640 | self.pushButton_3.setMinimumSize(QtCore.QSize(0, 0)) 641 | self.pushButton_3.setText("") 642 | self.pushButton_3.setObjectName("pushButton_3") 643 | self.horizontalLayout_2.addWidget(self.pushButton_3) 644 | self.pushButton_4 = QtWidgets.QPushButton(Form) 645 | self.pushButton_4.setEnabled(True) 646 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) 647 | sizePolicy.setHorizontalStretch(0) 648 | sizePolicy.setVerticalStretch(0) 649 | sizePolicy.setHeightForWidth(self.pushButton_4.sizePolicy().hasHeightForWidth()) 650 | self.pushButton_4.setSizePolicy(sizePolicy) 651 | self.pushButton_4.setObjectName("pushButton_4") 652 | self.horizontalLayout_2.addWidget(self.pushButton_4) 653 | self.verticalLayout.addLayout(self.horizontalLayout_2) 654 | self.horizontalLayout_18 = QtWidgets.QHBoxLayout() 655 | self.horizontalLayout_18.setObjectName("horizontalLayout_18") 656 | self.pushButton_31 = QtWidgets.QPushButton(Form) 657 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) 658 | sizePolicy.setHorizontalStretch(0) 659 | sizePolicy.setVerticalStretch(0) 660 | sizePolicy.setHeightForWidth(self.pushButton_31.sizePolicy().hasHeightForWidth()) 661 | self.pushButton_31.setSizePolicy(sizePolicy) 662 | self.pushButton_31.setMinimumSize(QtCore.QSize(0, 0)) 663 | self.pushButton_31.setText("") 664 | self.pushButton_31.setObjectName("pushButton_31") 665 | self.horizontalLayout_18.addWidget(self.pushButton_31) 666 | self.pushButton_32 = QtWidgets.QPushButton(Form) 667 | self.pushButton_32.setEnabled(True) 668 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) 669 | sizePolicy.setHorizontalStretch(0) 670 | sizePolicy.setVerticalStretch(0) 671 | sizePolicy.setHeightForWidth(self.pushButton_32.sizePolicy().hasHeightForWidth()) 672 | self.pushButton_32.setSizePolicy(sizePolicy) 673 | self.pushButton_32.setObjectName("pushButton_32") 674 | self.horizontalLayout_18.addWidget(self.pushButton_32) 675 | self.verticalLayout.addLayout(self.horizontalLayout_18) 676 | self.horizontalLayout_17 = QtWidgets.QHBoxLayout() 677 | self.horizontalLayout_17.setObjectName("horizontalLayout_17") 678 | self.pushButton_29 = QtWidgets.QPushButton(Form) 679 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) 680 | sizePolicy.setHorizontalStretch(0) 681 | sizePolicy.setVerticalStretch(0) 682 | sizePolicy.setHeightForWidth(self.pushButton_29.sizePolicy().hasHeightForWidth()) 683 | self.pushButton_29.setSizePolicy(sizePolicy) 684 | self.pushButton_29.setMinimumSize(QtCore.QSize(0, 0)) 685 | self.pushButton_29.setText("") 686 | self.pushButton_29.setObjectName("pushButton_29") 687 | self.horizontalLayout_17.addWidget(self.pushButton_29) 688 | self.pushButton_30 = QtWidgets.QPushButton(Form) 689 | self.pushButton_30.setEnabled(True) 690 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) 691 | sizePolicy.setHorizontalStretch(0) 692 | sizePolicy.setVerticalStretch(0) 693 | sizePolicy.setHeightForWidth(self.pushButton_30.sizePolicy().hasHeightForWidth()) 694 | self.pushButton_30.setSizePolicy(sizePolicy) 695 | self.pushButton_30.setObjectName("pushButton_30") 696 | self.horizontalLayout_17.addWidget(self.pushButton_30) 697 | self.verticalLayout.addLayout(self.horizontalLayout_17) 698 | self.horizontalLayout_9 = QtWidgets.QHBoxLayout() 699 | self.horizontalLayout_9.setObjectName("horizontalLayout_9") 700 | self.pushButton_33 = QtWidgets.QPushButton(Form) 701 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) 702 | sizePolicy.setHorizontalStretch(0) 703 | sizePolicy.setVerticalStretch(0) 704 | sizePolicy.setHeightForWidth(self.pushButton_33.sizePolicy().hasHeightForWidth()) 705 | self.pushButton_33.setSizePolicy(sizePolicy) 706 | self.pushButton_33.setMinimumSize(QtCore.QSize(0, 0)) 707 | self.pushButton_33.setText("") 708 | self.pushButton_33.setObjectName("pushButton_33") 709 | self.horizontalLayout_9.addWidget(self.pushButton_33) 710 | self.pushButton_34 = QtWidgets.QPushButton(Form) 711 | self.pushButton_34.setEnabled(True) 712 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) 713 | sizePolicy.setHorizontalStretch(0) 714 | sizePolicy.setVerticalStretch(0) 715 | sizePolicy.setHeightForWidth(self.pushButton_34.sizePolicy().hasHeightForWidth()) 716 | self.pushButton_34.setSizePolicy(sizePolicy) 717 | self.pushButton_34.setObjectName("pushButton_34") 718 | self.horizontalLayout_9.addWidget(self.pushButton_34) 719 | self.verticalLayout.addLayout(self.horizontalLayout_9) 720 | self.horizontalLayout_11 = QtWidgets.QHBoxLayout() 721 | self.horizontalLayout_11.setObjectName("horizontalLayout_11") 722 | self.pushButton_20 = QtWidgets.QPushButton(Form) 723 | self.pushButton_20.setObjectName("pushButton_20") 724 | self.horizontalLayout_11.addWidget(self.pushButton_20) 725 | self.pushButton_17 = QtWidgets.QPushButton(Form) 726 | self.pushButton_17.setMaximumSize(QtCore.QSize(16777215, 16777215)) 727 | self.pushButton_17.setObjectName("pushButton_17") 728 | self.horizontalLayout_11.addWidget(self.pushButton_17) 729 | self.verticalLayout.addLayout(self.horizontalLayout_11) 730 | 731 | self.retranslateUi(Form) 732 | QtCore.QMetaObject.connectSlotsByName(Form) 733 | 734 | def retranslateUi(self, Form): 735 | Form.setWindowTitle(QtWidgets.QApplication.translate("Form", "EA Reskin", None)) 736 | self.pushButton_18.setText(QtWidgets.QApplication.translate("Form", "Save As", None)) 737 | self.pushButton_19.setText(QtWidgets.QApplication.translate("Form", "Delete", None)) 738 | self.checkBox.setText(QtWidgets.QApplication.translate("Form", "Apply Skin On startup", None)) 739 | self.label.setText(QtWidgets.QApplication.translate("Form", "IDA:", None)) 740 | self.pushButton_2.setText(QtWidgets.QApplication.translate("Form", "Background Color", None)) 741 | self.pushButton_24.setText(QtWidgets.QApplication.translate("Form", "Text Color", None)) 742 | self.pushButton_26.setText(QtWidgets.QApplication.translate("Form", "Handles", None)) 743 | self.pushButton_10.setText(QtWidgets.QApplication.translate("Form", "Button Outline", None)) 744 | self.pushButton_14.setText(QtWidgets.QApplication.translate("Form", "Menu Selected", None)) 745 | self.pushButton_28.setText(QtWidgets.QApplication.translate("Form", "List Headers", None)) 746 | self.pushButton_22.setText(QtWidgets.QApplication.translate("Form", "List Selected", None)) 747 | self.pushButton_16.setText(QtWidgets.QApplication.translate("Form", "Field Hover", None)) 748 | self.pushButton_12.setText(QtWidgets.QApplication.translate("Form", "Tab Selected", None)) 749 | self.label_2.setText(QtWidgets.QApplication.translate("Form", "EA View:", None)) 750 | self.checkBox_2.setText(QtWidgets.QApplication.translate("Form", "Match IDA Background", None)) 751 | self.pushButton_44.setText(QtWidgets.QApplication.translate("Form", "Background Color", None)) 752 | self.pushButton_4.setText(QtWidgets.QApplication.translate("Form", "Executable Memory", None)) 753 | self.pushButton_32.setText(QtWidgets.QApplication.translate("Form", "Readable/Writeable Memory", None)) 754 | self.pushButton_30.setText(QtWidgets.QApplication.translate("Form", "String", None)) 755 | self.pushButton_34.setText(QtWidgets.QApplication.translate("Form", "Null", None)) 756 | self.pushButton_20.setText(QtWidgets.QApplication.translate("Form", "Apply", None)) 757 | self.pushButton_17.setText(QtWidgets.QApplication.translate("Form", "Set Code Colors", None)) 758 | 759 | 760 | 761 | class Name_UI(object): 762 | def setupUi(self, Form): 763 | Form.setObjectName("Form") 764 | Form.resize(400, 69) 765 | self.verticalLayout = QtWidgets.QVBoxLayout(Form) 766 | self.verticalLayout.setObjectName("verticalLayout") 767 | self.horizontalLayout = QtWidgets.QHBoxLayout() 768 | self.horizontalLayout.setObjectName("horizontalLayout") 769 | self.label = QtWidgets.QLabel(Form) 770 | self.label.setObjectName("label") 771 | self.horizontalLayout.addWidget(self.label) 772 | self.lineEdit = QtWidgets.QLineEdit(Form) 773 | self.lineEdit.setObjectName("lineEdit") 774 | self.horizontalLayout.addWidget(self.lineEdit) 775 | self.verticalLayout.addLayout(self.horizontalLayout) 776 | self.pushButton = QtWidgets.QPushButton(Form) 777 | self.pushButton.setObjectName("pushButton") 778 | self.verticalLayout.addWidget(self.pushButton) 779 | 780 | self.retranslateUi(Form) 781 | QtCore.QMetaObject.connectSlotsByName(Form) 782 | 783 | def retranslateUi(self, Form): 784 | Form.setWindowTitle(QtWidgets.QApplication.translate("Form", "Set Name", None)) 785 | self.label.setText(QtWidgets.QApplication.translate("Form", "Name:", None)) 786 | self.pushButton.setText(QtWidgets.QApplication.translate("Form", "Save", None)) 787 | 788 | 789 | 790 | class Cmd_UI(object): 791 | def setupUi(self, Form): 792 | Form.setObjectName("Form") 793 | Form.resize(677, 378) 794 | self.verticalLayout_2 = QtWidgets.QVBoxLayout(Form) 795 | self.verticalLayout_2.setObjectName("verticalLayout_2") 796 | self.textEdit = QtWidgets.QTextEdit(Form) 797 | self.textEdit.setObjectName("textEdit") 798 | self.verticalLayout_2.addWidget(self.textEdit) 799 | self.horizontalLayout_2 = QtWidgets.QHBoxLayout() 800 | self.horizontalLayout_2.setObjectName("horizontalLayout_2") 801 | self.label = QtWidgets.QLabel(Form) 802 | self.label.setObjectName("label") 803 | self.horizontalLayout_2.addWidget(self.label) 804 | self.lineEdit = QtWidgets.QLineEdit(Form) 805 | self.lineEdit.setObjectName("lineEdit") 806 | self.horizontalLayout_2.addWidget(self.lineEdit) 807 | self.pushButton = QtWidgets.QPushButton(Form) 808 | self.pushButton.setObjectName("pushButton") 809 | self.horizontalLayout_2.addWidget(self.pushButton) 810 | self.verticalLayout_2.addLayout(self.horizontalLayout_2) 811 | 812 | self.retranslateUi(Form) 813 | QtCore.QMetaObject.connectSlotsByName(Form) 814 | 815 | def retranslateUi(self, Form): 816 | Form.setWindowTitle(QtWidgets.QApplication.translate("Form", "EA CMD", None)) 817 | self.label.setText(QtWidgets.QApplication.translate("Form", "CMD:", None)) 818 | self.pushButton.setText(QtWidgets.QApplication.translate("Form", "Go!", None)) 819 | 820 | 821 | class Trace_UI(object): 822 | def setupUi(self, Form): 823 | Form.setObjectName("Form") 824 | Form.resize(403, 219) 825 | self.verticalLayout = QtWidgets.QVBoxLayout(Form) 826 | self.verticalLayout.setObjectName("verticalLayout") 827 | self.horizontalLayout_4 = QtWidgets.QHBoxLayout() 828 | self.horizontalLayout_4.setObjectName("horizontalLayout_4") 829 | self.label_4 = QtWidgets.QLabel(Form) 830 | self.label_4.setObjectName("label_4") 831 | self.horizontalLayout_4.addWidget(self.label_4) 832 | self.pushButton_4 = QtWidgets.QPushButton(Form) 833 | self.pushButton_4.setObjectName("pushButton_4") 834 | self.horizontalLayout_4.addWidget(self.pushButton_4) 835 | self.verticalLayout.addLayout(self.horizontalLayout_4) 836 | self.line = QtWidgets.QFrame(Form) 837 | self.line.setFrameShape(QtWidgets.QFrame.HLine) 838 | self.line.setFrameShadow(QtWidgets.QFrame.Sunken) 839 | self.line.setObjectName("line") 840 | self.verticalLayout.addWidget(self.line) 841 | self.label_3 = QtWidgets.QLabel(Form) 842 | self.label_3.setObjectName("label_3") 843 | self.verticalLayout.addWidget(self.label_3) 844 | self.horizontalLayout = QtWidgets.QHBoxLayout() 845 | self.horizontalLayout.setObjectName("horizontalLayout") 846 | self.lineEdit = QtWidgets.QLineEdit(Form) 847 | self.lineEdit.setObjectName("lineEdit") 848 | self.horizontalLayout.addWidget(self.lineEdit) 849 | self.pushButton = QtWidgets.QPushButton(Form) 850 | self.pushButton.setObjectName("pushButton") 851 | self.horizontalLayout.addWidget(self.pushButton) 852 | self.verticalLayout.addLayout(self.horizontalLayout) 853 | self.label_2 = QtWidgets.QLabel(Form) 854 | self.label_2.setObjectName("label_2") 855 | self.verticalLayout.addWidget(self.label_2) 856 | self.horizontalLayout_2 = QtWidgets.QHBoxLayout() 857 | self.horizontalLayout_2.setObjectName("horizontalLayout_2") 858 | self.checkBox = QtWidgets.QCheckBox(Form) 859 | self.checkBox.setObjectName("checkBox") 860 | self.horizontalLayout_2.addWidget(self.checkBox) 861 | self.checkBox_2 = QtWidgets.QCheckBox(Form) 862 | self.checkBox_2.setObjectName("checkBox_2") 863 | self.horizontalLayout_2.addWidget(self.checkBox_2) 864 | self.verticalLayout.addLayout(self.horizontalLayout_2) 865 | self.label = QtWidgets.QLabel(Form) 866 | self.label.setObjectName("label") 867 | self.verticalLayout.addWidget(self.label) 868 | self.horizontalLayout_3 = QtWidgets.QHBoxLayout() 869 | self.horizontalLayout_3.setObjectName("horizontalLayout_3") 870 | self.radioButton_2 = QtWidgets.QRadioButton(Form) 871 | self.radioButton_2.setObjectName("radioButton_2") 872 | self.horizontalLayout_3.addWidget(self.radioButton_2) 873 | self.radioButton = QtWidgets.QRadioButton(Form) 874 | self.radioButton.setObjectName("radioButton") 875 | self.horizontalLayout_3.addWidget(self.radioButton) 876 | self.verticalLayout.addLayout(self.horizontalLayout_3) 877 | self.pushButton_2 = QtWidgets.QPushButton(Form) 878 | self.pushButton_2.setObjectName("pushButton_2") 879 | self.verticalLayout.addWidget(self.pushButton_2) 880 | 881 | self.retranslateUi(Form) 882 | QtCore.QMetaObject.connectSlotsByName(Form) 883 | 884 | def retranslateUi(self, Form): 885 | Form.setWindowTitle(QtWidgets.QApplication.translate("Form", "Form", None)) 886 | self.label_4.setText(QtWidgets.QApplication.translate("Form", "Dump Browser:", None)) 887 | self.pushButton_4.setText(QtWidgets.QApplication.translate("Form", "Open Dump", None)) 888 | self.label_3.setText(QtWidgets.QApplication.translate("Form", "Dump Location:", None)) 889 | self.pushButton.setText(QtWidgets.QApplication.translate("Form", "Select Folder", None)) 890 | self.label_2.setText(QtWidgets.QApplication.translate("Form", "Include Regs:", None)) 891 | self.checkBox.setText(QtWidgets.QApplication.translate("Form", "General", None)) 892 | self.checkBox_2.setText(QtWidgets.QApplication.translate("Form", "Floating Point", None)) 893 | self.label.setText(QtWidgets.QApplication.translate("Form", "Dump On:", None)) 894 | self.radioButton_2.setText(QtWidgets.QApplication.translate("Form", "Exit", None)) 895 | self.radioButton.setText(QtWidgets.QApplication.translate("Form", "Breakpoint Hit", None)) 896 | self.pushButton_2.setText(QtWidgets.QApplication.translate("Form", "Go!", None)) 897 | 898 | 899 | class Emulate_UI(object): 900 | def setupUi(self, Form): 901 | Form.setObjectName("Form") 902 | Form.resize(376, 87) 903 | self.verticalLayout = QtWidgets.QVBoxLayout(Form) 904 | self.verticalLayout.setObjectName("verticalLayout") 905 | self.label = QtWidgets.QLabel(Form) 906 | self.label.setObjectName("label") 907 | self.verticalLayout.addWidget(self.label) 908 | self.horizontalLayout = QtWidgets.QHBoxLayout() 909 | self.horizontalLayout.setObjectName("horizontalLayout") 910 | self.checkBox_3 = QtWidgets.QCheckBox(Form) 911 | self.checkBox_3.setChecked(True) 912 | self.checkBox_3.setObjectName("checkBox_3") 913 | self.horizontalLayout.addWidget(self.checkBox_3) 914 | self.checkBox_2 = QtWidgets.QCheckBox(Form) 915 | self.checkBox_2.setChecked(True) 916 | self.checkBox_2.setObjectName("checkBox_2") 917 | self.horizontalLayout.addWidget(self.checkBox_2) 918 | self.checkBox = QtWidgets.QCheckBox(Form) 919 | self.checkBox.setObjectName("checkBox") 920 | self.horizontalLayout.addWidget(self.checkBox) 921 | self.verticalLayout.addLayout(self.horizontalLayout) 922 | self.horizontalLayout_2 = QtWidgets.QHBoxLayout() 923 | self.horizontalLayout_2.setObjectName("horizontalLayout_2") 924 | self.pushButton = QtWidgets.QPushButton(Form) 925 | self.pushButton.setObjectName("pushButton") 926 | self.horizontalLayout_2.addWidget(self.pushButton) 927 | self.pushButton_2 = QtWidgets.QPushButton(Form) 928 | self.pushButton_2.setObjectName("pushButton_2") 929 | self.horizontalLayout_2.addWidget(self.pushButton_2) 930 | self.verticalLayout.addLayout(self.horizontalLayout_2) 931 | 932 | self.retranslateUi(Form) 933 | QtCore.QMetaObject.connectSlotsByName(Form) 934 | 935 | def retranslateUi(self, Form): 936 | Form.setWindowTitle(QtWidgets.QApplication.translate("Form", "EA Emulate", None)) 937 | self.label.setText(QtWidgets.QApplication.translate("Form", "Options:", None)) 938 | self.checkBox_3.setText(QtWidgets.QApplication.translate("Form", "Annotate In IDA", None)) 939 | self.checkBox_2.setText(QtWidgets.QApplication.translate("Form", "Print In Server Window", None)) 940 | self.checkBox.setText(QtWidgets.QApplication.translate("Form", "Emulate On Break", None)) 941 | self.pushButton.setText(QtWidgets.QApplication.translate("Form", "Done", None)) 942 | self.pushButton_2.setText(QtWidgets.QApplication.translate("Form", "Emulate!", None)) 943 | 944 | --------------------------------------------------------------------------------
").join(mem)
28 |
29 |
30 | def get_bits():
31 |
32 | global file_name
33 | global _32_bit
34 |
35 | new_name = get_root_filename()
36 |
37 | if new_name != file_name:
38 | file_name = new_name
39 |
40 | # avoid IDA bug
41 | if get_inf_structure().is_32bit() and get_inf_structure().is_64bit():
42 | _32_bit = (next((False for i in ("r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15")
43 | if get_rg(i) != 0xffffffffffffffff), True) and
44 | next((False for i in ("rax", "rbx", "rcx", "rdx", "rsi", "rdi", "rbp", "rsp", "rip")
45 | if get_rg(i) > 0xffffffff), True))
46 | else:
47 | _32_bit = get_inf_structure().is_32bit()
48 |
49 | return _32_bit
50 |
51 |
52 | def get_mem_recursive(mem, matches, prev_mem=False, get_perm=True, int_size=4):
53 |
54 | global iterations
55 |
56 | mem_str = hex(mem)[2:].strip("L").zfill(int_size * 2)
57 |
58 | if get_perm:
59 | try:
60 | perm = bin(GetSegmentAttr(mem, SEGATTR_PERM))[2:].zfill(3)
61 | if "1" in perm:
62 | perm = '(' + "".join(sym if int(v) else "-" for v, sym in zip(perm, ("r", "w", "x"))) + ')'
63 | else:
64 | perm = ""
65 | except:
66 | perm = ""
67 | else:
68 | perm = ""
69 |
70 | offset = None
71 |
72 | if codeSegment and codeStart < mem < codeEnd:
73 | offset = GetFuncOffset(mem)
74 | if offset:
75 | text = cPrint("code", "0x" + mem_str) + cPrint("code", " <" + offset + ">")
76 | code = True
77 |
78 | if not offset:
79 | if perm or not get_perm:
80 | text = cPrint("valid", "0x" + mem_str)
81 | elif next((False for i in mem_str if i != "0"), True):
82 | text = cPrint("null", "0x" + mem_str) # + "(NULL)"
83 | else:
84 | text = "0x" + mem_str
85 |
86 | if next((False for i in reversed(mem_str.decode("HEX")) if i not in printable), True) and prev_mem:
87 | r_mem = dbg_read_memory(prev_mem, 50)
88 | if r_mem:
89 | text += '(' + cPrint("string", '"' + r_mem.split("\x00")[0].replace("\n", "") + '"') + ')'
90 |
91 | code = False
92 |
93 | matches.append(text)
94 |
95 | if not code and iterations < max_iterations:
96 | iterations += 1
97 | next_mem = dbg_read_memory(mem, int_size)
98 |
99 | if next_mem:
100 | get_mem_recursive(int("".join(reversed(next_mem)).encode("HEX"), 16), matches, mem, int_size=int_size)
101 |
102 | iterations = 0
103 |
104 |
105 | def ea_warning(text, buttons=(("OK", None, True),), checkboxes=[], title="EA Warning"):
106 |
107 | global warning
108 | global form
109 |
110 | warning = QtWidgets.QFrame()
111 | form = Warning_UI()
112 | form.setupUi(warning)
113 | form.label.setText(text)
114 |
115 | for button, handler, close_on_click in buttons:
116 | setattr(form, button, QtWidgets.QPushButton(warning))
117 | getattr(form, button).clicked.connect(handler if handler else warning.close)
118 | getattr(form, button).setText(QtWidgets.QApplication.translate("Dialog", button, None))
119 |
120 | if close_on_click:
121 | getattr(form, button).clicked.connect(warning.close)
122 |
123 | form.horizontalLayout.addWidget(getattr(form, button))
124 |
125 | for checkbox, handler, checked in checkboxes:
126 | setattr(form, checkbox, QtWidgets.QCheckBox(warning))
127 | getattr(form, checkbox).stateChanged.connect(handler)
128 | getattr(form, checkbox).setText(QtWidgets.QApplication.translate("Dialog", checkbox, None))
129 | getattr(form, checkbox).setChecked(checked)
130 | form.horizontalLayout_2.addWidget(getattr(form, checkbox))
131 |
132 | warning.setWindowFlags(warning.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
133 | warning.setWindowTitle(QtWidgets.QApplication.translate("Dialog", title, None))
134 | warning.show()
135 |
136 |
137 | def set_style():
138 |
139 | global style
140 |
141 | s = QtCore.QSettings()
142 | s.beginGroup("Font")
143 | s.beginGroup("Disassembly")
144 | font_name = s.value("Name")
145 |
146 | style[0] = str(
147 | (
148 | "" % (
158 | (config["current_skin"][0] if config["match_background"] else config["current_skin"][9]),
159 | "consolas",
160 | config["current_skin"][11],
161 | config["current_skin"][10],
162 | config["current_skin"][12],
163 | config["current_skin"][13])
164 | )
165 | )
166 |
167 |
168 | def save_config():
169 |
170 | with open(root_dir + "config.json", "w") as w:
171 | dump(config, w)
172 |
173 |
174 | def load_config():
175 |
176 | global config
177 |
178 | init_config = {
179 | "libc_offsets": [0, 0, 0, 0],
180 | "trace_dir": "",
181 | "stack_display_length": 25,
182 | "apply_skin_on_startup": True,
183 | "show_rewind_warning": True,
184 | "match_background": True,
185 | "current_skin": ["1c1c2a", "ffffff", "818181", "00d5ff", "ffffff", "202030", "ffffff", "00e6ff", "ffffff", '1c1c2a', 'FFFFFF', '00FFFF', 'C4F0C5', '737DFF'],
186 | "skins": [["Neon Dark", "212121", "ffffff", "414141", "00fff7", "ffffff", "282828", "ffffff", "00ffea", "ffffff", '212121', 'FFFFFF', '00FFFF', 'C4F0C5', '737DFF'],
187 | ["Neon Blue", "1c1c2a", "ffffff", "818181", "00d5ff", "ffffff", "202030", "ffffff", "00e6ff", "ffffff", '1c1c2a', 'FFFFFF', '00FFFF', 'C4F0C5', '737DFF']]
188 | }
189 |
190 | if not isfile(root_dir + "config.json"):
191 | config = init_config
192 |
193 | else:
194 | try:
195 | with open(root_dir + "config.json", "r") as f:
196 | config = load(f)
197 | except:
198 | print 'IDA EA Error: Config File ("config.json") contained invalid JSON. Reinitializing config...'
199 | remove(root_dir + "config.json")
200 | load_config()
201 | return
202 |
203 | for i,v in init_config.items():
204 | if i not in config:
205 | config[i] = v
206 |
207 | if len(config["current_skin"]) == 9:
208 | # Add new settings
209 | new_settings = ['212121', 'FFFFFF', '00FFFF', 'C4F0C5', '737DFF']
210 | config["current_skin"] += new_settings
211 | for i in config["skins"]:
212 | i += new_settings
213 |
214 | # Check config file integrety
215 | if len(config["current_skin"]) != 14:
216 | config["current_skin"] = init_config["current_skin"]
217 | print "IDA EA: Errors in current_skin found, Reinitializing"
218 |
219 | for i in config["skins"][:]:
220 | if len(i) != 15:
221 | config["skins"].remove(i)
222 | print "IDA EA: Errors found in %s skin found, Removing" % i[0]
223 | # Check if skin in init_config
224 | skin_names = [a[0] for a in init_config["skins"]]
225 | if i[0] in skin_names:
226 | config["skins"].append(init_config["skins"][skin_names.index(i[0])])
227 | print "IDA EA: Reinitialized %s skin" % i[0]
228 |
229 | for k in init_config:
230 | if type(config[k]) != type(init_config[k]):
231 | config[k] = init_config[k]
232 | print "IDA EA: Reinitialized incorrect value %s in config file" % k
233 |
234 | save_config()
235 |
236 |
237 |
238 | def a_sync(func, ThreadClass=QtCore.QThread):
239 |
240 | # if reference to QThread is not global,
241 | # python's garbage collection cleans up QThread whilst running causing a crash in IDA
242 | # to prevent this we have an array of global thread references which expands as nessecary
243 |
244 | thread_idx = next((i for i, v in enumerate(threads) if not v.isRunning()), False)
245 | thread = ThreadClass()
246 |
247 | if thread_idx is not False:
248 | threads[thread_idx] = thread
249 | else:
250 | threads.append(thread)
251 |
252 | thread.run = func
253 | thread.start()
254 |
255 |
256 | max_iterations = 10
257 | iterations = 0
258 |
259 | codeSegment = get_segm_by_name(".text")
260 |
261 | if codeSegment:
262 | codeStart = codeSegment.startEA
263 | codeEnd = codeSegment.endEA
264 |
265 | file_name = None
266 | _32_bit = None
267 | root_dir = __file__[:max(__file__.rfind("/"), __file__.rfind("\\"), 0)] + "/"
268 | warning = None
269 | config = None
270 | threads = []
271 | style = [""]
272 |
273 | load_config()
274 | set_style()
275 |
276 |
277 |
--------------------------------------------------------------------------------
/ea_heap.py:
--------------------------------------------------------------------------------
1 | from api_funcs import *
2 | from ea_UI import Heap_UI, Set_Offset_UI
3 | from ea_utils import QtCore, QtWidgets, config, ea_warning, get_bits, read, root_dir, save_config
4 | from idaapi import *
5 | from idautils import *
6 | from idc import *
7 | from re import findall
8 |
9 | class Hook(DBG_Hooks):
10 |
11 | def __init__(self):
12 | DBG_Hooks.__init__(self)
13 |
14 | def dbg_bpt(self, tid, bptea):
15 |
16 | if bptea == malloc_addr:
17 | addr = get_rg("RAX") - int_size*2
18 | c = chunk(*(to_list(dbg_read_memory(addr, 6 * int_size)) + [addr]))
19 | addr = hex(addr).replace("L", "")
20 |
21 | if not form.listWidget_4.findItems(addr, QtCore.Qt.MatchFlag.MatchExactly):
22 | form.listWidget_4.addItem(addr)
23 |
24 | chunkmap_2[addr] = c
25 | update_chunk(c)
26 | get_malloc_state()
27 |
28 | return 0
29 |
30 |
31 | class field():
32 |
33 | def __init__(self,val,size):
34 | self.val = val
35 | self.size = size
36 |
37 |
38 | class malloc_state():
39 |
40 | def __init__(self, address):
41 | self.mutex = field(0, 0.5 if int_size == 8 else 1)
42 | self.flags = field(0, 0.5 if int_size == 8 else 1)
43 | self.fastbinsY = field([1],10)
44 | self.top = field(0,1)
45 | self.last_remainder = field(0,1)
46 | self.bins = field([1], 254)
47 | self.binmap = field([0.5], 4)
48 | self.next = field(0,1)
49 | self.next_free = field(0,1)
50 | self.attached_threads = field(0,1)
51 | self.system_mem = field(0,1)
52 | self.max_system_mem = field(0,1)
53 |
54 | # Not a member of glibc malloc_state
55 | self.address = address
56 |
57 |
58 | class chunk():
59 |
60 | def __init__(self, prev_size, size, fd, bk, fd_nextsize, bk_nextsize, address):
61 | self.prev_size = prev_size
62 | self.size = size & 0xfffffffc
63 | self.fd = fd
64 | self.bk = bk
65 | self.fd_nextsize =fd_nextsize
66 | self.bk_nextsize = bk_nextsize
67 | self.prev_in_use = size & 0x1
68 | self.is_mmapped = 1 if size & 0x2 else 0
69 |
70 | # Not a member of glibc chunk
71 | self.data = ""
72 | self.address = address
73 |
74 | def __str__(self):
75 |
76 | a = ("prev_size" ,"size" ,"fd", "bk", "fd_nextsize", "bk_nextsize")
77 |
78 | return ( "Chunk @ " + hex(getattr(self, "address")) + " = {\n" +
79 | "".join( " " + i + " = " + hex(getattr(self, i)) + "\n" for i in a) + "\n" +
80 | " prev_in_use = " + ("True" if self.prev_in_use else "False") + "\n"
81 | " is_mmapped = " + ("True" if self.is_mmapped else "False") + "\n"
82 | + "}")
83 |
84 |
85 | def to_hex(x):
86 | return hex(x).replace("L","")
87 |
88 |
89 | def to_list(x, chunk_size = 8):
90 | return [ to_int(x[i:i+chunk_size]) for i in range(0, len(x), chunk_size) ]
91 |
92 |
93 | def to_int(x):
94 |
95 | a = "".join(reversed(x)).encode("HEX")
96 | if len(a) % 2:
97 | a = "0" + a
98 |
99 | return int(a, 16)
100 |
101 |
102 | def update_chunk(c):
103 |
104 | next_chunk = dbg_read_memory(c.address, 6 * int_size)
105 |
106 | if next_chunk:
107 | c = chunk(*(to_list(next_chunk) + [c.address]))
108 | c.data = dbg_read_memory(c.address + 2 * int_size, min(c.size, 0x500)).encode("HEX")
109 |
110 | if c.data:
111 | c.data = " ".join(c.data[i:i + 2] for i in range(0, len(c.data), 2))
112 | else:
113 | c.data = ""
114 |
115 | return c
116 |
117 |
118 | def fill_field(malloc_state, field, mem, current, list=False):
119 |
120 | field_size = getattr(malloc_state,field).size
121 |
122 | if list:
123 | var_size = getattr(malloc_state,field).val.pop()
124 | setattr(malloc_state, field, to_list(mem[current:int(current + int_size * var_size * field_size)], int(int_size*var_size)))
125 | else:
126 | var_size = 1
127 | setattr(malloc_state, field, to_int(mem[current:int(current + int_size * field_size)]))
128 |
129 | current += int(int_size * field_size * var_size)
130 |
131 | return current
132 |
133 |
134 | def get_malloc_state():
135 |
136 | main_arena = malloc_state(main_arena_addr)
137 |
138 | print main_arena
139 |
140 | mem = dbg_read_memory(main_arena.address, 2200)
141 | current = 0
142 | fields = ["mutex", "flags", "fastbinsY", "top", "last_remainder", "bins",
143 | "binmap", "next", "next_free", "attached_threads", "system_mem", "max_system_mem"]
144 |
145 | for field in fields:
146 | current = fill_field(main_arena, field, mem, current,
147 | True if isinstance(getattr(main_arena, field).val, list) else False)
148 |
149 | main_arena.fastbinsY = [[item] for item in main_arena.fastbinsY]
150 | main_arena.bins = [[item] for item in main_arena.bins]
151 | form.listWidget.clear()
152 | form.listWidget_3.clear()
153 |
154 | for n, bin in enumerate(main_arena.fastbinsY):
155 | if bin and bin[0]:
156 | get_chunks(bin, main_arena.address)
157 | if bin:
158 | name = "Fastbin %s" % hex(n)
159 | form.listWidget.addItem(name)
160 | binmap[name] = bin
161 | elif bin:
162 | bin.pop()
163 |
164 | for n, bin in enumerate(main_arena.bins):
165 | if bin and not (main_arena.address < bin[0] < main_arena.address + 2200):
166 | get_chunks(bin, main_arena.address)
167 | if bin:
168 | name = "Bin %s" % hex(n)
169 | form.listWidget_3.addItem(name)
170 | binmap[name] = bin
171 | elif bin:
172 | bin.pop()
173 |
174 |
175 | def get_chunks(bin, state_addr):
176 |
177 | next_chunk = True
178 | chunks = []
179 | addr = bin.pop()
180 |
181 | while next_chunk:
182 | next_chunk = dbg_read_memory(addr, 6 * int_size)
183 |
184 | if next_chunk:
185 | c = chunk(*(to_list(next_chunk) + [addr]))
186 | bin.append(c)
187 | chunks.append(c.fd)
188 | c.data = dbg_read_memory(addr + 2 * int_size, min(c.size, 0x500)).encode("HEX")
189 | c.data = " ".join(c.data[i:i+2] for i in range(0, len(c.data), 2))
190 | if state_addr < c.fd < state_addr + 2200:
191 | break
192 |
193 | addr = c.fd
194 | else:
195 | break
196 |
197 |
198 | def get_main_arena():
199 |
200 | global base_addr
201 |
202 | for addr in Segments():
203 | if findall("libc_.*\.so",SegName(addr)):
204 | seg = getseg(addr)
205 |
206 | if seg.perm | SEGPERM_EXEC == seg.perm:
207 | return addr
208 |
209 |
210 | def select_bin(item):
211 |
212 | global chunkmap
213 |
214 | form.listWidget_2.clear()
215 | for chunk in binmap[item.text()]:
216 | form.listWidget_2.addItem(hex(chunk.address))
217 | chunkmap[hex(chunk.address).replace("L", "")] = chunk
218 |
219 |
220 | def select_chunk(item, chunkmap):
221 |
222 | chunk = chunkmap[item.text()] = update_chunk(chunkmap[item.text()])
223 | form.textEdit.clear()
224 | form.textEdit.insertHtml("" + "