解除映像劫持工具与源码,可解决因映像劫持导致的程序不能运行问题

 

显示在红色列表框中为被劫持导致无法运行的程序名(同名程序不能在本机器上正常运行,可通过加号增加对其它程序文件的屏蔽)

显示在绿色列表框中为本软件解除了劫持的程序(可使用重新屏蔽按钮恢复到被劫持状态)

需要管理员权限运行(若权限自动申请如无效,可在资源管理中本程序图标上右键--使用管理员权限运行尝试解决)

操作后可直接关闭本程序,操作效果可保持(重启后不失效)

 

实现方法:

    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;

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值