use std::str;
extern crate base64;
Rather than relying on garbage collection or user memory allocation (via allocate/free memory), Rust relys on the compiler to ensure memory is managed through ownership.
Ownership is a set of rules that governs how a Rust program manages memory.
Ownership helps with organizing how data is stored in the heap, minimizing duplication of data in the heap and cleaning up the heap. Data types (e.g. Scalar types) are not stored in the heap. Data types (e.g. integers) can be easily pushed/stored and popped/removed on the stack. Rust enforces single ownership.
In computer programming, an opaque predicate is a predicate—an expression that evaluates to either "true" or "false"—for which the outcome is known by the programmer a priori, but which, for a variety of reasons, still needs to be evaluated at run time
Opaque predicates appears to have been first used by Christian Collberg & Clark Thomborson back in 1997 source. The technique is discussed in their paper A Taxonomy of Obfuscating Transformations.
Rust has kind of a steep learning curve but fortunately the Rust community has created some amazing resources for it. The approach I have taken is an iterative one using the following five resorces.
import ida_kernwin | |
""" | |
mostly stolen from https://github.com/idapython/ examples/ex_actions.py | |
""" | |
class IconExample(ida_kernwin.action_handler_t): | |
def __init__(self, passed): | |
ida_kernwin.action_handler_t.__init__(self) |
class COFFSYMBOLTABLE(ctypes.Structure): | |
""" | |
Described in [PE-COFF] 5.4. Coff Symbol Table | |
""" | |
_pack_ = 1 | |
_fields_ = [ | |
("zeroes", ctypes.c_uint), ("offset", ctypes.c_uint), ("value", ctypes.c_uint), | |
("section_number", ctypes.c_short), ("type", ctypes.c_ushort), ("storage_class", ctypes.c_ubyte), | |
("number_aux_symbols", ctypes.c_ubyte) | |
] |
from idaapi import * | |
import idautils | |
import idc | |
class X64DBG_ADDR_TO_IDA: | |
def __init__(self): | |
self.fileName = ida_kernwin.ask_file(0, "*.*", 'X64DBG Address Exported') | |
self.content = [] | |
self.getFile() | |
self.renameAddr() |
func_tab = idc.get_name_ea_simple("functab") | |
for ea in idautils.DataRefsTo(func_tab): | |
offset = idc.get_qword(ea) | |
ida_bytes.del_items(offset) | |
ida_auto.auto_wait() | |
idc.create_insn(offset) | |
ida_auto.auto_wait() | |
DEBUG = True | |
def get_basic_block(ea): | |
"""get basic blocks of address""" | |
f = idaapi.get_func(ea) | |
fc = idaapi.FlowChart(f) | |
for block in fc: | |
if block.start_ea <= ea: | |
if block.end_ea > ea: | |
return block.start_ea, block.end_ea |