在这种情况下,您应该这样做。
第 1 步:在像 Ollydbg 这样的调试器中加载可执行文件。
第 2 步:在内存转储窗口中,PyImport_FrozenModules
按Ctrl+导航到G
第 3 步:PyImport_FrozenModules
是一个指针,它被初始化为指向一个struct _frozen
记录数组。跟随这个指针在dump
.
第 4 步:现在您处于有_frozen
结构数组的位置。该结构定义为
struct _frozen {
char *name;
unsigned char *code;
int size;
};
上述数组由其所有成员都为空的结构终止。
第五步:在上面的结构中,第一个成员是指向冻结模块名称的指针,第二个成员是一个指向模块字节码的指针。(这就是你要找的东西)。最后一个成员将为您提供字节码的大小(以字节为单位)。使用大小,将字节码转储到文件中。
第 6 步:您刚刚转储的字节码不包含 pyc 文件的魔术头值(对于 python 2.7,这是 03 F3 0D 0A,后跟 4 字节时间戳)
添加头,现在文件应该被反编译 -有能力的。
要自动执行上述过程,您还可以编写一个脚本。
更新
这是一个 PyCommand(一个免疫调试器脚本)来转储冻结的模块。您需要在加载所有冻结的模块后运行脚本。为此,您可以在函数上设置断点,PyImport_ImportFrozenModule()
以便您可以在加载时跟踪每个冻结的模块。如果您是 Immunity Debugger 的新手,请查看此和此
import immlib
DESC = 'PyCommand to dump frozen python modules'
PYTHONMAGIC = '\x03\xF3\x0D\x0A\x00\x00\x00\x00' # Change this value according to the version of python used. The value given here is for Python 2.7
'''
Run this pycommand when all frozen modules are loaded.
This will dump each frozen module in a .pyc file in
immunity debugger installation directory
'''
def main(args):
imm = immlib.Debugger()
addr = imm.getAddress('PyImport_FrozenModules')
structAddr = imm.readLong(addr)
while True:
ptrToName = imm.readLong(structAddr)
ptrToCode = imm.readLong(structAddr + 4)
sizeOfCode = imm.readLong(structAddr + 8)
structAddr += 12
# The array is terminated by a structure whose members are null
if ptrToName == 0 and ptrToCode == 0 and sizeOfCode == 0:
break
if sizeOfCode > 0 and sizeOfCode < 2147483647:
moduleName = imm.readString(ptrToName)
moduleCode = imm.readMemory(ptrToCode, sizeOfCode)
# You can change the output path here
open(moduleName + '.pyc', 'wb').write(PYTHONMAGIC + moduleCode)
return '[*] Frozen modules dumped'
转储冻结的模块后,对生成的pyc文件使用反编译器。您可以为此使用Easy Python Decompiler。