| 40 | |
| 41 | |
| 42 | class Injectable(): |
| 43 | def __init__(self, exe_file: str): |
| 44 | self.iat_requests: List[IatRequest] = [] |
| 45 | self.reusedata_fixups: List[DataReuseEntry] = [] |
| 46 | self.exe_filepath: str = exe_file |
| 47 | self.superpe: SuperPe = None |
| 48 | |
| 49 | def init(self) -> bool: |
| 50 | # check if file exists |
| 51 | if not os.path.exists(self.exe_filepath): |
| 52 | logger.error("Injectable file does not exist: {}".format(self.exe_filepath)) |
| 53 | return False |
| 54 | self.superpe = SuperPe(self.exe_filepath) |
| 55 | return True |
| 56 | |
| 57 | |
| 58 | # IAT |
| 59 | |
| 60 | def add_iat_request(self, func_name: str, placeholder: bytes): |
| 61 | # existing? |
| 62 | for iat in self.iat_requests: |
| 63 | if iat.name == func_name: |
| 64 | iat.add_reference(placeholder) |
| 65 | return |
| 66 | |
| 67 | # new |
| 68 | self.iat_requests.append(IatRequest(func_name, placeholder)) |
| 69 | |
| 70 | def get_all_iat_requests(self) -> List[IatRequest]: |
| 71 | return self.iat_requests |
| 72 | |
| 73 | def get_unresolved_iat(self): |
| 74 | """Returns a list of IAT entries not available in the PE file""" |
| 75 | functions = [] |
| 76 | for iat in self.iat_requests: |
| 77 | if self.superpe.get_vaddr_of_iatentry(iat.name) == None: |
| 78 | functions.append(iat.name) |
| 79 | return functions |
| 80 | |
| 81 | |
| 82 | # Data Reuse |
| 83 | |
| 84 | def add_datareuse_fixup(self, fixup: DataReuseEntry): |
| 85 | logger.debug(" Add datareuse: {}".format(fixup.string_ref)) |
| 86 | self.reusedata_fixups.append(fixup) |
| 87 | |
| 88 | def get_all_reusedata_fixups(self) -> List[DataReuseEntry]: |
| 89 | return self.reusedata_fixups |
| 90 | |
| 91 | def get_reusedata_fixup(self, string_ref) -> DataReuseEntry: |
| 92 | for entry in self.reusedata_fixups: |
| 93 | if entry.string_ref == string_ref: |
| 94 | return entry |
| 95 | return None |
| 96 |
no outgoing calls