var targetDir = 'j:\\anaconda3\\envs\\py11ae\\lib\\site-packages\\xisutil'.toLowerCase();
var python = Process.getModuleByName('python311.dll');
var PyGILState_Ensure = new NativeFunction(
python.getExportByName('PyGILState_Ensure'),
'int', []
);
var PyGILState_Release = new NativeFunction(
python.getExportByName('PyGILState_Release'),
'void', ['int']
);
var PyImport_GetModuleDict = new NativeFunction(
python.getExportByName('PyImport_GetModuleDict'),
'pointer', []
);
var PyDict_GetItemString = new NativeFunction(
python.getExportByName('PyDict_GetItemString'),
'pointer', ['pointer', 'pointer']
);
var PyObject_Dir = new NativeFunction(
python.getExportByName('PyObject_Dir'),
'pointer', ['pointer']
);
var PyObject_GetAttrString = new NativeFunction(
python.getExportByName('PyObject_GetAttrString'),
'pointer', ['pointer', 'pointer']
);
var PyObject_Repr = new NativeFunction(
python.getExportByName('PyObject_Repr'),
'pointer', ['pointer']
);
var PyUnicode_AsUTF8 = new NativeFunction(
python.getExportByName('PyUnicode_AsUTF8'),
'pointer', ['pointer']
);
var PyList_Size = new NativeFunction(
python.getExportByName('PyList_Size'),
'int64', ['pointer']
);
var PyList_GetItem = new NativeFunction(
python.getExportByName('PyList_GetItem'),
'pointer', ['pointer', 'int64']
);
var PyObject_Type = new NativeFunction(
python.getExportByName('PyObject_Type'),
'pointer', ['pointer']
);
function getTypeName(obj) {
try {
var typeObj = PyObject_Type(obj);
if (!typeObj.isNull()) {
var typeNamePtr = Memory.allocUtf8String('__name__');
var typeName = PyObject_GetAttrString(typeObj, typeNamePtr);
if (!typeName.isNull()) {
var nameUtf8 = PyUnicode_AsUTF8(typeName);
if (!nameUtf8.isNull()) {
return nameUtf8.readUtf8String();
}
}
}
} catch (e) {}
return 'unknown';
}
function dumpMembers() {
var gilState = PyGILState_Ensure();
try {
console.log('目标目录: ' + targetDir);
console.log('='.repeat(80));
var pydModules = [];
Process.enumerateModules().forEach(function(mod) {
if (mod.path.toLowerCase().startsWith(targetDir) && mod.path.toLowerCase().endsWith('.pyd')) {
var fileName = mod.name.split('.')[0];
var pyModName = 'xisutil.' + fileName;
pydModules.push({
pyName: pyModName,
shortName: fileName,
path: mod.path,
base: mod.base,
size: mod.size
});
}
});
var modulesDict = PyImport_GetModuleDict();
pydModules.forEach(function(pydMod) {
console.log('\n模块: ' + pydMod.pyName);
console.log('路径: ' + pydMod.path);
console.log('-'.repeat(60));
var modNamePtr = Memory.allocUtf8String(pydMod.pyName);
var module = PyDict_GetItemString(modulesDict, modNamePtr);
if (!module.isNull()) {
var dirList = PyObject_Dir(module);
if (!dirList.isNull()) {
var size = PyList_Size(dirList);
console.log('\n[常量/变量]');
for (var i = 0; i < size; i++) {
var item = PyList_GetItem(dirList, i);
var nameStr = PyUnicode_AsUTF8(item);
if (!nameStr.isNull()) {
var name = nameStr.readUtf8String();
if (name.startsWith('__') && name.endsWith('__')) continue;
var attrNamePtr = Memory.allocUtf8String(name);
var attr = PyObject_GetAttrString(module, attrNamePtr);
if (!attr.isNull()) {
var reprObj = PyObject_Repr(attr);
if (!reprObj.isNull()) {
var reprUtf8 = PyUnicode_AsUTF8(reprObj);
if (!reprUtf8.isNull()) {
var reprStr = reprUtf8.readUtf8String();
if (reprStr.indexOf('<built-in function') !== -1) continue;
if (reprStr.indexOf('<class ') !== -1) continue;
if (reprStr.indexOf('<module ') !== -1) continue;
if (reprStr.length > 100) {
reprStr = reprStr.substring(0, 100) + '...';
}
var typeName = getTypeName(attr);
console.log(' ' + name + ' (' + typeName + ') = ' + reprStr);
}
}
}
}
}
console.log('\n[类定义]');
for (var i = 0; i < size; i++) {
var item = PyList_GetItem(dirList, i);
var nameStr = PyUnicode_AsUTF8(item);
if (!nameStr.isNull()) {
var name = nameStr.readUtf8String();
if (name.startsWith('__') && name.endsWith('__')) continue;
var attrNamePtr = Memory.allocUtf8String(name);
var attr = PyObject_GetAttrString(module, attrNamePtr);
if (!attr.isNull()) {
var reprObj = PyObject_Repr(attr);
if (!reprObj.isNull()) {
var reprUtf8 = PyUnicode_AsUTF8(reprObj);
if (!reprUtf8.isNull()) {
var reprStr = reprUtf8.readUtf8String();
if (reprStr.indexOf("<class '" + pydMod.shortName + '.') !== -1) {
console.log(' ' + name + ' : ' + reprStr);
}
}
}
}
}
}
console.log('\n[对象实例]');
for (var i = 0; i < size; i++) {
var item = PyList_GetItem(dirList, i);
var nameStr = PyUnicode_AsUTF8(item);
if (!nameStr.isNull()) {
var name = nameStr.readUtf8String();
if (name.startsWith('__') && name.endsWith('__')) continue;
var attrNamePtr = Memory.allocUtf8String(name);
var attr = PyObject_GetAttrString(module, attrNamePtr);
if (!attr.isNull()) {
var reprObj = PyObject_Repr(attr);
if (!reprObj.isNull()) {
var reprUtf8 = PyUnicode_AsUTF8(reprObj);
if (!reprUtf8.isNull()) {
var reprStr = reprUtf8.readUtf8String();
// 检测对象实例 (格式: <xxx object at 0x...>)
if (reprStr.indexOf(' object at 0x') !== -1) {
console.log(' ' + name + ' : ' + reprStr);
}
}
}
}
}
}
}
}
console.log('\n' + '='.repeat(80));
});
} finally {
PyGILState_Release(gilState);
}
}
dumpMembers();