拦截 import 伪造一个库

光庆 2月前 483

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() 等文件的相对路径的处理,并没有进行对应的拦截转向,可以针对不同的库,自行添加转向测试。

本文只是提供一个思路,抛砖引玉,仅供参考。

最新回复 (3)
  • breezee 2月前
    0 2
    大佬又出精品了!没看到怎么用,使用场景是什么?
  • 小肥羊 2月前
    0 3

    这个砖头别拋了,收回去

  • 小光芒 2月前
    0 4
    砖头有点大
返回