└── reflectPatcher.py /reflectPatcher.py: -------------------------------------------------------------------------------- 1 | import sys, pefile, struct 2 | 3 | __author__ = "Borja Merino Febrero" 4 | __email__ = "bmerinofe@gmail.com" 5 | __license__ = "GPL" 6 | __version__ = "0.1" 7 | 8 | class bcolors: 9 | FAIL = '\033[91m' 10 | BOLD = '\033[1m' 11 | GREEN = '\033[32m' 12 | ENDC = '\033[0m' 13 | 14 | def get_file_offset(pe): 15 | rva ='' 16 | if hasattr(pe, 'DIRECTORY_ENTRY_EXPORT'): 17 | for export in pe.DIRECTORY_ENTRY_EXPORT.symbols: 18 | if "ReflectiveLoader" in export.name: 19 | rva = export.address 20 | print bcolors.GREEN + "[*] %s export Found! Ord:%s EntryPoint offset: %xh" % (export.name, export.ordinal, rva) + bcolors.ENDC 21 | break; 22 | 23 | if not rva: 24 | print bcolors.FAIL + "[!] Reflective export function not found :/" + bcolors.ENDC 25 | sys.exit(1) 26 | 27 | offset_va = rva - pe.get_section_by_rva(rva).VirtualAddress 28 | offset_file = offset_va + pe.get_section_by_rva(rva).PointerToRawData 29 | 30 | # Correct 7 bytes 31 | offset_file -= 7 32 | 33 | # Return little endian version 34 | return struct.pack(" 2: 68 | if sys.argv[2] not in exit_method: 69 | print bcolors.FAIL + "[!] Not valid exit method" + bcolors.ENDC 70 | sys.exit(1) 71 | else: 72 | exit_addr = exit_method[sys.argv[2]] 73 | 74 | dll = sys.argv[1] 75 | 76 | try: 77 | pe = pefile.PE(dll) 78 | print bcolors.GREEN + "[*] %s loaded" % dll + bcolors.ENDC 79 | except IOError as e: 80 | print str(e) 81 | sys.exit(1) 82 | 83 | offset_file = get_file_offset(pe) 84 | stub = patch_stub(offset_file,exit_addr) 85 | 86 | src = file(dll,'rb') 87 | payload = src.read() 88 | 89 | # Relfective = Size payload + stub + (payload - stub) 90 | reflective_payload = struct.pack("