aardio 文档
aardio 范例: DLL 查看工具
//DLL 查看工具
import fonts.fontAwesome;
import win.ui;
/*DSG{{*/
winform = win.form(text="DLL查看工具";right=1019;bottom=679;bgcolor=0xF0FBFF;border="none")
winform.add(
btnLoad={cls="plus";text="分析";left=709;top=635;right=796;bottom=670;bgcolor=0xB0B28F;db=1;dr=1;font=LOGFONT(h=-13);notify=1;z=9};
caption={cls="bkplus";text="DLL / EXE 文件导入导出表查看工具 ( 双击单元格可以编辑复制 )";left=67;top=8;right=565;bottom=29;align="left";color=0x5C5C5C;dl=1;dt=1;font=LOGFONT(h=-14);z=6};
editExportDeclaration={cls="edit";left=102;top=48;right=1001;bottom=627;db=1;dl=1;dr=1;dt=1;edge=1;hide=1;hscroll=1;multiline=1;vscroll=1;z=12};
editFilePath={cls="plus";left=106;top=636;right=696;bottom=671;align="right";bgcolor=0xF0FBFF;border={bottom=1;color=0xFF008000};db=1;dl=1;dr=1;editable="edit";font=LOGFONT(h=-16);tabstop=1;textPadding={top=6;bottom=1};z=8};
lbInfo={cls="static";text="可拖放DLL到当前窗口";left=807;top=648;right=1001;bottom=673;db=1;dr=1;font=LOGFONT(h=-13);transparent=1;z=10};
listview={cls="listview";left=102;top=49;right=1002;bottom=628;db=1;dl=1;dr=1;dt=1;edge=1;z=7};
logo={cls="bkplus";text='\uF15B';left=35;top=7;right=64;bottom=32;color=0x626B58;dl=1;dt=1;font=LOGFONT(h=-18;name='FontAwesome');z=5};
navBar={cls="bkplus";left=0;top=37;right=83;bottom=681;bgcolor=0x4BB390;db=1;dl=1;dt=1;z=1};
navExport={cls="plus";text="导出表";left=0;top=48;right=85;bottom=128;bkBottom=3;bkLeft=7;bkRight=8;bkTop=2;border={color=0xFFFF0000};color=0xFFFFFF;dl=1;dt=1;font=LOGFONT(h=-13);iconStyle={font=LOGFONT(h=-37;name='FontAwesome');padding={bottom=20}};iconText='\uF0AE';notify=1;textPadding={bottom=10};valign="bottom";x=0.5;y=0.2;z=3};
navExportDeclaration={cls="plus";text="声明";left=0;top=216;right=82;bottom=296;bkBottom=3;bkLeft=7;bkRight=8;bkTop=2;border={color=0xFFFF0000};color=0xFFFFFF;dl=1;dt=1;font=LOGFONT(h=-13);iconStyle={font=LOGFONT(h=-37;name='FontAwesome');padding={bottom=20}};iconText='\uF0F6';notify=1;textPadding={bottom=10};valign="bottom";x=0.5;y=0.2;z=11};
navImport={cls="plus";text="导入表";left=0;top=132;right=85;bottom=212;bkBottom=3;bkLeft=7;bkRight=8;bkTop=2;border={color=0xFFFF0000};color=0xFFFFFF;dl=1;dt=1;font=LOGFONT(h=-13);iconStyle={font=LOGFONT(h=-37;name='FontAwesome');padding={bottom=20}};iconText='\uF1DE';notify=1;textPadding={bottom=10};valign="bottom";x=0.5;y=0.2;z=4};
titleBar={cls="bkplus";left=0;top=0;right=1022;bottom=38;bgcolor=0x606B52;dl=1;dr=1;dt=1;forecolor=0xFFFFFF;linearGradient=180;z=2}
)
/*}}*/
import win.ui.simpleWindow;
win.ui.simpleWindow( winform );
import win.ui.tabs;
var tbs = win.ui.tabs(
winform.navExport,
winform.navImport,
winform.navExportDeclaration
);
tbs.skin({
background={
active=0xFFFFFFFF;
default=0x00FFFFFF;
hover=0x38FFFFFF
};
color={
default=0xFFFFFFFF;
};
checked={
background={default=0xFFFFFFFF;};
color={default=0xFF42A875;};
}
})
winform.btnLoad.skin({
background={
default=0xFF8FB2B0;
hover=0xFF928BB3;
disabled=0xFFCCCCCC;
}
})
tbs.selIndex = 1;
import raw.pefile;
var showPeFile = function(pefile){
if(pefile.getClrHeader()){
winform.lbInfo.text = ( ..string.endsWith(pefile.path,".exe",true) ? ".NET 程序" : ".NET 程序集" )
if( winform.btnLoad.text != "反编译" ){
tbs.selIndex = 2;
winform.btnLoad.text = "反编译";
}
}
else {
var major = pefile.majorLinkerVersion;
var minor = pefile.minorLinkerVersion;
var linker = "未知编译器 v"+major+"."+minor;
if( major == 14 ){
/*
可使用 sys.vc14.require 自动检测、按需安装运行库。
例如 sys.vc14.require("2022")
*/
if( minor >= 50 ){
linker = "VC++ 2026(MSVC v145)";
}
elseif( minor >= 40 ){
linker = "VC++ 2022(MSVC v144)";
}
if( minor >= 30 ){
linker = "VC++ 2022(MSVC v143)";
}
elseif( minor >= 20 ){
linker = "VC++ 2019(MSVC v142)";
}
elseif( minor >= 10 ){
linker = "VC++ 2017(MSVC v141)";
}
else {
linker = "VC++2015(MSVC v140)";
}
}
elseif( major == 12 ){
linker = "VC++ 2013(MSVC v120)";
}
elseif( major == 11 ){
linker = "VC++ 2012(MSVC v110)";
}
elseif( major == 10 ){
linker = "VC++ 2010(MSVC v100)";
if(string.endsWith(pefile.path,".exe",true)){
var aardioLibs = 0;
import fsys.res;
var hm = fsys.res.load(pefile.path)
if(hm){
fsys.res.enum(
function(module,resType,resName){
if(resName=="BUILTIN")
|| (resName=="BUILTIN.COM")
|| (resName=="BUILTIN.THREAD") {
aardioLibs++
}
return true;
},"LIB",hm
)
fsys.res.free(hm);
}
if(aardioLibs===3){
linker = "aardio";
}
}
}
elseif( major == 9 ){
linker = "VC++ 2008(MSVC v90)";
}
elseif( major == 8 ){
linker = "VC++ 2005(MSVC v80)";
}
elseif( major == 7 ){
if( minor >= 10 ) linker = "VC++ 2003(MSVC v71)";
else linker = "VC++ 2002(MSVC v70)";
}
elseif( major == 6 ){
linker = "VC++ 6.0(MSVC v60)";
}
else if( major <= 3){
var isGccSection = false;
var isGoSection = false;
var sections = pefile.sections;
for(i, sec in sections){
var name = string.str(sec.name);
if( name == ".eh_frame" || name == ".eh_fram" || name == ".ctors" || name == ".dtors" ){
isGccSection = true;
break;
}
elseif( name == ".symtab" ){
isGoSection = true;
}
}
var importsMsvcrt = false;
if( pefile.isImported("msvcrt.dll") ){
importsMsvcrt = true;
}
if( isGoSection ){
linker = "Go Linker v"+major+"."+minor+""
if(isGccSection && importsMsvcrt) linker = "Go(CGO/MinGW) v2."+minor+""
}
elseif( (isGccSection && importsMsvcrt) ){
linker = "MinGW / GCC";
if(major == 2) linker = linker + "(ld 2."+minor+")";
}
elseif(importsMsvcrt){
linker = "MinGW / GCC (Likely)";
}
}
winform.lbInfo.text = ( pefile.isPe32 ? "32 位 " : "64 位 " ) + linker;
winform.btnLoad.text = "分析";
}
winform.listview.clear(true);
if(tbs.selIndex==2){
winform.listview.hide = false;
winform.editExportDeclaration.hide = true;
winform.listview.insertColumn("DLL",100)
winform.listview.insertColumn("序号",50)
winform.listview.insertColumn("函数名",-1)
var data = pefile.getImportDirectory();
if(data){
for i,module in table.eachIndex(data){
for i,f in table.eachIndex(module.functions){
winform.listview.addItem({module.name;f.hint,f.name})
}
}
}
}
elseif(tbs.selIndex==1){
winform.listview.hide = false;
winform.editExportDeclaration.hide = true;
winform.listview.insertColumn("序号",50)
winform.listview.insertColumn("地址",150)
winform.listview.insertColumn("导出函数",-1)
var names = pefile.getExportNames();
if(names){
for(k,v in names){
if(v.name=="MetaDataGetDispenser"){
winform.lbInfo.text = ( ..string.endsWith(pefile.path,".exe",true) ? ".NET 程序" : ".NET 程序集" )
if( winform.btnLoad.text != "反编译" ){
winform.btnLoad.text = "反编译";
}
break;
}
}
winform.listview.setTable(names);
}
}
elseif(tbs.selIndex==3){
winform.listview.hide = true;
winform.editExportDeclaration.hide = false;
winform.editExportDeclaration.text = "";
var code = pefile.exportDeclaration();
if(code){
winform.editExportDeclaration.text = code;
}
else {
winform.editExportDeclaration.text = '/*\r\n自动生成API声明代码仅支持使用C++修饰名的API函数\r\n*/'
}
}
}
var searchDll = function(dllPath){
return io.exist(dllPath)
|| win.path.searchDll(dllPath)
|| win.path.search(dllPath)
|| fsys.wow64.disableRedirection(lambda()win.path.search(dllPath))
}
import win.path;
import fsys.wow64;
winform.btnLoad.oncommand = function(id,event){
var ilSpy = (winform.btnLoad.text == "反编译");
var dllPath = searchDll(winform.editFilePath.text) || searchDll(winform.editFilePath.text+".dll");
var pefile,err = raw.pefile(dllPath);
if(!pefile){
winform.setTimeout(
function(){
winform.editFilePath.editBox.showWarningTip(,err)
});
return;
}
winform.editFilePath.text = dllPath;
showPeFile(pefile);
pefile.close();
if(ilSpy) {
winform.btnLoad.disabledText = "请稍候";
import dotNet.ilSpy;
dotNet.ilSpy(dllPath);
winform.setTimeout(
function(){
winform.btnLoad.disabledText = null;
},3000)
}
}
winform.editFilePath.editBox.onOk = function(){
winform.btnLoad.oncommand();
}
import fsys.lnk;
winform.onDropFiles = function(files){
var path = files[1];
if(string.endsWith(path,".lnk",true)){
var lnk = fsys.lnk().load(path);
if(lnk){
path = lnk.path;
}
else {
return;
}
}
winform.editFilePath.text = path;
winform.btnLoad.oncommand();
if(string.endsWith(path,".exe",true)){
if(!winform.listview.count){
tbs.selIndex = 2;
}
}
}
tbs.onSelChange = function(idx,strip,form){
var pefile,err = raw.pefile(winform.editFilePath.text);
if(pefile) {
showPeFile(pefile);
pefile.close();
}
}
import win.ui.grid;
win.ui.grid(winform.listview);
winform.show();
winform.editFilePath.setFocus();
winform.editFilePath.editBox.showInfoTip("DLL文件名","请在这里输入DLL名字、文件路径等然后直接回车,也可以直接拖放DLL文件到这里")
winform.editFilePath.editBox.disableInputMethod()
winform.editFilePath.editBox.onChange = function(){
winform.btnLoad.text = "分析";
}
winform.listview.setExtended(0x10000/*_LVS_EX_DOUBLEBUFFER*/);
win.loopMessage();
Markdown 格式