显示在红色列表框中为被劫持导致无法运行的程序名(同名程序不能在本机器上正常运行,可通过加号增加对其它程序文件的屏蔽)
显示在绿色列表框中为本软件解除了劫持的程序(可使用重新屏蔽按钮恢复到被劫持状态)
需要管理员权限运行(若权限自动申请如无效,可在资源管理中本程序图标上右键--使用管理员权限运行尝试解决)
操作后可直接关闭本程序,操作效果可保持(重启后不失效)
实现方法:
windows程序运行机制为首先检查注册表分支中("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\")中是否存在以程序名为表键的分支,以记事本程序程序运行为例:记事本程序名为“notepad.exe”,其表键为“notepad.exe”。若"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe\"下存在"debugger"字符串值,就会默认为“notepad.exe”程序启动调试映像。
调试映像的命令为NTSD [options] imagefile (imagefile 是要调试的映像名称)
若"debugger"值如果等于"ntsd -d"或其它无效路径,会导致无法运行,很多病毒文件通过这种方式来阻止反病毒软件的运行。
另也可通过设置其它映像路径来达到自身运行的目的,如:将"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe\"下"debugger"的字符串值设定为NTSD [options选项] 映像名定义为自身,那么运行“notepad.exe”程序时会调动所设置的映像,从而达到自身启动的目的。
注册表项实时修改就会起作用,重启后会保持。一般杀毒与防护程序都会实时监控上述表项。
NTSD 命令解释
NTSD [options] imagefile
其中,imagefile 是要调试的映像名称,options 是下面选项之一:
映像文件选项:
-2 打开一个用于调试字符模式的应用程序的新窗口
-d 将输出重定向到调试终端
-g 使执行自动通过第一个断点
-G 使 NTSD 在子程序终止时立即退出
o 启用多个进程的调试,默认值为由调试程序衍生的一个进程
-p 指定调试由进程 ID 标识的进程
-v 产生详细的输出
本工具通过删除相关注册表项来达到解除映像劫持问题。
使用AARDIO快速软件开发工具编写,代码如下:
//RUNAS//
import fonts.fontAwesome;
import win.ui;
/*DSG{{*/
mainForm = win.form(text="000";right=343;bottom=303;max=false)
mainForm.add(
button={cls="button";text='\uF021';left=144;top=8;right=168;bottom=32;font=LOGFONT(name='FontAwesome');z=9};
button2={cls="button";text='\uF070';left=288;top=8;right=312;bottom=32;font=LOGFONT(name='FontAwesome');z=11};
button2AddExe={cls="button";text='\uF055';left=120;top=8;right=144;bottom=32;font=LOGFONT(name='FontAwesome');z=10};
button2Exe={cls="button";text='\uF09C 解除选中';left=88;top=272;right=168;bottom=298;ah=1;aw=1;font=LOGFONT(name='FontAwesome');z=4};
button5AllUnExe={cls="button";text="反选";left=176;top=272;right=256;bottom=298;ah=1;aw=1;z=7};
button6UnExe={cls="button";text='\uF2D4 重新屏蔽';left=256;top=272;right=336;bottom=298;ah=1;aw=1;font=LOGFONT(name='FontAwesome');z=8};
buttonAllExe={cls="button";text="反选";left=8;top=272;right=88;bottom=298;ah=1;aw=1;z=3};
listbox2UnExe={cls="listbox";left=176;top=32;right=339;bottom=269;ah=1;aw=1;bgcolor=10551200;edge=1;items={};msel=1;vscroll=1;z=5};
listboxExe={cls="listbox";left=8;top=32;right=171;bottom=269;ah=1;aw=1;bgcolor=12624127;edge=1;items={};msel=1;vscroll=1;z=1};
plus={cls="plus";text='\uF113';left=96;top=8;right=120;bottom=32;font=LOGFONT(h=-18;name='FontAwesome');notify=1;z=13};
plus2={cls="plus";text='\uF059';left=312;top=8;right=336;bottom=32;font=LOGFONT(h=-18;name='FontAwesome');notify=1;z=14};
static={cls="static";text="被屏蔽程序名";left=14;top=15;right=155;bottom=32;ah=1;aw=1;transparent=1;z=2};
static2={cls="static";text='\uF06E';left=320;top=8;right=321;bottom=16;font=LOGFONT(h=-18;name='FontAwesome');transparent=1;z=12};
static3={cls="static";text="已解除屏蔽程序";left=184;top=16;right=325;bottom=33;ah=1;aw=1;transparent=1;z=6}
)
/*}}*/
import win.ui.tooltip;
import win.reg;
import console;
import fsys.version;
mainForm.text = "解除映像劫持工具 V"++ tostring(fsys.version.getInfo(io._exepath).productVersion )
var debug_TT = false;
var mlog = function(...){
if(debug_TT){
console.log(...)
}
}
//全局变量
var regPath = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\"
var RefreshList = function(){
mainForm.listboxExe.clear();
mainForm.listbox2UnExe.clear();
//创建新的注册表路径
var reg = win.reg(regPath)
//枚举子项、以及子项的所有子项
reg.enumKey(
function(
subKey, /*这是某个子节点(win.reg对象)*/
keyname/*这是reg子节点的一个子项的名字*/
){
var regT = win.reg("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\"++keyname ++"\");
for(name,value,t in regT.eachValue()) {
if(name == "debugger" and value == "ntsd -d"){//映象劫持
//当前路径 regT.path
mlog(name,value,t,keyname)
mainForm.listboxExe.add(keyname,-1)
}
if(name == "Xdebugger" and value == "ntsd -d"){//映象劫持
//屏蔽测试
mainForm.listbox2UnExe.add(keyname,-1)
}
}
regT.close();
}
)
reg.close();
}
mainForm.button2Exe.oncommand = function(id,event){
for(i=1;mainForm.listboxExe.count;1){
if(mainForm.listboxExe.getSelected(i)){
mlog(mainForm.listboxExe.getItemText(i))
var regT = win.reg("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\"++ mainForm.listboxExe.getItemText(i) ++"\");
if(regT){
if(!regT.delValue("debugger") or !regT.setSzValue("Xdebugger","ntsd -d")){
win.msgboxErr("未成功写入,请检查是否有相应权限","错误")
RefreshList();
return ;
}
}
}
}
RefreshList();
}
mainForm.button.oncommand = function(id,event){
RefreshList();
}
mainForm.button2AddExe.oncommand = function(id,event){
var frmChild = mainForm.loadForm("\dlg\dlg.aardio");
frmChild.show();
}
mainForm.button6UnExe.oncommand = function(id,event){
for(i=1;mainForm.listbox2UnExe.count;1){
if(mainForm.listbox2UnExe.getSelected(i)){
mlog(mainForm.listbox2UnExe.getItemText(i))
var regT = win.reg("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\"++ mainForm.listbox2UnExe.getItemText(i) ++"\");
if(regT){
if(!regT.delValue("Xdebugger") or !regT.setSzValue("debugger","ntsd -d")){
win.msgboxErr("未成功写入,请检查是否有相应权限","错误")
RefreshList();
return ;
}
}
}
}
RefreshList();
}
mainForm.button2.oncommand = function(id,event){
if(!debug_TT){
debug_TT = !debug_TT;
mainForm.button2.text = '\uF06E'
console.open();
console.log("调试界面【关闭后会直接结束程序,请使用界面窗口上显示按键隐藏此窗口】")
win.setTopmost(mainForm.hwnd)
}else {
debug_TT = !debug_TT;
mainForm.button2.text = '\uF070'
console.close();
win.setTopmost(mainForm.hwnd,false)
}
}
mainForm.button5AllUnExe.oncommand = function(id,event){
for(i=1;mainForm.listbox2UnExe.count;1){
mainForm.listbox2UnExe.setSelected(i,!mainForm.listbox2UnExe.getSelected(i))
}
}
mainForm.buttonAllExe.oncommand = function(id,event){
for(i=1;mainForm.listboxExe.count;1){
mainForm.listboxExe.setSelected(i,!mainForm.listboxExe.getSelected(i))
}
}
//界面提示
var tips = win.ui.tooltip(mainForm);
tips.addTool(mainForm.button2AddExe,"增加其它程序到屏蔽列表中");
tips.addTool(mainForm.button6UnExe,'屏蔽绿色列表中选中程序,需要增加其它程序,请点击左上角加号按钮');
tips.addTool(mainForm.listboxExe,"已屏蔽(禁止运行)的程序");
tips.addTool(mainForm.listbox2UnExe,"已解除屏蔽的程序");
tips.addTool(mainForm.button2Exe,"恢复选中程序运行");
tips.addTool(mainForm.button2,"打开调试输出");
tips.addTool(mainForm.button,"刷新列表");
//tips.addTool(mainForm,"");
var trackingToolTip = win.ui.tooltip.tracking(mainForm);
mainForm.plus.onMouseEnter = function(wParam,lParam){
var x,y,cx,cy = mainForm.plus.getPos(true)
trackingToolTip.setInfo("提示").setText("左键点击这个把系统自带记事本加入屏蔽,加入后记事本就不能运行,
据此可验证屏蔽效果,已运行程序不会结束。
双击此处可删除屏蔽记事本。").trackPopup(true,x+20,y+cy);
}
mainForm.plus.onMouseLeave = function(wParam,lParam){
trackingToolTip.getTool().trackPopup(false)
}
mainForm.plus.oncommand = function(id,event){
var regPathT = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe\"
var regT = win.reg(regPathT);
if(!regT){
win.msgboxErr("权限不足,请以管理员权限运行此程序","错误");
return false;
}
if(!regT.setSzValue("debugger","ntsd -d")){
RefreshList();
return false;
}
RefreshList();
}
mainForm.plus.onMouseDoubuleClick = function(wParam,lParam){
var x,y = win.getMessagePos(lParam);
var regPathT = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\"
var regT = win.reg(regPathT);
if(!regT){
win.msgboxErr("权限不足,请以管理员权限运行此程序","错误");
return false;
}
mlog("delkeytree",regT.delKeyTree("notepad.exe"))
RefreshList();
}
mainForm.plus2.onMouseEnter = function(wParam,lParam){
var x,y,cx,cy = mainForm.plus2.getPos(true)
trackingToolTip.setInfo("帮助").setText(
"本工具可解决因映像劫持导致的程序不能运行问题
显示在红色列表框中为被劫持导致无法运行的程序名(同名程序不能在本机器上正常运行,可通过加号增加对其它程序文件的屏蔽)
显示在绿色列表框中为本软件解除了劫持的程序(可使用重新屏蔽按钮恢复到被劫持状态)
需要管理员权限运行(若权限自动申请如无效,可在资源管理中本程序图标上右键--使用管理员权限运行尝试解决)
操作后可直接关闭本程序,操作效果可保持(重启后不失效)
").trackPopup(true,x+20,y+cy);
}
mainForm.plus2.onMouseLeave = function(wParam,lParam){
trackingToolTip.getTool().trackPopup(false);
}
RefreshList();
mainForm.show();
return win.loopMessage();
增加程序子窗口代码:
//RUNAS
import win.ui;
/*DSG{{*/
var winform = win.form(text="选择需要屏蔽的程序";right=287;bottom=79;border="thin";max=false)
winform.add(
button={cls="button";text="确定";left=232;top=8;right=280;bottom=32;z=2};
button2={cls="button";text="浏览";left=184;top=8;right=232;bottom=32;z=4};
edit={cls="edit";text="Edit";left=16;top=8;right=176;bottom=32;edge=1;z=1};
edit2={cls="edit";text="仅填写程序文件名即可,全局禁止,支持拖放";left=8;top=40;right=280;bottom=64;disabled=1;multiline=1;z=3}
)
/*}}*/
import thread;
import fsys.dlg;
import win.reg;
::Shell32.DragAcceptFiles(winform.hwnd,true);
winform.edit.text = "";
var pathT;
//拖放会触发onDropFiles事件
winform.onDropFiles = function(files){
pathT = io.splitpath(files);
if(pathT){
winform.edit.text = pathT.file
}
}
var regW = function(exe){
import win.reg;
var regPath = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\" ++ exe ++"\"
var reg = win.reg(regPath);
if(!reg){
win.msgboxErr("权限不足,请以管理员权限运行此程序","错误");
return false;
}
if(!reg.setSzValue("debugger","ntsd -d")){
return false;
}
return true;
}
winform.button.oncommand = function(id,event){
if(regW(winform.edit.text)){
winform.edit2.text = "设置成功"
sleep(50);
winform.close();
}else {
win.msgboxErr("未成功写入,请检查是否有相应权限","错误");
}
}
winform.button2.oncommand = function(id,event){
var path = fsys.dlg.open('可执行文件|*.exe|所有文件|*.*|',,,winform);
if(path){
pathT = io.splitpath(path);
if(pathT){
winform.edit.text = pathT.file
}
}
}
winform.show();
win.loopMessage();
return winform;