import console;
import raw.apiHook
var GetFileAttributes = raw.apiHook(
"kernel32.dll",
"GetFileAttributesW",
"int(ustring)",
function(file){
if file==io.fullpath("~\lib\虚拟库.aardio") return ;
if file==io.fullpath("~\lib\chm.aardio") return ;
if file==io.fullpath("~\lib\color.aardio") return ;
return owner.callApi(file);
}
)
GetFileAttributes.install();
import godking.readFileFromMem;
var r = godking.readFileFromMem({
[io.fullpath("~\lib\虚拟库.aardio")]="namespace 虚拟库;VERSION=8888";
[io.fullpath("~\lib\chm.aardio")]="namespace chm{};"++..string.removeBom(..string.load("~\lib\cchart\_.aardio"));
[io.fullpath("~\lib\color.aardio")]=..string.load("e:\color.aardio");
});
r.start();
// 导入一个不存在的库
import 虚拟库;
console.dump(虚拟库.VERSION);
// 导入一个存在的库
import zlib;
console.dump(zlib.ZLIB_VERSION);
// 转向一个相同的库,只是改了文件存放路径,要保证目标文件存在。这里没有"e:\color.aardio",就不测试了
//import color;
// 转向一个不同库,要保证目标文件存在
import chm;
console.dump(cchart.AddSegmentColor);
r.stop();
GetFileAttributes.unInstall();
console.pause(true);
稍微修改,可以对 import 进行转向:
var r = godking.readFileFromMem({[io.fullpath("~\lib\虚拟库.aardio")]=..string.load("E:\转向库.aardio")});
当然,以上处理方法很简陋,并不完善,对于内部又引用了各种文件的库,可能存在其他问题。
比如 raw.loaddll() 等文件的相对路径的处理,并没有进行对应的拦截转向,可以针对不同的库,自行添加转向测试。
本文只是提供一个思路,抛砖引玉,仅供参考。