飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3090|回复: 7

[PYG原创] 伪装壳技术

[复制链接]

该用户从未签到

发表于 2008-2-13 04:37:55 | 显示全部楼层 |阅读模式
伪装壳技术
先载入程序

00401128   ====>入口


直接找块空地方,把滚动条往下拉,看到代码都是00的就是空地了

我就选00401B9C这里吧,紧贴着上面的代码呢!

双击修改指令,写入下面的代码(抄的)

push ebp
mov ebp,esp
push -1
push 666666
push 888888
mov eax,fs:[0]
push eax
mov fs:[0],esp
pop eax
mov fs:[0],eax
pop eax
pop eax
pop eax
pop eax
mov ebp,eax
jmp 401128 ====>跳到入口,自行修改

记住最后一句是跳到真正的入口,这个程序是401128

再用LordPE来修改入口点,改成1B9C后保存

深层】伪装 PEtite 2.2 -> Ian Luck 汇编代码:
============================
伪装代码部分:
============================

mov eax,0040E000
push 004153F3
push dword ptr fs:[0]
mov dword ptr fs:[0],esp
pushfw
pushad
push eax
xor ebx,ebx
pop eax
popad
popfw
pop dword ptr fs:[0]
pop eax
jmp XXXXXXXX     '执行到程序的原有OEP

0040EC8E      B8 00E04000   MOV EAX,123.0040E000                     ;  这里了写代码



3351f363a6137843a64c170359049c2a   教程.exe
http://www.namipan.com/d/%E4%BC% ... 3bccc029d4d74da5200
PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2016-2-3 06:45
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2008-2-13 17:50:20 | 显示全部楼层
    谢谢提供,学习一下……
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    前天 23:35
  • 签到天数: 113 天

    [LV.6]常住居民II

    发表于 2008-2-14 12:17:41 | 显示全部楼层
    下载 学习中:loveliness:
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2008-2-15 23:51:50 | 显示全部楼层

    脱壳yoda's cryptor 1.2

    脱壳yoda's cryptor 1.2
    方法1
    00461060 >  60              PUSHAD
    00461061    E8 00000000     CALL 3.00461066
    00461066    5D              POP EBP
    00461067    81ED F31D4000   SUB EBP,3.00401DF3
    0046106D    B9 7B090000     MOV ECX,97B
    00461072    8DBD 3B1E4000   LEA EDI,DWORD PTR SS:[EBP+401E3B]

    00461769    0000            ADD BYTE PTR DS:[EAX],AL          ?
    0046176B    0000            ADD BYTE PTR DS:[EAX],AL
    0046176D    0000            ADD BYTE PTR DS:[EAX],AL
    0046176F    0000            ADD BYTE PTR DS:[EAX],AL
    00461771    0000            ADD BYTE PTR DS:[EAX],AL
    00461773    0000            ADD BYTE PTR DS:[EAX],AL

    0012FFBC   0012FFE0  指向下一个 SEH 记录的指针
    0012FFC0   0046170C  SE处理程序                   ?
    0012FFC4   7C816FD7  返回到 kernel32.7C816FD7
    0012FFC8   7C930738  ntdll.7C930738
    方法2        
    0046170C    55              PUSH EBP                     shift +F9
    0046170D    8BEC            MOV EBP,ESP
    0046170F    57              PUSH EDI
    00461710    8B45 10         MOV EAX,DWORD PTR SS:[EBP+10]
    00461713    8BB8 C4000000   MOV EDI,DWORD PTR DS:[EAX+C4]

    0046172D    C1C7 07         ROL EDI,7
    00461730    89B8 B8000000   MOV DWORD PTR DS:[EAX+B8],EDI
    00461736    B8 00000000     MOV EAX,0
    0046173B    5F              POP EDI                                  ; 3.0044DCAC         ?
    0046173C    C9              LEAVE
    0046173D    C3              RETN         ?

    00461060 >  60              PUSHAD
    00461061    E8 00000000     CALL 3.00461066
    00461066    5D              POP EBP
    00461067    81ED F31D4000   SUB EBP,3.00401DF3
    0046106D    B9 7B090000     MOV ECX,97B
    00461072    8DBD 3B1E4000   LEA EDI,DWORD PTR SS:[EBP+401E3B]
    00461078    8BF7            MOV ESI,EDI

    004610A8    C0C0 BE         ROL AL,0BE                               ; 移位常量超出 1..31 的范围
    004610AB    AA              STOS BYTE PTR ES:[EDI]
    004610AC  ^ E2 CC           LOOPD SHORT 3.0046107A      ?

    00461340    E8 08000000     CALL 3.0046134D
    00461345    8D85 A3214000   LEA EAX,DWORD PTR SS:[EBP+4021A3]
    0046134B    50              PUSH EAX
    0046134C    C3              RETN

    SS:[004617DB]=0004DCAC
    EBX=00400000 (3.00400000), ASCII "MZP"        ?

    00461416    8B9D 64254000   MOV EBX,DWORD PTR SS:[EBP+402564]
    0046141C    039D 68254000   ADD EBX,DWORD PTR SS:[EBP+402568]
    00461422    C1CB 07         ROR EBX,7       jmp ebx

    e63502d34c3e50fa1f647230ff9ff148   1.exe
    fc3eb9b50d6bff238d7d8dffcc46582c   2.exe
    http://www.namipan.com/d/%e8%84%b1%e5%a3%b3yoda's%20cryptor%201.2.rar/1e04aa919ad46b40e70e21ba54b599b75794d81c3e5a2301
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2008-2-16 00:02:02 | 显示全部楼层

    PEncrypt V4.0

    软件后用Fi测NOTEPAD.EXE的壳为PEncrypt 4.0 Gamma / 4.0 Phi -> junkcode [重叠]
    如何分辨加密壳和压缩壳,通用特点,Od载入时有入口警告或询问是压缩程序吗?普通压缩壳Od调试时候没有异常,加密壳全部有反跟踪代码,会有许多SEH陷阱使OD调试时产生异常。
    找OEP的一般思路如下:
    先看壳是加密壳还是压缩壳,压缩壳相对来说容易些,一般是没有异常。
    外壳解压代码起始点如果是

    pushfd
    pushad

    跟踪时如果有发现

    popad
    popfd

    对应
    有些壳只有

    pushad



    popad

    相对应
    附近还有

    retn
    jmp

    等指令,发生跨断跳跃一般就到了OEP处。
    当然也有其他的,如 je OEP等等,一般都是段之间的大跳转,OD的反汇编窗口里都是同一个段的内容,所以更好区别是否是段间跳转。

    找Oep时注意两点。
    1、单步往前走,不要回头。
    2、观察。注意poshad、poshfd,popad、popfd等,和外壳代码处对应,注意地址发生大的变化。单步跟踪什 么时候F8走,F7,F4步过?

    这里我说说关于F8(Step Over)和F7(Step in)的一般方法,粗跟的时候一般都是常用F8走,但是有些call是变形的Jmp,此时就需要F7代过,区别是否是变形Jmp的一个简单方法是比较call的目标地址和当前地址,如果两者离的很近,一般就是变形Jmp了,用F7走。对于Call的距离很远,可以放心用F8步过,如果你再用F7步过,只是浪费时间而已。F8步过对压缩壳用的很多,F7步过加密壳用的很多,如果用F8一不小心就跑飞(程序运行),跟踪失败。

    加密壳找Oep
    对于加密壳,我的方法一般是用OD载入,钩掉所有异常(不忽略任何异常,除了忽略在KERNEL32 中的内存访问异常打勾。有时由于异常过多可以适当忽略一些异常),运行,数着用了多少次Shift+F9程序运行,显然最后一次异常后,程序会从壳跳到OEP开始执行,这就是我们寻找OEP的一个关键,如果程序 Shift+F9后直接退出,很明显加密壳检测调试器,最简单的应付方法就是用OD插件隐藏OD。
    单步异常是防止我们一步步跟踪程序,即F8,F7,F4等,Int3中断是检测调试器用的,仅在Win9x系统中有效,2000/XP就会出现断点异常,其它的异常主要是干扰调试。这一系列的异常虽然干扰我们调试,但也给我们指明了一条通路,就是Shift+F9略过所有异常,然后找到最后一处异常,再它的恢复异常处下断点,跟踪到脱壳入口点。
    确定从所有Seh异常中走出来,如果前面有大量循环,逐段解压。

    当然你也可以用另一个好东西——Trace,在Command里来个tc eip<42b000 (42b000是当前段的起始位置,滚动条拖到最上面就能看到了,一般程序编译的基地址为400000),42b000只是例子,如果你的下模拟跟踪时机很准,确定没有Seh异常,稍等一会我们就会停在OEP处(对特别加密壳需要大量时间跟踪,因为它的循环极多,但比手动跟踪快,大部分时候是的。)详细跟踪情况可以点运行跟踪看OD跟踪记录。

    我们来实际体会一下。
    我们把Od中的选项-调试选项-异常选项卡中
    除了忽略在KERNEL32 中的内存访问异常打勾,其余一个勾都不打,请检查自己的Od设置。

    用OD载入程序后。
    Od提示程序加壳,选不继续分析。

    00401000 > FC CLD 停在这里。
    00401001 FC CLD
    00401002 FC CLD
    00401003 90 NOP
    00401004 - E9 BDBA0000 JMP NOTEPAD.0040CAC6
    00401009 - E3 D5 JECXZ SHORT NOTEPAD.00400FE0
    0040100B 04 4F ADD AL,4F
    0040100D - 74 A4 JE SHORT NOTEPAD.00400FB3
    ..................................................................
    F9运行。
    Od提示内存异常,Shift+F9继续运行。

    0040CC9E 8618 XCHG BYTE PTR DS:[EAX],BL
    0040CCA0 ^ EB FA JMP SHORT NOTEPAD.0040CC9C
    0040CCA2 4A DEC EDX
    0040CCA3 75 6E JNZ SHORT NOTEPAD.0040CD13

    Od提示调试的程序无法处理异常,按Shift+F9程序退出。

    0040CC9E 8618 XCHG BYTE PTR DS:[EAX],BL
    0040CCA0 ^ EB FA JMP SHORT NOTEPAD.0040CC9C

    很明显加密壳检测出OD调试器,最简单的应付方法就是用OD插件隐藏OD。
    用插件隐藏Od后。
    我们Shift+F9忽略第一次异常到了这里。
    单步异常,再次Shift+F9程序就运行了。停,看堆栈吧。

    0040CCD2 4B DEC EBX
    0040CCD3 6F OUTS DX,DWORD PTR ES:[EDI] ; I/O 命令
    0040CCD4 6368 69 ARPL DWORD PTR DS:[EAX+69],EBP

    堆栈内容。

    0012FFBC 0012FFE0 指针到下一个 SEH 记录
    0012FFC0 0040CCD7 SE 句柄 呵,这里表示Od的最后一个异常处理出口就是0040CCD7,会在0040CCD7处的代码处继续正常运行。
    0012FFC4 77E67903 返回到 KERNEL32.77E67903

    哪我们就Ctrl+G,填入0040CCD7,回车,F2下断点,Shift+F9中断在这里。
    顺利运行到这里,再没有Seh陷阱,可以单步跟踪去Oep处了。

    0040CCD7 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
    0040CCDB 8B00 MOV EAX,DWORD PTR DS:[EAX]
    0040CCDD 3D 04000080 CMP EAX,80000004
    0040CCE2 74 06 JE SHORT NOTEPAD.0040CCEA
    0040CCE4 4B DEC EBX
    0040CCE5 65:72 61 JB SHORT NOTEPAD.0040CD49 ; 多余的前缀
    0040CCE8 6C INS BYTE PTR ES:[EDI],DX ; I/O 命令
    0040CCE9 61 POPAD
    0040CCEA EB 02 JMP SHORT NOTEPAD.0040CCEE
    ................................................................

    去Oep出的过程我们先想象一下。

    0040CCD7 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
    0040CCDB 8B00 MOV EAX,DWORD PTR DS:[EAX]
    0040CCDD 3D 04000080 CMP EAX,80000004
    0040CCE2 74 06 JE SHORT NOTEPAD.0040CCEA
    0040CCE4 4B DEC EBX
    0040CCE5 65:72 61 JB SHORT NOTEPAD.0040CD49 ; 多余的前缀
    0040CCE8 6C INS BYTE PTR ES:[EDI],DX ; I/O 命令
    0040CCE9 61 POPAD
    0040CCEA EB 02 JMP SHORT NOTEPAD.0040CCEE
    ...........................................................

    经过中间过程。

    Call XXXXX

    循环..............

    popad
    jmp XXXXXX



    ret
    入口点,代码跨段。
    那我们滚动条向上面看,当前段起始位置是40c000
    跨段入口点的地址必须是小于40c000
    那我们可以下条件断点了。
    命令行下命令

    tc eip<40c000

    呵呵,我们熟悉的记事本入口,关键它已经跨段,换个程序通样处理,我们已经学会方法。

    004010CC 55 PUSH EBP 跨段来到这里,我们再这里用Od的Dump插件直接脱壳。
    004010CD 8BEC MOV EBP,ESP
    004010CF 83EC 44 SUB ESP,44
    004010D2 56 PUSH ESI
    004010D3 FF15 E4634000 CALL DWORD PTR DS:[<&KERNEL32.GetCommand>; KERNEL32.GetCommandLineA
    004010D9 8BF0 MOV ESI,EAX
    004010DB 8A00 MOV AL,BYTE PTR DS:[EAX]
    004010DD 3C 22 CMP AL,22
    004010DF 75 1B JNZ SHORT NOTEPAD.004010FC
    004010E1 56 PUSH ESI
    004010E2 FF15 F4644000 CALL DWORD PTR DS:[<&USER32.CharNextA>] ; USER32.CharNextA

    脱壳后发现程序不能运行,这时需要用Imprec修复引入函数表(Import Table)
    在Oep处填10cc,点IT自动搜索,然后点获输入信息,看到输入表全部有效,点修复抓取文件按钮,选择Dump的文件,修复它,运行后仍然不能运行。
    呵,我们还有Lordpe重建PE的功能,用上吧。

    运行Lordpe重建Pe,选择Imprec修复的文件,修复后正常运行。

    e63502d34c3e50fa1f647230ff9ff148   1.exe
    fc3eb9b50d6bff238d7d8dffcc46582c   2.exe
    脱壳PEncrypt V4.0的壳以及模拟跟踪命令的加强练习http://www.namipan.com/d/%e8%84% ... e17e1911a1b95685a00
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2008-3-11 23:40:14 | 显示全部楼层
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2008-3-11 23:48:24 | 显示全部楼层
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-1-22 10:56
  • 签到天数: 167 天

    [LV.7]常住居民III

    发表于 2015-11-21 11:44:43 | 显示全部楼层
    谢谢提供,学习一下……
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表