`

java判断是否是exe文件

 
阅读更多
	public static int myReadFileInt(int off,RandomAccessFile raf){
		int ret=0;
		try {
			for(int i=0;i<4;i++){
				raf.seek(off+i);
				int tmp = raf.readUnsignedByte()<<(i*8);
				ret+=tmp;
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		return ret;
	}
	public static int myReadFileShort(int off,RandomAccessFile raf){
		int ret=0;
		try {
			for(int i=0;i<2;i++){
				raf.seek(off+i);
				int tmp = raf.readUnsignedByte()<<(i*8);
				ret+=tmp;
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		return ret;
	}
	
	public static boolean fileIsExe(String fpath){
		boolean bret = false;
		try {
			RandomAccessFile raf = new RandomAccessFile(fpath,"r");
			int offDosHeader=0;
			int offCommon=0;
			int offFileHeader=0;
			int offOptHeader=0;
			raf.seek(offDosHeader);
			byte[] mz = new byte[2];
			raf.read(mz, 0, 2);
			if((char)mz[0]!='M' && (char)mz[1]!='Z'){
				raf.close();	//非PE
				return false;
			}
			offCommon = myReadFileInt(60, raf);
			offFileHeader = offCommon+4;
			offOptHeader = offCommon+24;
			int pe = myReadFileInt(offCommon, raf);
			if(pe!=0x00004550){
				raf.close();	//非PE
				return false;
			}
			int Characteristics = myReadFileShort(offFileHeader+18, raf);
			if((Characteristics & 0x0002)==0){
				raf.close();	//非PE
				return false;
			}
			int Machine = myReadFileShort(offFileHeader, raf);
			if(Machine!=0x14c){
				raf.close();	//64位
				return false;
			}
			int Subsystem = myReadFileShort(offOptHeader+68, raf);
			if(Subsystem==1){
				raf.close();	//sys文件
				return false;
			}
			int MajorSubsystemVersion = myReadFileShort(offOptHeader+48, raf);
			int MinorSubsystemVersion = myReadFileShort(offOptHeader+50, raf);
			if(MajorSubsystemVersion > 5 || (MajorSubsystemVersion == 5 && MinorSubsystemVersion > 1)){
				raf.close();	//子系统版本过高
				return false;
			}
			if(Subsystem==2 || Subsystem == 3){
				if((Characteristics&0x2000)>1){
					raf.close();		//dll
					return false;
				} else {
					//exe
					bret = true;
				}
			}


			raf.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
		return bret;
	}
	
	public static int bytestoint(byte[] b,int off,int cnt){
		int ret=0;
		for(int i=0;i<cnt;i++){
			ret += (b[off+i]&0xff)<<(i*8);
		}
		return ret;
	}
	
	public static boolean fileIsExe(InputStream ism){
		
		try {
			byte[] dosheader = new byte[64];
			ism.read(dosheader,0,64);
			if(bytestoint(dosheader,0,2) != 0x5a4d){
				return false;	//不是MZ头
			}
				
			int offcomheader = bytestoint(dosheader,60,4);
			byte[] tmp = new byte[offcomheader-64+24+70];
			ism.read(tmp,0,offcomheader-64+24+70);
			offcomheader = offcomheader-64;
			int offfileheader = offcomheader+4;
			int offoptheader = offcomheader+24;
			if(bytestoint(tmp,offcomheader,4) != 0x00004550){
				return false;	//签名不是PE
			}
			int Characteristics = bytestoint(tmp,offfileheader+18,2);
			if((Characteristics&0x0002)==0){
				return false;	//非PE
			}
			if(bytestoint(tmp,offfileheader,2) != 0x014C){
				return false;	//64位
			}
			int Subsystem = bytestoint(tmp,offoptheader+68,2);
			if(Subsystem == 1){
				return false;	//sys驱动
			}
			int MajorSubsystemVersion = bytestoint(tmp,offoptheader+48,2);
			int MinorSubsystemVersion = bytestoint(tmp,offoptheader+50,2);
			if(MajorSubsystemVersion > 5 || (MajorSubsystemVersion == 5 && MinorSubsystemVersion > 1)){
				//子系统版本过高
				return false;
			}
			if(Subsystem==2 || Subsystem == 3){
				if((Characteristics&0x2000)>1){
					//是dll
					return false;
				} else {
					//exe
					return true;
				}
			}
			
		} catch (IOException e) {
			log.error("fileIsExe is error :"+e.getMessage());
		}
		
		return false;
	}

 

分享到:
评论

相关推荐

    Java实现MD5大文件校验码详解

    Java实现MD5大文件校验码详细解析: 包括具体方法解释、注释 通俗易懂、易于理解

    java生成exe文件直接运行!!!!!

    这是一个关于java中编号的游戏代码生成.exe直接运行; 试一试,看看你到底掌握了多少...............

    文件类型判断

    文件类型判断1.0.exe 用vb编写的判断未知文件类型的软件。可以用于恢复数据,如硬盘扫描生成的*.chk文件。可以用于识别google浏览器临时文件夹下的没有文件后缀名的文件,还可以用于更正某些网站为了不让大家看的...

    TrIDNet判断文件类型

    当你碰到没有后缀名的文件时, 又不知道是什么程序 TrIDNet判断文件类型 java判断文件类型方法

    java基础总结大全

    (1)path是配置Windows可执行文件的搜索路径,即扩展名为.exe的程序文件所在的目录, 用于指定DOS窗口命令的路径。 (2)Classpath是配置class文件所在的目录,用于指定类搜索路径,JVM就是通过它来寻找该类的class...

    软件工程课堂作业-三角形测试程序(java)

    程序Triangle读入三个整数值,这三个整数代表一个三角形三条边的长度,程序根据这三个值判断能否构成三角形的三条边以及该三角形是不等边、等腰还是等边三角形。 使用说明中进行了较为完善的测试步骤,可以用来学习...

    java简单练习(初学篇)

    程序文件命名为Exe2_1.java。 2. 编写程序,用如下公式计算圆周率π的近似值: 程序文件命名为Exe2_2.java。 3. 编写一个程序,输入一个四位数字的年份,判断该年是否为闰年。程序文件命名为Exe2_3.java。 4. 回文...

    Asprise-OCR-Java 真正破解版

    坛子里有破解版的Asprise-OCR-Java,其原理就是利用开启CloseWin.exe窗口扫描有没有Asprise弹出过期的窗口,更具信息框的标题栏来判断是否要关闭此信息窗口。2011年7月以后的使用版无论是点击确定还是关闭按钮,都要...

    Java 2实用教程(第三版)实验指导与习题解答

    Java 2实用教程(第三版)实验指导与习题解答 清华大学出版社 (编著 耿祥义 张跃平) 实验模版代码 建议使用文档结构图 (选择Word菜单→视图→文档结构图) 上机实践1 初识Java 4 实验1 一个简单的应用程序 ...

    批处理之文件格式修改

    1.打开change.exe 2.输入你要统一指定修改文件的格式后缀 3.输入你要修改成的目标格式后缀 4.打开指定格式文件所在目录,选中任意一个具有该格式的文件 5.点击格式变更,你所指定的那个文件所在目录及其子目录所有...

    浏览器插件

    A、 java.exe B、 javac.exe C、 keytool.exe D、 cmd.exe 2、 下面的那个环境变量java解释时所需要的 B 。 A、 path B、 classpath C、 JAVA_HOME D、TEMP 3、 下面那一种开发方向不属于Java定义的? C A、 ...

    一个用java做的简单的成绩管理系统

    本程序经过exe4j打包成了exe文件,压缩包中含有源程序和素材. 虽然功能不是很完全,但是也算一个小的软件吧!倘若有人下载了,如果发现有什么Bug或者有什么不好的地方,请修正一下,并且给我留言,谢谢!我在csdn.net的...

    网管教程 从入门到精通软件篇.txt

    JAR:Java档案文件(一种用于applet和相关文件的压缩文件) JAVA:Java源文件 JFF,JFIF,JIF:JPEG文件 JPE,JPEG,JPG:JPEG图形文件 JS:javascript源文件 JSP:HTML网页,其中包含有对一个Java servlet...

    ASP200问.EXE

    19.如何判断字符串是否以指定字符串开头或结尾 20.如何判断字符是否是英文字符 21.如何检测字符串出现的次数 22.如何过滤字符串中的HTML代码 23.如何截取字符串 24.如何实现字符串和数组的转换 25.如何实现字符大小...

    office在线查看

    * 判断所转换文件类型是否合法 * @param getFileType //文件格式 * @param fileLegalFlag //是否合法标志 false:非法 true:合法 */ public boolean isLegal(String getFileType){ boolean fileLegalFlag =...

    jspsmart.jar包及帮助文档

    作用:这个方法用于判断用户是否选择了文件,也即对应的表单项是否有值。选择了文件时,它返回false。未选文件时,它返回true。 原型:public boolean isMissing() 3、getFieldName 作用:取HTML表单中对应于此...

    安卓开发与分析者的利器--安卓右键工具1.2

    显示被选中APK中lib目录下so文件的组织结构,并判断lib目录下的SO文件配置是否规范。 20、自定义插件 预留的可安装插件的接口。用户可以通过以下步骤安装自定义插件: 修改D:\APKmenuTOOL\tools\config\config...

    彩虹UDA软件狗工具带硬复制工具

    在 RC-DL 函数入口和出口之间包含大量复杂的判断跳转干扰代码,动态改变执行次序,提升 RC-DL 的抗跟踪能力。 时间闸 硬件狗内部设有时间闸,各种操作必须在规定的时间内完成。硬件狗正常操作用时很短,但跟踪时...

    飞鸽传书(IPMessenger) 源码

    这里借鉴了很多程序中使用非常广泛的“命名池”相关的概念,只不过这里我们使用的是“文件池”,可以这么认为,如果有文件要传输,可以不用考虑是否有文件正在传输,只要把要传输的文件放入 “文件池”就可以了 , ...

    java版中国象棋源码-CCHESS:本项目不接受issue~一个可供人们消遣娱乐、愉悦心情、消磨时间、促进友谊、提高智商的利用Java语言和

    需要注意的是,由于jar和exe依赖资源文件,需要复制到src目录下才可以运行,其中exe还必须将jdk目录复制到同一目录下并命名为jre才可运行 建议使用一键安装包,不依赖java环境: 链接: 提取码:i779 目前待解决的...

Global site tag (gtag.js) - Google Analytics