zoukankan      html  css  js  c++  java
  • windows 可执行文件分析

    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 Settingsheyueyi桌面 otepad.exe"  
    5. 0007DFF0   ; CommandLine = ""C:Documents and Settingsheyueyi桌面 otepad.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 Settingsheyueyi桌面"  
    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:WINDOWSNOTEPAD.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 ",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 ",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.   
    35.   
    36. }  

    接着,将上面的注册表中的,""%1" %*"改为"e:workplaceDebug1.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下不行。)

  • 相关阅读:
    “结束进程”和“结束进程树”有啥区别啊?
    为什么second是秒也是第二?
    java中System类
    记忆是如何形成的、又是如何存储在我们的大脑里的?
    真正支配整个世界的十种算法
    编写一个JAVA小程序取得IP地址
    windows下bat批处理执行sql语句__Mysql
    Windows批处理命令用法
    mysql 查看某个数据库中所有表的数据量
    truncate table时存在外键约束的解决办法
  • 原文地址:https://www.cnblogs.com/vcerror/p/4289148.html
Copyright © 2011-2022 走看看