手动跟踪进阶第六篇PE-SHiELD V0.25(图)

ZDNet 安全频道频道 更新时间:2008-06-13 作者: 来源:SohuIT

本文关键词:dword eax EBX

  PE-SHiELD V0.25简介



  PE-SHiELD is a program, which encrypts 32-bit Windows EXE files, leaving them still executable. The previous version was over a year in the wild and there is still no unpacker for it.



  下载地址:



  本地下载



  软件截图.



  



  



  



  我们直接在Dos界面下运行PESHIELD.exe,软件提示语法和参数,通常选默认值就可以了。



  我们将Win98的记事本拷到Pepack目录同一层,然后在Dos界面输入



  PESHIELD nottepad.exe



  回车后记事本就加了一层壳,呵呵,连图标都压没了。和pepack界面一样,但强度高得多。有花指令,检查调试器含od,反模拟跟踪,SEH干扰调试语句等。



  首先必须的工具要准备好



  脱壳目标,PESHIELD0.25加壳的记事本。



  本地下载



  安装软件后用Peid测NOTEPAD.EXE的壳为PESHiELD 0.25 -> ANAKiN



  手动脱壳建议大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推荐。



  我们把Od中的选项-调试选项-异常选项卡中



  手动脱壳时,用Olldbg载入程序,脱壳程序里面会有有好多循环。对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈。不要用Peid查入口,单步跟踪,提高手动找入口能力。



  除了忽略在KERNEL32 中的内存访问异常打勾,其余一个勾都不打,请检查自己的Od设置。



  用OD载入程序后。



  确定一个入口警告,Od提示程序加壳,选不继续分析。



  0040D000 > 60 PUSHAD 停在这里。



  0040D001 E8 2B000000 CALL NOTEPAD.0040D031



  0040D006 0D 0A0D0A0D OR EAX,0D0A0D0A



  0040D00B 0A52 65 OR DL,BYTE PTR DS:[EDX+65]



  0040D00E 67:6973 74 6572>IMUL ESI,DWORD PTR SS:[BP+DI+74],6465726>



  0040D016 20746F 3A AND BYTE PTR DS:[EDI+EBP*2+3A],DH



  0040D01A 204E 4F AND BYTE PTR DS:[ESI+4F],CL



  0040D01D 4E DEC ESI



  ...............................................................



  先F9运行看看。



  程序异常,是加密壳,有SEH陷阱语句。



  0040D113 F3: PREFIX REP: ; 多余的前缀



  0040D114 23BE FFAA9F21 AND EDI,DWORD PTR DS:[ESI+219FAAFF]



  0040D11A 1F POP DS ; 修正的段位寄存器



  0040D11B 0D B7FBC989 OR EAX,89C9FBB7



  0040D120 4C DEC ESP



  0040D121 05 4A17516D ADD EAX,6D51174A



  0040D126 D4 1A AAM 1A



  0040D128 1F POP DS ; 修正的段位寄存器



  Shift+F9想忽略异常,但Od提示被调试的程序无法处理异常,然后退出。这是程序检查到Od在调试,立即执行退出代码。



  Ctrl+F2重来,用插件隐藏Od,见截图。



  



  



  F9运行,



  异常1,



  0040D232 8DC0 LEA EAX,EAX ; 非法使用寄存器



  0040D234 CD 20 INT 20



  用Shift+F9忽略异常继续运行。



  异常2.



  0040D4D7 8DC0 LEA EAX,EAX ; 非法使用寄存器



  0040D4D9 CD 20 INT 20



  0040D4DB 64:8F03 POP DWORD PTR FS:[EBX]



  再用Shift+F9程序运行。



  Ctrl+F2重来,用插件隐藏Od.



  通过前面的SEH经验看堆栈。



  0012FF9C 0012FFE0 指针到下一个 SEH 记录



  0012FFA0 0040D4AC SE 句柄



  40D4AC是异常处理完毕出口。



  我们Ctrl+G ,输入 40D4AC ,回车



  0040D4AC 8B4424 0C MOV EAX,DWORD PTR SS:[ESP+C] 到这里下断点,F9运行断在这里后取消断点



  0040D4B0 8380 B8000000 0>ADD DWORD PTR DS:[EAX+B8],4 注意这里的堆栈值40D4D7+4=40D4DB



  学自jeffzhang的未知加密壳脱文。



  0040D4B7 53 PUSH EBX



  0040D4B8 33DB XOR EBX,EBX



  0040D4BA 8958 04 MOV DWORD PTR DS:[EAX+4],EBX



  0040D4BD 8958 08 MOV DWORD PTR DS:[EAX+8],EBX



  0040D4C0 C740 18 5501000>MOV DWORD PTR DS:[EAX+18],155



  0040D4C7 8958 0C MOV DWORD PTR DS:[EAX+C],EBX



  0040D4CA 8958 10 MOV DWORD PTR DS:[EAX+10],EBX



  0040D4CD 5B POP EBX



  0040D4CE 33C0 XOR EAX,EAX //表示已修复,可以从异常处继续执行



  0040D4D0 C3 RETN 如果你执行这里的返回语句,将迷失在系统领空。



  0040D4D1 64:FF33 PUSH DWORD PTR FS:[EBX]



  0040D4D4 64:8923 MOV DWORD PTR FS:[EBX],ESP



  0040D4D7 8DC0 LEA EAX,EAX ; 非法使用寄存器



  0040D4D9 CD 20 INT 20



  0040D4DB 64:8F03 POP DWORD PTR FS:[EBX] 在这里下断点吧。顺利到达后取消断点。



  0040D4DE 8BE0 MOV ESP,EAX



  0040D4E0 8B85 A7120000 MOV EAX,DWORD PTR SS:[EBP+12A7] 无特别提示,一律F8过。



  0040D4E6 EB 03 JMP SHORT NOTEPAD.0040D4EB



  0040D4EB 0340 3C ADD EAX,DWORD PTR DS:[EAX+3C]



  0040D4EE EB 01 JMP SHORT NOTEPAD.0040D4F1



  0040D4F1 8BC8 MOV ECX,EAX ; NOTEPAD.00400080



  0040D4F3 EB 02 JMP SHORT NOTEPAD.0040D4F7



  ...............................................................



  0040D643 EB 01 JMP SHORT NOTEPAD.0040D646



  0040D646 8D85 3A110000 LEA EAX,DWORD PTR SS:[EBP+113A]



  0040D64C EB 02 JMP SHORT NOTEPAD.0040D650



  0040D650 50 PUSH EAX ; NOTEPAD.0040E13A



  0040D651 EB 01 JMP SHORT NOTEPAD.0040D654



  0040D654 8B85 6B120000 MOV EAX,DWORD PTR SS:[EBP+126B] ;kernel32.CreateFileA



  0040D65A EB 01 JMP SHORT NOTEPAD.0040D65D



  ...............................................................



  0040D6A0 E8 110B0000 CALL NOTEPAD.0040E1B6



  0040D6A5 EB 01 JMP SHORT NOTEPAD.0040D6A8



  0040D6A8 89AD 1F080000 MOV DWORD PTR SS:[EBP+81F],EBP ; NOTEPAD.



  0040D6AE EB 01 JMP SHORT NOTEPAD.0040D6B1



  0040D6B1 8D95 87110000 LEA EDX,DWORD PTR SS:[EBP+1187]



  0040D6B7 EB 01 JMP SHORT NOTEPAD.0040D6BA



  0040D6BA 8D8D 1E080000 LEA ECX,DWORD PTR SS:[EBP+81E]



  0040D6C0 EB 01 JMP SHORT NOTEPAD.0040D6C3



  0040D6C3 52 PUSH EDX ; NOTEPAD.0040E187



  0040D6C4 EB 01 JMP SHORT NOTEPAD.0040D6C7



  0040D6C7 6A 00 PUSH 0



  0040D6C9 EB 01 JMP SHORT NOTEPAD.0040D6CC 省去的代码有些是检查调试器。



  0040D6CC 83C2 04 ADD EDX,4



  0040D6CF EB 01 JMP SHORT NOTEPAD.0040D6D2



  ...............................................................



  0040D6E1 EB 01 JMP SHORT NOTEPAD.0040D6E4



  0040D6E4 8B85 6C110000 MOV EAX,DWORD PTR SS:[EBP+116C] ;kernel32.CreateThread



  0040D6EA EB 01 JMP SHORT NOTEPAD.0040D6ED



  0040D6ED E8 C9060000 CALL NOTEPAD.0040DDBB



  0040D6F2 EB 01 JMP SHORT NOTEPAD.0040D6F5 慢,小心了。



  0040D6F5 FFB5 7F110000 PUSH DWORD PTR SS:[EBP+117F] ;kernel32.ExitThread



  0040D6FB FF85 83110000 INC DWORD PTR SS:[EBP+1183]



  0040D701 C3 RETN 这里会返回系统领空,我进去怎么也出不来。



  怎么办,进系统领空后,不久程序就运行,跟踪失败。呵,山人自有妙计。我不知道下面哪个语句是从系统领空出来后继续执行的,从40d702开始,到 0040D8A7 这里我全部下断点,F9运行看你中不中断。用F2和向下键下断点,很辛苦,比跟进系统领空要强一点。这个系统领空里面再次检查断点,调试器,模拟跟踪,等。过后就经过无数循环,到Oep处,我经过调试过,大家最好体验一下。

安全频道 dword 最新报道

安全频道 eax 最新报道

安全频道 EBX 最新报道

[an error occurred while processing this directive]