`

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生成exe文件直接运行!!!!!

    而.exe文件是编译后的机器码,可以直接由操作系统执行。因此,将Java转换为.exe的过程实际上是创建一个封装了JVM和Java字节码的外壳程序。 总结,通过适当的工具和配置,我们可以将Java应用程序转化为.exe文件,...

    java中两种方式调用其他.exe可执行程序

    在上面的代码中,我们首先判断 `Desktop` 是否支持当前平台,然后获取 `Desktop` 对象,最后使用 `open` 方法打开注册表编辑器。 使用 `Runtime` 类调用其他.exe 可执行程序 `Runtime` 类是 Java 的一个核心类,...

    一个用JAVA写的清除EXE病毒文件的代码

    描述中提到的“清除EXE病毒文件的代码”,意味着这个Java程序设计用于扫描、检测并可能消除在EXE文件中发现的恶意软件。EXE病毒通常会自我复制并附着到其他可执行文件上,影响系统运行,甚至可能导致数据丢失或系统...

    五子棋 java 有打包成exe文件

    在IT行业中,将Java应用程序打包成可执行的.exe文件对于非Java环境的用户来说非常方便。这个主题涉及到了Java编程、图形用户界面(GUI)设计、编译与打包技术,以及可能的跨平台兼容性问题。以下是关于"五子棋 Java ...

    java版贪吃蛇.exe

    exe4j是一个流行的工具,它允许Java开发者将Java应用打包成Windows原生的.exe文件,以便非开发人员也能方便地运行。 【标签】"java 贪吃蛇" 指出这个项目的核心技术是Java语言,而游戏的主题是经典的“贪吃蛇”。...

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

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

    JAVA日历(含EXE文件和源码)

    7. **EXE文件**:在Windows操作系统中,`.exe`文件是可执行文件的扩展名,意味着这个Java日历程序已经被编译并打包成可以在Windows上直接运行的二进制文件,无需安装Java环境。 8. **学习与实践**:对于学习Java...

    Java实现俄罗斯方块源码以及jar、exe文件

    在这个项目中,开发者使用Java语言构建了一个完整的可执行程序,包括一个jar文件(Java Archive)和一个exe文件(Windows可执行文件)。 首先,`Tetris.jar`是一个Java应用的打包文件,它包含了所有运行该程序所需...

    判断文本文件是否为UTF-8编码

    本资源主要关注如何判断一个文本文件是否采用UTF-8编码。 在Windows系统中,比如Windows 7旗舰版,我们经常使用Notepad.exe(记事本)来查看和编辑文本文件。在编程环境中,有时候我们需要编写代码来检查文件的编码...

    文件类型判断

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

    调用WinRar实现加密压缩文件和解密解压缩文件

    本主题中提到的两个Java文件,RarDecode.java和RarEncode.java,很可能是实现了这些功能的Java代码。 对于文件的压缩,WinRAR命令行工具可以通过指定参数实现。例如,`rar a -m5 -p[密码] [压缩文件名] [源文件或...

    TrIDNet判断文件类型

    在提供的压缩包文件中,“如何判断文件类型.pdf”和“Java判断文件类型.pdf”很可能是关于这两个主题的详细教程,可以帮助用户深入了解如何进行文件类型的识别。而“triddefs_xml.rar”可能包含TrIDNet的识别规则库...

    java源程序(五子棋)

    在Windows系统中,用户通常更习惯于执行.exe文件,而不是通过命令行运行Java程序。为了满足这一需求,开发者可能使用了像JAR2EXE这样的工具,将编译后的Java应用打包成.exe格式,这样非开发人员也能直接双击运行,...

    Java判断题解析.pdf

    "Java判断题解析.pdf" Java语言具有较好的安全性、可移植性及与平台无关等特性。Java是编译型和解释型语言的结合体,具有高安全性和跨平台的特点。Java语言的安全性体现在于其沙箱机制和内存管理机制,保护用户免受...

    Java判断题.pdf

    本资源摘要信息对Java判断题.pdf文件进行了详细的知识点解析,涵盖了Java语言的基本特性、安全性、可移植性、平台无关性、基本数据类型、运算符、变量初始化、强制类型转换、对象赋值、垃圾回收、抽象方法、接口继承...

    java判断题-博学谷.doc

    ### Java 判断题知识点解析 #### 1. Java 核心源码包位置 - **题目**: Java 核心源码包存放在 JDK 安装目录的 bin 目录下。 - **答案**: 错误 - **解析**: 实际上,Java 的核心源码包(`src.zip` 文件)位于 JDK ...

    Java判断题.doc

    3. **Java的编译与解释**:Java源代码(.java文件)先由Java编译器(javac.exe)编译成字节码,然后在JVM中解释执行。同时,现代JVM如HotSpot也采用即时编译(JIT)技术,将频繁执行的代码编译为本地机器码,提高...

    java判断题题库.doc

    ### Java 判断题知识点解析 #### 第一章 Java 概述 1. **Java 语言具有良好的安全性与可移植性及平台无关性** 正确。Java 设计之初就考虑到了跨平台的需求,通过Java虚拟机(JVM)实现了“一次编写,到处运行”...

    java语言入门.exe

    Java语言入门是一个针对初学者的...在提供的压缩包中,"readme.txt"可能包含了学习指南或注意事项,而"java"可能是源代码文件或教程资料。通过这些资源,初学者可以逐步学习和实践Java编程,逐步迈入编程世界的大门。

    ll(1)判别

    MyEclipse和Struts是Java开发环境和框架,它们与LL(1)判别和语法树的直接关系可能不大,但在实际编程项目中,理解文法和解析技术有助于编写更高效、更健壮的代码,特别是当你需要处理用户输入或自定义配置文件时。...

Global site tag (gtag.js) - Google Analytics