2023年12月3日发(作者:)

更多相关信息请访问--/Blast'sSecurityNSIS简单调试(执行程序部分)前:这篇文章只算得上是一点小笔记,如果你碰到了一个NSIS打包的恶意文件却不知道它是怎么被执行起来的,可以看看这篇文章,关于更深入的部分,我水平不足,还是交由高手们去打理吧^_^。水准:初级QQ50189695主页一.NSISNullsoft脚本安装系统(英语:NullsoftScriptableInstallSystem,(NSIS))为一个开放源代码脚本驱动的封装安装档用工具。可以用其脚本语言自定安装的流程,同时支援多种语系的安装接口。特色:可脚本控制,多国语系的安装接口,可用C,C++,或Delphi写出NSIS的外挂(Plugins),支援ZLib,BZip2,LZMA这三种压缩方式,支援网络安装模式与档案Patching,相容于目前的所有主要的Windows版本介绍来源:/zh-cn/NSIS官方网站:/Main_Page二.NSIS执行程序的命令NSIS执行程序有哪些命令呢?帮助手册中提到有Exec、ExecShell、ExecWait。下面是帮助手册中对他们的介绍,在每段介绍后我会稍稍的翻译一下。与之前段落重复部分不翻译了。4.9.1.2Exec邮箱50189695@作者BlastXiangNullsoft脚本安装系统NSIS安装器开发Nullsoft最新版本2.46/2009-12-05(4个月前)操作系统Windows,POSIX类型安装程式许可协议zlib/libpnglicense网站文章由Blast编写/更多相关信息请访问--/Blast'satthefilespecifiedmustexistonthetargetsystem,notthecompilingsystem.$,:Exec'"$"parameters'.Ifyoudon''"$"'Exec'"$"someparameters'4.9.1.2Exec语法:Exec[参数]执行指定程序并立即继续。注意,指定的文件必须在目标系统(即安装程序会在其上执行的系统)而非编译系统(即编写代码者的系统)。$OUTDIR用来指定工作目录。如果程序无法执行,将会设置一个错误标志。注意,如果命令包含空格,你应该使用引号来把它与其他参数分割开。如果你不把他们放在引号里面,在9x系统上不论有没有参数都不会运行。4.9.1.3ExecShellactioncommand[parameters][SW_SHOWDEFAULT|SW_SHOWNORMAL|SW_SHOWMAXIMIZED|SW_SHOWMINIMIZED|SW_HIDE]atactionisusually"open","print",etc,tersandtheshowtypeareoptional.$ell"open""/"ExecShell"open""$"ExecShell"print""$"4.9.1.3ExecShellactioncommand[parameters][SW_SHOWDEFAULT|SW_SHOWNORMAL|SW_SHOWMAXIMIZED|SW_SHOWMINIMIZED|SW_HIDE]执行指定的程序,使用ShellExecute。注意,action通常为open,print等等(即ShellExecute的Operation参数所允许的参数),但是也可以传入空字串,表示默认动作。参数和showtype(显示类型)都是可选的。4.9.1.4ExecWaitcommand[user_var(exitcode)]tputvariableisspecifiedExecWaitsetstheerrorflagiftheprogramexecutedreturnsanonzeroerrorcode,tputvariableisspecified,ExecWaitsetsthevariablewiththeexitcode(andonlysetstheerrorflagifanerroroccurs;ifanerroroccursthecontentsoftheuservariableareundefined).Note,:ExecWait'"$"parameters'.Ifyoudon'tputitinquotesitwillnotworkonWindows9xwithor文章由Blast编写/更多相关信息请访问--/Blast'it'"$"'ExecWait'"$"'$0DetailPrint"someprogramreturned$0"4.9.1.4ExecWaitcommand[user_var(exitcode)]执行指定程序且一直等待到程序执行完、退出。(参阅Exec以获取更多消息)如果,没有指定输出参数且程序执行后返回一个非零错误码或是存在错误时,程序会设置错误标记。如果指定了输出参数,ExecWait将设置退出代码(并且仅在错误发生时、用户相关变量未定义时设置错误标记)。三.这三条命令对应的APINSIS使用两种Win32API,分别为ShellExecute(对应ExecShell)和CreateProcess(对应Exec、ExecWait)。即使认为Exec使用的是WinExec也无妨,因为WinExec最终还是调用CreateProcess函数。四.ShellExecute和CreateProcess的真身?可以建立一个简单的C程序,然后调试一下就知道了,如BCB,void__fastcallTForm1::FormCreate(TObject*Sender){LPCTSTRa;STARTUPINFOStartupInfo;PROCESS_INFORMATIONProcessInfo;rved=NULL;e="";top="";=CW_USEDEFAULT;=CW_USEDEFAULT;e=CW_USEDEFAULT;e=CW_USEDEFAULT;indow=SW_SHOW;rved2=0;rved2=NULL;=sizeof(StartupInfo);a="testshellexecute";ShellExecute(NULL,"open","","","",SW_SHOW);a="testcreateprocess";CreateProcess("c:","",NULL,NULL,TRUE,CREATE_DEFAULT_ERROR_MODE,NULL,NULL,&StartupInfo,&ProcessInfo);a="testwinexec";WinExec("",SW_SHOW);}文章由Blast编写/更多相关信息请访问--/Blast'sSecurity可以在BCB中直接调试,也可生成exe之后快速地使用OD的字串参考,定位到testshellexecute行下断,每个函数跟进去一看00401BBF|.C745F492314>mov00401BC6|.6A0500401BC8|.68B3314000pushpushpushpushcallF4pushdwordptr[ebp-C],004031925push004031B3;|Parameters="";|;|;|hWnd=NULL;ShellExecuteA004031B4;testdwordptr[ebp-C],;;/IsShown=5;|testcreateprocessc:00401BCD|.68B231400000401BD2|.68A931400000401BD7|.68A431400000401BDC|.6A0000401BDE|.E8ED0E000000401BE3|.C745004031B2004031A9004031A40B4314>movleapushleapushpushpushpushpushpushpushpushpushcallpushpushcall100004031E4004031C7createprocessc:00401BEA|.8D4DA000401BED|.5100401BEE|.8D45B000401BF1|.5000401BF2|.6A0000401BF4|.6A0000401BF6|.6800000004CREATE_DEFAULT_ERROR_MODE00401BFB|.6A0100401BFD|.6A0000401BFF|.6A0000401C01|.68E431400000401C06|.68C731400000401C0B|.E8880E000000401C17|.6A0500401C19|.68F231400000401C1E|.E8A50E0000;|InheritHandles=TRUE;|pThreadSecurity=NULL;|pProcessSecurity=NULL;|;|c:;CreateProcessA;;/ShowState=SW_SHOW;|;WinExececx,dwordptr[ebp-60]ecxeax,dwordptr[ebp-50]eax004000000;/pProcessInfo;|;|pStartupInfo;|CurrentDir=NULL;|pEnvironment=NULL;|CreationFlags=dwordptr[ebp-C],004031E55004031F200401C10|.C745F4E5314>mov就可以看到CreateProcess/WinExec()实际都是会调用CreateProcessA(然后调用CreateProcessInternalA)的:7C8615CEE813C8FBFFcallCreateProcessInternalA7C80238EE853BA0100callCreateProcessInternalA五.为什么要调试如果你需要知道一个恶意的NSIS包到底执行了什么东西的话,你需要调试。但是能不能使用其他软件把NSISSCRIPT像SFXSCRIPT一样解出来呢?官方的意思是:不能官方文章(Retrievedfrom"/Can_I_decompile_an_existing_installer"):文章由Blast编写/更多相关信息请访问--/Blast'sSecurityCanIdecompileanexistinginsttalleritselfdoesn'edeveloper'schoicewhetherthesourcecodeand/re,however,externaltoolsthatallowthis.7-zip(version4.40betaatthetimeofthiswriting)supportsdecompressingNSISinstallerscompressedwithlzmaorbzip,butthesourcecodeisstillpartiallycompileeralnotetosoftwaredevelopers,youshoulduseapluginlikeDCryptDllifyouneedtoprotectcertainfilesinyourinstaller.翻译:能否将现有安装包反编译?当前NSIS安装包不能被完全的反编译。安装包自身不提供任何方式去在不执行的情况下解压文件或脚本。当然代码公不公开,文件发不发布这些事完全看程序员的意思。但是一些程序支持这样,7zip支持解压通过LZMA或BZIP方式压缩的NSIS安装包,但是源代码还是被编译的,在代码能被重编译前需要特殊的修改。TC也有一个解压插件。Blast注:虽然可以解压文件,但是事实上无法显示NSISSCIPRT这一重要部分,如下图。给软件开发者的建议是,你可以使用DCryptDll这样的插件,如果你需要保护安装包中文件的话。图:LZMA算法的压缩包可以被解压,但是无法显示出NSIS脚本,也就是说依然看不到它的动作。文章由Blast编写/更多相关信息请访问--/Blast'sSecurity图:对比一下就知道,只有解压出脚本(图为RAR-SFX脚本)才知道这个程序到底要干什么。六.调试方法既然这儿不是深入的调试,而且也只是介绍执行程序部分(否则这篇文章就是现在的几十几百倍的长度了,当然我也写不出那么彻底),当然只是截取到上面提到的三个命令就行了。NSIS一般准备流程是:获取自身命令行-获取临时目录位置(GetTempPathA)-获取系统目录位置(GetWindowsDirectoryA)-建立临时文件夹用于执行操作-获取系统分配的临时文件名-自检-如果未通过,报错、退出-通过则继续安装流程知道了这三个函数对应的API,但是却不知道具体调用了哪个函数,这样只能广撒网了,分别断下ShellExecuteA和CreateProcessA(或CreateProcessInternalA),OD中下断命令:按下Alt+F1打开调试命令窗口(注:如果你下面有接输入就行了,不用按Alt+F1了)BPaddr,[cond]在指定地址设定断点,中断条件可选。如bp403297,eax==0bpLoadLibraryA的话直文章由Blast编写/更多相关信息请访问--/Blast'sSecurity紫色为条件断点,红色为断点。七.调试结果首先在虚拟环境中打开一个NSIS的恶意程序,输入bpShellExecuteA回车,bpCreateProcessA回车。F9运行,可以发现已经被截断一次:了解到它是想执行ie浏览器,访问一个站点。继续F9,又看到了它调用了CreateProcess文章由Blast编写/更多相关信息请访问--/Blast'sSecurity原来是想执行%temp%。(是什么?ns??.tmp是通过系统分配的临时文件名,而一般这个文件是一个控制台程序,用于执行参数中指定的程序用的。)再一次执行,提示程序退出,这样简单的一点调试也结束了。八.结束NSIS简单调试(执行程序部分全文结束)这篇文章只算得上是一点小笔记,如果你碰到了一个NSIS打包的恶意文件却不知道它是怎么被执行起来的,可以看看这篇文章,关于更深入的部分,我水平不足,还是交由高手们去打理吧^_^。QQ50189695邮箱50189695@主页作者BlastXiang文章由Blast编写/