Board logo

标题: 一个加壳的批处理竟无法破解(已结) [打印本页]

作者: jonsonqf     时间: 2008-6-29 15:18    标题: 一个加壳的批处理竟无法破解(已结)

前段时间看到批处理加解密的大讨论,批处理是难真正的加密的,一般都可以在临时文件夹找到源码,但是今天恰好看到这个加壳的exe,竟然无法找到源码,请有兴趣的朋友一起研究下。 貌似帖子中无法上传附件,我已经把附件上传到论坛的上传系统那里了,下载地址是: (已结,多谢下面回复的几位朋友) [ Last edited by jonsonqf on 2008-7-2 at 10:30 AM ]

作者: plp626     时间: 2008-6-29 15:44
那个用汇编写的bat2exe.com转换后的exe不生成临时文件,非一般方法可以得到源码

作者: knoppix7     时间: 2008-6-29 16:04
用Ollydbg打开EXE. 插件=> Ollydump=K.O.

作者: quya     时间: 2008-6-29 16:37
我似乎尚未发现有哪款BAT转EXE的工具能真正隐藏bat源文件。加壳的也一样。 除非源程序没有交互式的界面,而且执行速度非常快,快到你找到源文件来不及复制它就自动删除了。 所以找到源文件的简单办法就是, 执行转换了的exe文件,等到程序要你输入的时候,不理它, 到%tmp%目录找,总是能找到, 有时候还是隐藏的。 为了方便找到,在运行之前可以先清一下%tmp%目录, 把隐藏文件的选项关闭。 也许我孤陋寡闻, 所以希望哪个高手提供我一个如楼主说的找不到源文件的转换程序。(我无法下载楼主的附件,但我看了3楼帖的源码,相信在临时文件夹几乎能找到源码,因为那是个有交互界面的程序) 谢谢! 另外对于那些没有交互界面,执行速度较快的文件, 也许可以用下面的思路来抓住它。 编一个拷贝程序,加上一定的延时(延时多少视转换的执行程序的速度而定),不停的从%tmp%目录向不同目录拷贝, 然后启动那个程序,很有可能就抓住它了, 一次不行可以试多次。 [ Last edited by quya on 2008-6-29 at 09:44 PM ]

作者: mountvol     时间: 2008-6-29 16:56
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor autorun="dir *.bat&pause" 或者可以直接拷贝到你想拷贝的地方。

作者: knoppix7     时间: 2008-6-29 19:39
我说下我的结果吧. 利用If 进行命令注入的时候尝试过 Call type "%~0" 但是.这个值为空.%cd%指向执行目录. 所以..我怀疑..这个Bat执行时没有临时文件. 过几天试试filemon看看.

作者: jonsonqf     时间: 2008-6-29 21:09
Originally posted by quya at 2008-6-29 04:37 PM: 我似乎尚未发现有哪款BAT转EXE的工具能真正隐藏bat源文件。加壳的也一样。 除非源程序没有交互式的界面,而且执行速度非常快,快到你找到源文件 ...
佩服下3楼先,不过我这边临时文件夹temp确实是找不到这个的,我相信3楼应该不是在临时文件夹找到的吧?请恕我比较菜,不知道3楼的这位朋友能不能说明白一点呢?非常感谢你的解答! [ Last edited by jonsonqf on 2008-6-29 at 09:13 PM ]

作者: jonsonqf     时间: 2008-6-29 21:10
Originally posted by knoppix7 at 2008-6-29 07:39 PM: 我说下我的结果吧. 利用If 进行命令注入的时候尝试过 Call type "%~0" 但是.这个值为空.%cd%指向执行目录. 所以..我怀疑..这个Bat执行时没有临时文件. 过几天试试filemon看看.
他如果没有临时文件的话,那天怎么执行的呢?他这个应该本来就是个批处理吧?

作者: quya     时间: 2008-6-29 21:47
Originally posted by jonsonqf at 2008-6-29 09:10 PM: 他如果没有临时文件的话,那天怎么执行的呢?他这个应该本来就是个批处理吧?
凡是批处理的开头有
@shift
这一句的,肯定是从临时文件夹里找出来的, 源文件都没有这句! 我已经尝试了很多办法,都无法不生成临时文件! 请你按照我5楼的办法仔细找, 其实只要按照我的办法,用不着仔细找,应该说轻而易举就可以找到。

作者: jonsonqf     时间: 2008-6-29 22:26
Originally posted by quya at 2008-6-29 09:47 PM: 凡是批处理的开头有
@shift
这一句的,肯定是从临时文件夹里找出来的, 源文件都没有这句! 我已经尝试了很多办法,都无法不生成临 ...
多谢这位朋友的帮忙,开头的@shift这个确实和平常不同的,我找到他释放的文件了,我也奇怪,我知道的也是没有不释放的。 但是,朋友,我传上来的这个比较特殊,其实也不算特殊,只是用了其他的小把戏,我建议你下载下来研究下,对你不无裨益的,呵呵。这个释放的目录不是在临时文件夹下的哦,难怪我之前找不到了 顺便我想请教下,开头的这个@shift这个的作用我不是很理解,是为了解释什么命令么? [ Last edited by jonsonqf on 2008-6-29 at 10:29 PM ]

作者: quya     时间: 2008-6-29 22:41
Originally posted by jonsonqf at 2008-6-29 10:26 PM: 多谢这位朋友的帮忙,开头的@shift这个确实和平常不同的,我找到他释放的文件了,我也奇怪,我知道的也是没有不释放的。 但是,朋友,我传 ...
我无法下载,虽然我很想知道。 我想他可能用某种办法改变了TMP目录,最后运行完毕再改回来。

作者: dikex     时间: 2008-6-29 23:32
运行某批处理时,执行下面的命名即可找出对应的批处理文件在哪里了 wmic process where name="cmd.exe" get commandline shift 能把%0 参数改变,可能用于防止某些利用%0 取得当前批处理路径的方法

作者: quya     时间: 2008-6-29 23:59
谢谢楼主, 我下载下来看了看。 他的临时文件还是在 %tmp%目录中,它先WINRAR自解压, 然后释放一个cmd文件,不过这个CMD的第一个字符估计是带特殊字符的,所以在Window界面无法看到,但在DOS命令行可以看到。 文件名的形式是 ?cmd????.cmd (第一个看不到,最后4个字符随机) 然后我就 ren *.cmd 1.cmd, 打开1.cmd 就完事了。 [ Last edited by quya on 2008-6-30 at 12:03 AM ]

作者: jonsonqf     时间: 2008-6-30 01:06
Originally posted by quya at 2008-6-29 11:59 PM: 谢谢楼主, 我下载下来看了看。 他的临时文件还是在 %tmp%目录中,它先WINRAR自解压, 然后释放一个cmd文件,不过这个CMD的第一个字符估计是带特殊字 ...
呵呵,是的,我也找到了,不过我现在想的是怎么可以确切的得知他这个第一个字符是什么,我用了attr看了,是个很特殊的字符,我现在有几个疑问: 1.他是怎么建立这个特殊字符的文件夹,也就是说怎么打出来这个字符的,那个字符我用attr看了,好像是y是吗有2点的 2.这个文件夹既然用了这种方法隐藏了(我想应该是利用了attr的加隐藏属性),但是为什么还可以执行呢?就是@shift这句话的作用? 3.我前段时间用了一些加密工具加密,但是有些加密工具加密后,可以运行,但是加壳后却无法运行了

作者: jonsonqf     时间: 2008-6-30 01:12
Originally posted by dikex at 2008-6-29 11:32 PM: 运行某批处理时,执行下面的命名即可找出对应的批处理文件在哪里了 wmic process where name="cmd.exe" get commandline shift 能把%0 参数改变,可能用于防止某些利用%0 取得当前批处理路径的方法
又学到了一招,非常感谢这位朋友的指点 另外想请教下,对于“shift 能把%0 参数改变,可能用于防止某些利用%0 取得当前批处理路径的方法”这句话不解,利用%0可以取得当前批处理路径?具体的操作是? 因为偶比较的菜,诚心请教,还望可以再次指点一二,谢谢!

作者: dikex     时间: 2008-6-30 01:25
运行一下这个东西:
@echo off
echo %0
pause

作者: quya     时间: 2008-6-30 08:34
Originally posted by dikex at 2008-6-29 11:32 PM: 运行某批处理时,执行下面的命名即可找出对应的批处理文件在哪里了 wmic process where name="cmd.exe" get commandline shift 能把%0 参数改变,可能用于防止某些利用%0 取得当前批处理路径的方法
恰恰相反,我的看法是: 加@shift不是为了防止破解者获得执行文件路径, 而是它自身需要获得执行文件的原来路径和源文件名。否则程序可能会运行出错。 这也是为什么临时生成的批处理文件都有这句的原因。

作者: jonsonqf     时间: 2008-6-30 12:20
Originally posted by quya at 2008-6-30 08:34 AM: 恰恰相反,我的看法是: 加@shift不是为了防止破解者获得执行文件路径, 而是它自身需要获得执行文件的原来路径和源文件名。否则程序可能会运行出错。 这也是为什么临时生成的批处理文件都有这句的原因。
呵呵,其实我同意quya的这个观点,其实如果这个加壳的exe是在硬盘上,他是不会释放到临时文件夹的,而是会释放到和他同目录的文件夹中,如果这个是放在不可写的iso内的话,才会释放到临时文件夹。有些批处理加了壳之后,无法运行了,我想@shift应该是为了读取,呆会测试下就知道了,去掉后看看能不能读取

作者: jonsonqf     时间: 2008-6-30 12:23
quya,能不能麻烦回答下15楼的第一个问题呢?谢谢

作者: jonsonqf     时间: 2008-6-30 21:23
顶下,让quya看到o(∩_∩)o...

作者: quya     时间: 2008-6-30 21:35
Originally posted by jonsonqf at 2008-6-30 09:23 PM: 顶下,让quya看到o(∩_∩)o...
我看到了, 但我无法回答你的问题, 对不起。 这个应该是BAT转EXE的转换程序搞的花样, 这个程序的作者比其他的高明, 至少能蒙我们一下子。 我也想知道哪儿能找到此程序,至少也能蒙其他人一下。

作者: jonsonqf     时间: 2008-6-30 22:08
Originally posted by quya at 2008-6-30 09:35 PM: 我看到了, 但我无法回答你的问题, 对不起。 这个应该是BAT转EXE的转换程序搞的花样, 这个程序的作者比其他的高明, 至少能蒙我们一下子。 我也想知道哪儿能找到此程序,至少也能蒙其他人一下。
哈哈,没关系,确实这个程序比较好蒙人,那就希望有其他朋友用过的分享这个加密程序了

作者: knoppix7     时间: 2008-6-30 22:13
bat2exe. OllyDump对付它无敌.

作者: 313885174     时间: 2008-6-30 22:17
用第三方的任务管理器也没用?

作者: wxcute     时间: 2008-7-1 13:57
这个加壳的释放的P名字也很有特点, 在我的机子上Win系统下看不到,显示系统文件加显示隐藏文件也看不到。 只能cmd下dir 环境:NTFS文件系统,XP SP2 setup.exe释放*.cmd到同目录下 文件名是[ CMD9C56.CMD]不含中括号,开头有个Unicode字符。

作者: knoppix7     时间: 2008-7-1 17:34
不会利用文件名做删除标记.然后骗过Explore?

作者: wxcute     时间: 2008-7-1 19:34
Originally posted by knoppix7 at 2008-7-1 17:34: 不会利用文件名做删除标记.然后骗过Explore?
还真不会,我搜索下先。

作者: 19951001     时间: 2008-7-1 19:49
在临时文件夹中找到了 bat 文件,内容如下: ...... 根据楼主的要求,批处理内容已经删除。 [ Last edited by 19951001 on 2008-7-5 at 05:01 PM ]

作者: knoppix7     时间: 2008-7-1 21:15
实在Sorry.. touchnet吞掉了一个会.. 会不会 非常抱歉-0-

作者: ZJHJ     时间: 2008-7-2 23:30
只要先运行SETUP.exe,再搜索生成的*.bat或*.cmd,就会找到释放的文件路径.并没有在临时文件夹中这个加壳工具有个特点,就是释放的文件会深度隐藏.无法看到实体.所以无法打开, 不过,想个办法,用命令可把他的原文搞到手. (方法很多,只要有文件路径)哈哈藏得再深,也要你显出原码 @shift @echo off color 2e set prog=winpe 硬盘安装工具 set l1=           ╭─────────────╮ set l2=      ╭────┤ winpe 硬盘安装工具 ├────╮ set l3=      │    ╰─────────────╯  │ set l4=      │============================================ │ set l5=      │ 盛世雄风技术论坛 │ set l6=      ╰───────────────────────╯ title %prog% for %%i in (c d e f g h i j k l m n o p q r s t u v w x y z) do if exist %%i:\recycler\nul set lastdr=%%i: for %%i in (z y x w v u t s r q p o n m l k j i h g f e d c) do if exist %%i:\boot.ini set rp=%%i: if "%rp%"=="" goto nosys if exist %rp%\ldrxpe goto :existpe if exist %rp%\wxpe\ goto :existpe find /i "c:\wxpe\ssxf.org" %rp%\boot.ini >nul if %errorlevel%==0 goto :existpe goto start :existpe cls echo %l1% echo %l2% echo %l3% echo       │ 检测到您机器中已经安装了 winpe,您要卸载吗? │ echo       │ [1] 卸载 winpe,并重新安装    │ echo       │ [2] 卸载 winpe,并退出安装   │ echo       │ [q] 退出安装                 │ echo %l4% echo %l5% echo %l6% echo. set choice= set /p choice=        请选择要进行的操作 (1/2/q) ,然后按回车: if %choice%choice==choice goto :existpe if not '%choice%'=='' set choice=%choice:~0,1% if /i '%choice%'=='1' set choi=1&&goto :uninstall if /i '%choice%'=='2' goto :uninstall if /i '%choice%'=='q' exit goto :existpe :uninstall if exist %rp%\ldrxpe attrib -s -h -r %rp%\ldrxpe && del /q /f %rp%\ldrxpe >nul if exist %rp%\wxpe attrib -s -h -r %rp%\wxpe && rd %rp%\wxpe /s /q>nul if exist %lastdr%\wxpe attrib -s -h -r %lastdr%\wxpe && rd %lastdr%\wxpe /s /q>nul attrib %rp%\boot.ini -s -h -r if exist %rp%\boot.bak ( attrib %rp%\boot.bak -s -h -r type %rp%\boot.bak|find /i /v "c:\wxpe\ssxf.org">%rp%\boot.ini ) else ( copy %rp%\boot.ini %rp%\boot.bak /y>nul type %rp%\boot.bak|find /i /v "c:\wxpe\ssxf.org">%rp%\boot.ini ) copy %rp%\boot.ini %rp%\boot.bak /y>nul if exist %rp%\boot.bak attrib -s -h -r %rp%\boot.bak&&del %rp%\boot.bak>nul attrib %rp%\boot.ini +s +h +r if %choi%choi==1choi (echo.&&echo         卸载完成,请按任意键准备安装 。。。&&pause>nul&&goto start) echo.&&echo         卸载完成,请按任意键退出 。。。 pause>nul exit :start cls echo. echo %l1% echo %l2% echo %l3% echo       │ [1] 安装winpe到硬盘 │ echo       │ [q] 退出安装                 │ echo %l4% echo %l5% echo %l6% set choice= set /p choice=        请选择要进行的操作 (1/q) ,然后按回车: if %choice%choice==choice goto start if not '%choice%'=='' set choice=%choice:~0,1% if /i '%choice%'=='1' goto install if /i '%choice%'=='q' exit goto start :install set boot=%rp%\boot.ini echo. echo         正在复制文件,请稍候 。。。 md %rp%\wxpe\ md %lastdr%\wxpe\ copy setupldr.bin %rp%\ldrxpe /y >nul copy ssxf.org %rp%\wxpe\ /y >nul copy ssxf %rp%\wxpe\ /y >nul copy winpe.is_ %rp%\wxpe\ /y >nul if exist winpe.ini copy winpe.ini %lastdr%\wxpe\ /y >nul if exist op.wim copy op.wim %lastdr%\wxpe\ /y >nul attrib -s -h -r %rp%\boot.ini if exist %rp%\boot.bak attrib -s -h -r %rp%\boot.bak copy %rp%\boot.ini %rp%\boot.bak >nul type %rp%\boot.bak|find /i /v "c:\wxpe\ssxf.org">%rp%\boot.ini echo c:\wxpe\ssxf.org="winpe 应急维护系统">>%rp%\boot.ini type %rp%\boot.ini>%rp%\bot.bak type %rp%\bot.bak|find "boot loader" /i>%rp%\boot.ini echo timeout=5 >>%rp%\boot.ini type %rp%\bot.bak|find "boot loader" /i /v|find "timeout" /i /v>>%rp%\boot.ini attrib +s +h +r %rp%\boot.ini @del %rp%\bot.bak >>nul attrib +s +h +r %rp%\boot.ini attrib +s +h +r %rp%\boot.bak attrib +s +h +r %rp%\ldrxpe attrib +s +h +r %rp%\wxpe attrib +s +h +r %rp%\wxpe\*.* attrib +s +h +r %lastdr%\wxpe attrib +s +h +r %lastdr%\wxpe\*.* goto :success :nosys echo %l1% echo %l2% echo %l3% echo       │ 好像您的机器中没有安装操作系统哦 │ echo       │ 请确认后再执行本安装程序。    │ echo %l4% echo %l5% echo %l6% echo. echo         请按任意键退出 。。。 pause >nul exit :success echo. echo         恭喜!! echo. echo         已经成功将镜像 winpe 安装到您的 %rp% 盘。 echo. echo         请按任意键退出 。。。 pause >nul exit ------------------------ 谁知道这个加壳工具是什么名字? 我感觉还算是目前较好的.(虽然被破了....) [ Last edited by ZJHJ on 2008-7-4 at 12:43 PM ]

作者: wjdidi     时间: 2008-7-7 15:41
从这个贴子学到不少东西啊

作者: qzwqzw     时间: 2008-7-8 12:41
根据我的分析 那句@shift是没用且有害的蛇足之笔 因为程序在释放出批处理源码后 是使用以下方式来调用批处理的 cmd /c "批处理名 批处理所需命令行参数" 如果以 setup.exe 1 2 3 4 5 6 7 8 9 的方式执行加密程序 执行至批处理内部后 环境变量 cmdcmdline 为 cmd /c "" CMD5254.CMD" 1 2 3 4 5 6 7 8 9" 命令行参数矩阵 %* 为 1 2 3 4 5 6 7 8 9 命令名 %0 为 " CMD5254.CMD" 命令行参数1 %1 为 1 其余参数依次排列 其中的批处理文件名是以 (0xA0)CMD 起始 再加随机的四位十六进制数组成 而在 @shift 之后 cmdcmdline、%*均不变 唯一变化的是 %0 ~ %9 也就是 %0 变为 1 %1 变为 2 其余依次排列 可见在@shift之后 本来是命令名的%0变为了命令行参数1 而当在程序中使用 %0 引用批处理自身时 就是出错!