windows可执行文件是什么?

是具有PE文件格特性的文件,例如:.exe、dll、ocx等文件。

注:(这里只是让大家能明了一些,其实,可执行与否,和后缀没有什么关系,后缀只是windows方便管理用的)。

如:在xp sp3上,你双击或右键打开一个可执行文件时。并不是那个可执行文件自动执行的。它并不存在自动运行能力。而仅仅是,调用了CreateProcessW函数来启动这个可执行文件。如下,是桌面上,双击或右键打开一个记事本软件,堆栈情况,如下

  1. CPU Stack
  2. Address   Value      ASCII Comments
  3. 0007DFE8   ; RETURN from kernel32.CreateProcessW to SHELL32.7D5DA1F8
  4. 0007DFEC  ; ApplicationName = "C:\Documents and Settings\heyueyi\桌面\notepad.exe"
  5. 0007DFF0   ; CommandLine = ""C:\Documents and Settings\heyueyi\桌面\notepad.exe" "
  6. 0007DFF4   ; pProcessSecurity = NULL
  7. 0007DFF8   ; pThreadSecurity = NULL
  8. 0007DFFC    ; InheritHandles = FALSE
  9. 0007E000   0; CreationFlags = CREATE_NEW_CONSOLE|CREATE_UNICODE_ENVIRONMENT|CREATE_DEFAULT_ERROR_MODE
  10. 0007E004   ; pEnvironment = NULL
  11. 0007E008   ; CurrentDirectory = "C:\Documents and Settings\heyueyi\桌面"
  12. 0007E00C   ; pStartupInfo = 00135FB0 -> STARTUPINFOW {Size=68., Reserved1=NULL, Desktop=NULL, Title=NULL, X=0, Y=0, Width=0, Height=0, XCountChars=0, YCountChars=0, FillAttribute=0, Flags=STARTF_USESHOWWINDOW|400, ShowWindow=SW_SHOWNORMAL, Reserved2=0, Reserved3=NULL,
  13. 0007E010   ; pProcessInformation = 00135FFC -> PROCESS_INFORMATION {hProcess=NULL, hThread=NULL, ProcessID=0, ThreadID=0}

这个还和注册表是相关的,exefile在注册表中的选项(exefile是后缀是exe的文件,如txt,那它的打开方式, 就会出现在,txtfile里)

这就是exe文件默认双击右键打开的方式。使用了命令行。“"%1" %*”,也就是,第一个参数,就是可执行文件,也是就是其本身。如果,将其改为"c:\WINDOWS\NOTEPAD.EXE" %1,那就是,使用notepad,打开那个程序。(这也是一种病毒启动的一种方式)。

将以下代码,编译成可执行文件

  1. #include "stdio.h"
  2. #include "windows.h"
  3. BOOL LineProcess(char *LineCmd)//通过命令驱动程序
  4. {
  5. STARTUPINFO si;
  6. PROCESS_INFORMATION pi;
  7. memset(&si,0,sizeof(STARTUPINFO));
  8. si.cb = sizeof(STARTUPINFO);
  9. si.dwFlags = STARTF_USESHOWWINDOW;
  10. si.wShowWindow = SW_SHOW;
  11. return CreateProcess(NULL,LineCmd,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
  12. }
  13. void main(int argc,char *argv[])
  14. {
  15. int i = 1;
  16. char LineCmd[500]={0};
  17. if(argc>1)
  18. {
  19. printf("%s\n",argv[i]);
  20. strcat(LineCmd,"\"");
  21. strcat(LineCmd,argv[i]);
  22. strcat(LineCmd,"\" ");
  23. }
  24. for (i = 2 ; i < argc ; ++i)
  25. {
  26. printf("%s\n",argv[i]);
  27. strcat(LineCmd,argv[i]);
  28. strcat(LineCmd," ");
  29. }
  30. if(strlen(LineCmd)>0)
  31. LineProcess(LineCmd);
  32. printf("启动了,我的程序!!");
  33. system("pause");
  34. }

接着,将上面的注册表中的,""%1" %*"改为"e:\workplace\Debug\1.exe" "%1" %*

这样就可以,达到后台启动的目的。当你,双击或右键打开一个可执行文件时(通常是exe后缀的文件 或其快捷键),它就会先运行,我的程序,然后,通过我的程序,来运行,其它的程序了。

所以,在正常情况下,(没有做系统修改),在桌面打开的程序的父进程是:explorer。

同样,我可以,把txt作为可执行文件后缀,就是可以将,txtfile,中的open/command中的默认值改为:“%1” %*。这样你的,所有txt就是咱们“所谓”的可执行文件。将一个exe文件改成后缀是txt,双击或右键打开,一样是可以运行。当然,你直接打开的是一个文本的话,它就会提示你,不是一个有效的应用程序。

说了这么多,就是想说明,文件名与是否是可执行文件没有什么必然的关系。从上总结,与CreateProcessW或CreateProcessA这两API关系紧密。(W与A的区别在于,unicode 与assic)。

接下来,来讨论一下,CreateProcessW(A)如果,是一个完整路径,那它就会对,些文件进行,判断是不是,cmd或bat(这俩虽说理论上不是可执行,但在window是脚本,也是可以执行的,所以双击或右键打开这后缀文件也会运行)。

前期工作会对createprocess传来的,参数,进行分析。例如:程序路径(名),如果,仅是一个文件名,那就要,使用SearchPathW()查打这个文件。得到完成路径后,判断是 不是PE文件,如果不是那就判断后缀是不是cmd或bat(这俩种类型理论上不是可执行,但在window是脚本,也是可以执行的,所以双击或右键打开这后缀文件也会运行)。

主要运行API下:

NtOpenFile //打开那个文件 

NtCreateSection//使用NTOpenFile上的返回的句柄,创建一个section.注:以前,很多杀毒软件,就是hook它来,监视进程的启动.

NtCreateProcessEx//使用上面的section,创建一个进程,但是这个是无法运行的。只是创建进程一些结构:PEB、EPROCESS等,在这里,就有父进程参数。

RtlCreateProcessParameters//为进程创建环境,命令行就会在此

NTCreateThread//为进程创建线程,到这里了,才能运行。

以上只是,简单的步骤。

1、修改注册表,exefile 中有open/command中的默认选项,来达到隐藏启动效果

2、Hook API NtCreateSection,能达到监控程序的启动。如果,想禁用,那就让其返回不成功。

3、Hook API NtCreateProcessEx,可以修改父进程句柄,来达到一定的欺骗性。(具有一定的免杀效果,仅限xp系统,在win7下不行,因为,在win7具有一个权限继承特性,如果在win7能改的话,那么,就很容易提权,所以,win7下不行。)

windows 可执行文件分析的更多相关文章

  1. windows 无法分析或处理 pass 报错问题汇总

    日光月华 发表于 2015-2-9 22:02:42 https://www.itsk.com/thread-346404-1-1.html 系统封装失败遇到windows 无法分析或处理 pass ...

  2. 使用Windows的分析等待链(analyze wait chain)来诊断没用响应的应用

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:使用Windows的分析等待链(analyze wait chain)来诊断没用响应的应用.

  3. windows共享文件分析

    ·小结: 1.win+r,\\ip  弹出登录框,输入Guest,密码空登录:前置检查来宾账户状态: 2.net use  查看当前已经连接到的主机 实践: C:\Users\sas>net u ...

  4. 《Windows内核分析》专题-索引目录

    该篇博客整理了<Windows内核分析>专题的各篇博文,方便查找. 一.保护模式 二.进程与线程 [Windows内核分析]KPCR结构体介绍 (CPU控制区 Processor Cont ...

  5. [Windows内核分析]KPCR结构体介绍 (CPU控制区 Processor Control Region)

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 逆向分析操作系统内核代码至少需要具备两项技能: 段页汇编代码非常懂 ...

  6. [转]linux,windows 可执行文件(ELF、PE)

    ELF (Executable Linkable Format)UNIX类操作系统中普遍采用的目标文件格式 . 首先要知道它有什么作用:工具接口标准委员会TIS已经将ELF作为运行在Intel32位架 ...

  7. windows窗口分析,父窗口,子窗口,所有者窗口

    (本文尝试通过一些简单的实验,来分析Windows的窗口机制,并对微软的设计理由进行一定的猜测,需要读者具备C++.Windows编程及MFC经验,还得有一定动手能力.文中可能出现一些术语不统一的现象 ...

  8. 利用powershell进行windows日志分析

    0x00 前言 Windows 中提供了 2 个分析事件日志的 PowerShell cmdlet:一个是Get-WinEvent,超级强大,但使用起来比较麻烦:另一个是Get-EventLog,使得 ...

  9. linux,windows 可执行文件(ELF、PE)

    现在PC平台流行的可执行文件格式(Executable)主要是Windows下的PE(Portable Executable)和Linux的ELF(Executable Linkable Format ...

随机推荐

  1. csv转字典

    with open('filename','r') as csv_f: reader = csv.reader(csv_f) fieldnames = next(reader) csv_reader ...

  2. _IRP struct

    Windows XP x86 +0x000 Type : Int2B +0x002 Size : Uint2B +0x004 MdlAddress : Ptr32 _MDL +0x000 Next : ...

  3. finalize的作用

    1. finalize的作用 finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法. finalize()与C++中的析构函数 ...

  4. JS对象 charAt() 方法可返回指定位置的字符。返回的字符是长度为 1 的字符串。

    返回指定位置的字符 charAt() 方法可返回指定位置的字符.返回的字符是长度为 1 的字符串. 语法: stringObject.charAt(index) 参数说明: 注意:1.字符串中第一个字 ...

  5. C#利用资源文件设置软件自适应多语言

    在项目更目录下添加两个资源文件,以适应中英文两种版本,如Resource.zh_CN.resx和      Resource.en-US.resx  ,两个资源文件的ID都一样,值分别配置相应的中英文 ...

  6. 关于Modelsim安装闪退

    在盗版Windows系统上,安装Modelsim时可能出现闪退. 现象表现为,在任务管理器中仍然有Modelsim的进程,但是看不到安装界面. 碰到这种情况可以尝试如下方法:退到安全模式下安装. 一般 ...

  7. 【JZOJ6370】基础 fake 练习题

    description 装饰者坐在树荫下听着长者讲述以前的故事: 大神 yk 非常喜欢树,便钦点班里的 n 个小蒟蒻站在一棵 n 个点以 1 为根的树上,并且每个点上恰好有 1 个小蒟蒻. 大神 yk ...

  8. HDU - 1560 DNA sequence

    给你最多8个长度不超过5的DNA系列,求一个包含所有系列的最短系列. 迭代加深的经典题.(虽然自己第一次写) 定一个长度搜下去,搜不出答案就加深大搜的限制,然后中间加一些玄学的减枝 //Twenty ...

  9. C#实现程序开机启动

    如何用c#实现开机启动?其实用c#实现程序的开机启动大致有两种方法,就是写入注册表或者采用服务程序,最近一直研究着用C#来操作注册表,下面介绍的方法便是用注册表来实现程序随开机启动(高手就不用看了,嘿 ...

  10. Java学习之创建对象内存使用机制

    Java内存空间分两种,一种是栈内存,有多个,一种是堆内存,只有一个,在堆内存中又有一块方法区. 方法区中存储的是:类的信息(类名,类的直接父类,类的访问修饰符),类变量,类方法代码,实例方法代码,常 ...