千里之外 发表于 2008-4-4 19:54:10

Armadillo5.2PatchKey&Unpack

【文章标题】: Armadillo5.2PatchKey&Unpack
【文章作者】: 千里之外
【作者QQ号】: 506398911
【软件名称】: 加壳记事本
【使用工具】: OD LordPE Import REConstructor v1.6 FINAL
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
首先自己用 ARM 5.2给记事本加个壳
下面是我选的保护:
1.Standard protection plus Debug-Blocker
2.Variable Backup Keys
3.Standard hardware locking

好了就这些了
我的机器码是 F315-F5A8 这样我生成另外一个机器码的KEY 用来PATCH KEY

F315-F5A9
千里之外
884C-9496-D6ED-77C0

准备工作快要结束 还差一点 :-) 根据前辈的经验 我们要用到几个断点 我们事先可以集成到 OD的 API插件里 这个很简单
我们找到OD目录下的Plugin 文件夹 在APIBreak 里面添加下面几个断点

k:OpenMutexA(双进程转单进程)
k:GetSystemTime(补丁KEY)
K:VirtualProtect(辅助)
K:CreateFileMappingA(辅助)
K:GetModuleHandleA(魔幻跳转)
K:CreateThread(寻找OEP)

这样我们就可以不用在命令行里打命令了 方便写 :-)
其实这几个API 是前辈们脱穿山甲的经验 这里我们基本不用单步 就可以很快搞定它 在这里向大牛们问好 也向和我一样的菜鸟们
说下 最好深入研究下 知其然 也要知其所以然

好了 我们开始脱壳之旅
1.双进程转单进程

k:OpenMutexA(双进程转单进程)

下断后 SHIFT+F9 再ALT+F9 EAX置1 再SHIFT+F9 ALT+F9 EAX置1 取消断点 到此第一步完成
2.patch key

k:GetSystemTime(补丁KEY)
下断后返回到这里
00DFB066    0FB74D FA       MOVZX ECX,WORD PTR SS:
00DFB06A    51            PUSH ECX
00DFB06B    0FB755 F8       MOVZX EDX,WORD PTR SS:
00DFB06F    52            PUSH EDX
00DFB070    0FB745 F6       MOVZX EAX,WORD PTR SS:
00DFB074    50            PUSH EAX
00DFB075    0FB74D F4       MOVZX ECX,WORD PTR SS:
00DFB079    51            PUSH ECX
00DFB07A    0FB755 F2       MOVZX EDX,WORD PTR SS:
00DFB07E    52            PUSH EDX
00DFB07F    0FB745 EE       MOVZX EAX,WORD PTR SS:
00DFB083    50            PUSH EAX
00DFB084    0FB74D EC       MOVZX ECX,WORD PTR SS:
00DFB088    51            PUSH ECX
00DFB089    E8 22010000   CALL 00DFB1B0
00DFB08E    50            PUSH EAX
00DFB08F    68 ECF1E400   PUSH 0E4F1EC                           ; ASCII "%08X-%04u%02u%02u%02u%02u%02u%04u"

进入CALL 00DFB1B0
00DFB1B0    55            PUSH EBP
00DFB1B1    8BEC            MOV EBP,ESP
00DFB1B3    83EC 0C         SUB ESP,0C
00DFB1B6    6A 00         PUSH 0
00DFB1B8    B9 B8B4E500   MOV ECX,0E5B4B8
00DFB1BD    E8 2E49FFFF   CALL 00DEFAF0
00DFB1C2    8BE5            MOV ESP,EBP
00DFB1C4    5D            POP EBP
00DFB1C5    C3            RETN

进入 CALL 00DEFAF0

00DEFAF0    55            PUSH EBP
00DEFAF1    8BEC            MOV EBP,ESP
00DEFAF3    83EC 14         SUB ESP,14
00DEFAF6    894D F0         MOV DWORD PTR SS:,ECX
00DEFAF9    8B45 F0         MOV EAX,DWORD PTR SS:
00DEFAFC    8B88 5C060000   MOV ECX,DWORD PTR DS:
00DEFB02    894D FC         MOV DWORD PTR SS:,ECX
00DEFB05    8B55 F0         MOV EDX,DWORD PTR SS:
00DEFB08    8B82 5C060000   MOV EAX,DWORD PTR DS:
00DEFB0E    8945 F8         MOV DWORD PTR SS:,EAX
00DEFB11    6A 01         PUSH 1
00DEFB13    8B4D F8         MOV ECX,DWORD PTR SS:
00DEFB16    E8 F57B0100   CALL 00E07710
00DEFB1B    8845 F7         MOV BYTE PTR SS:,AL
00DEFB1E    B9 01000000   MOV ECX,1
00DEFB23    85C9            TEST ECX,ECX
00DEFB25    7C 21         JL SHORT 00DEFB48
00DEFB27    BA 01000000   MOV EDX,1
00DEFB2C    83FA 01         CMP EDX,1
00DEFB2F    7F 17         JG SHORT 00DEFB48
00DEFB31    B8 01000000   MOV EAX,1
00DEFB36    C1E0 02         SHL EAX,2
00DEFB39    8B4D F0         MOV ECX,DWORD PTR SS:
00DEFB3C    8B9401 5C200000 MOV EDX,DWORD PTR DS:
00DEFB43    8955 EC         MOV DWORD PTR SS:,EDX
00DEFB46    EB 07         JMP SHORT 00DEFB4F
00DEFB48    C745 EC 0000000>MOV DWORD PTR SS:,0
00DEFB4F    8B45 08         MOV EAX,DWORD PTR SS:
00DEFB52    50            PUSH EAX
00DEFB53    6A 01         PUSH 1
00DEFB55    8B4D FC         MOV ECX,DWORD PTR SS:
00DEFB58    E8 F37B0100   CALL 00E07750
00DEFB5D    0FB64D F7       MOVZX ECX,BYTE PTR SS:
00DEFB61    F7D9            NEG ECX
00DEFB63    1BC9            SBB ECX,ECX
00DEFB65    81E1 11111111   AND ECX,11111111
00DEFB6B    33C1            XOR EAX,ECX
00DEFB6D    3345 EC         XOR EAX,DWORD PTR SS:
00DEFB70    8BE5            MOV ESP,EBP
00DEFB72    5D            POP EBP
00DEFB73    C2 0400         RETN 4

进入CALL 00E07750
00E07750    55            PUSH EBP
00E07751    8BEC            MOV EBP,ESP
00E07753    83EC 4C         SUB ESP,4C
00E07756    56            PUSH ESI
00E07757    894D B4         MOV DWORD PTR SS:,ECX
00E0775A    C745 FC 0000000>MOV DWORD PTR SS:,0
00E07761    B8 01000000   MOV EAX,1
00E07766    85C0            TEST EAX,EAX
00E07768    74 0B         JE SHORT 00E07775
00E0776A    68 E054E600   PUSH 0E654E0
00E0776F    FF15 FCE2E400   CALL DWORD PTR DS:               ; ntdll.RtlEnterCriticalSection
00E07775    68 F854E600   PUSH 0E654F8
00E0777A    FF15 FCE2E400   CALL DWORD PTR DS:               ; ntdll.RtlEnterCriticalSection
00E07780    8B0D 7477E500   MOV ECX,DWORD PTR DS:

............
下面的代码就老长了 我们 CTRL+F9 执行到 CALL的返回处
00E07A95    5E            POP ESI
00E07A96    8BE5            MOV ESP,EBP
00E07A98    5D            POP EBP
00E07A99    C2 0800         RETN 8

在RETN处下断
看大大们的破问 有些困惑 老是找不到自己的机器码 明明老大们的都在这里能显示 为什么自己的不行呢 我就在这里下断后
SHIT+F9 结果机器码出现了 :-) 在EAX里面 这个时候我们不断的 SHIT+F9 只要EAX里面出现本机的机器码我们就替换成我们
手里有用的机器码 出现别的值的时候就不用换了 :-) 直到出现正确提示的时候 就取消断点 运行起来就好了
到这里第二步就结束了重新运行后就不需要KEY了 在这里说下 要是选择固定备份密钥的话 重新运行就还是需要KEY 这个时候
可以在OD中运行时候 用脱壳机处理 :-)
3.这里我们开始真正的脱壳
重新来第一步 处理双进程
然后 我们处理魔幻跳转 来躲开IAT加密 这些都是前辈的经验 :-)
K:VirtualProtect(辅助)下断 后返回 取消断点
K:CreateFileMappingA(辅助)下断 后返回 取消断点
K:GetModuleHandleA(魔幻跳转) 下断后来到这里
7C80B6A1 >8BFF            MOV EDI,EDI
7C80B6A3    55            PUSH EBP
7C80B6A4    8BEC            MOV EBP,ESP
7C80B6A6    837D 08 00      CMP DWORD PTR SS:,0
7C80B6AA    74 18         JE SHORT kernel32.7C80B6C4
7C80B6AC    FF75 08         PUSH DWORD PTR SS:
7C80B6AF    E8 C0290000   CALL kernel32.7C80E074
7C80B6B4    85C0            TEST EAX,EAX
7C80B6B6    74 08         JE SHORT kernel32.7C80B6C0
7C80B6B8    FF70 04         PUSH DWORD PTR DS:
7C80B6BB    E8 7D2D0000   CALL kernel32.GetModuleHandleW
7C80B6C0    5D            POP EBP
7C80B6C1    C2 0400         RETN 4

取消其他的断点 在 RETN处下断
这个时候 堆栈里是这样
0013947C   00E50BA0ASCII "kernel32.dll"
00139480   00E51A68ASCII "VirtualAlloc"

再SHIT+F9后
00139478   00E25343返回到 00E25343 来自 kernel32.GetModuleHandleA
0013947C   00E50BA0ASCII "kernel32.dll"
00139480   00E51A5CASCII "VirtualFree"

再来一下
001391C4   00E07EF4返回到 00E07EF4 来自 kernel32.GetModuleHandleA
001391C8   00139340ASCII "kernel32.dll"
001391CC   00000000

OK了 取消断点 返回
00E07EF4    8B55 F4         MOV EDX,DWORD PTR SS:
00E07EF7    8B0D 4CDFE500   MOV ECX,DWORD PTR DS:
00E07EFD    890491          MOV DWORD PTR DS:,EAX
00E07F00    8B55 F4         MOV EDX,DWORD PTR SS:
00E07F03    A1 4CDFE500   MOV EAX,DWORD PTR DS:
00E07F08    833C90 00       CMP DWORD PTR DS:,0
00E07F0C    75 5C         JNZ SHORT 00E07F6A
00E07F0E    8B4D F8         MOV ECX,DWORD PTR SS:
00E07F11    8B51 08         MOV EDX,DWORD PTR DS:
00E07F14    83E2 02         AND EDX,2
00E07F17    74 38         JE SHORT 00E07F51
00E07F19    B8 03000000   MOV EAX,3
00E07F1E    C1E0 02         SHL EAX,2
00E07F21    8B0D 04BBE500   MOV ECX,DWORD PTR DS:            ; NOTEPAD.0046D378
00E07F27    8B15 04BBE500   MOV EDX,DWORD PTR DS:            ; NOTEPAD.0046D378
00E07F2D    8B35 04BBE500   MOV ESI,DWORD PTR DS:            ; NOTEPAD.0046D378
00E07F33    8B5E 08         MOV EBX,DWORD PTR DS:
00E07F36    335A 30         XOR EBX,DWORD PTR DS:
00E07F39    331C01          XOR EBX,DWORD PTR DS:
00E07F3C    83E3 10         AND EBX,10
00E07F3F    F7DB            NEG EBX
00E07F41    1BDB            SBB EBX,EBX
00E07F43    F7DB            NEG EBX
00E07F45    0FB6C3          MOVZX EAX,BL
00E07F48    85C0            TEST EAX,EAX
00E07F4A    75 05         JNZ SHORT 00E07F51
00E07F4C^ E9 1BFFFFFF   JMP 00E07E6C
00E07F51    8D8D C8FEFFFF   LEA ECX,DWORD PTR SS:
00E07F57    51            PUSH ECX
00E07F58    FF15 D8E1E400   CALL DWORD PTR DS:               ; kernel32.LoadLibraryA
00E07F5E    8B55 F4         MOV EDX,DWORD PTR SS:
00E07F61    8B0D 4CDFE500   MOV ECX,DWORD PTR DS:
00E07F67    890491          MOV DWORD PTR DS:,EAX
00E07F6A    8B55 F4         MOV EDX,DWORD PTR SS:
00E07F6D    A1 4CDFE500   MOV EAX,DWORD PTR DS:
00E07F72    833C90 00       CMP DWORD PTR DS:,0
00E07F76    75 05         JNZ SHORT 00E07F7D
00E07F78^ E9 EFFEFFFF   JMP 00E07E6C

NOP 掉00E07F76    75 05         JNZ SHORT 00E07F7D 就可以避开IAT 加密了
在他上面下个断点 一会我们走出循环的时候 好找到这里 还原以前的代码 :-) 然后就单步走 一会就走出这里的循环
00E08209   /EB 03         JMP SHORT 00E0820E
00E0820B   |D6            SALC
00E0820C   |D6            SALC
00E0820D   |8F            ???                                    ; 未知命令
00E0820E   \8B15 5C4CE600   MOV EDX,DWORD PTR DS:
00E08214    8995 B4FDFFFF   MOV DWORD PTR SS:,EDX

走出循环后来到这里 我们在通过我们下的断点 很快定位到我们修改的地方 撤销修改 :-)

4.寻找OEP 这个就用这个断点
K:CreateThread(寻找OEP) 下断后 取消 返回
00E1364C    50            PUSH EAX
00E1364D    FF15 5CE2E400   CALL DWORD PTR DS:               ; kernel32.CloseHandle
00E13653    5E            POP ESI
00E13654    5B            POP EBX
00E13655    8BE5            MOV ESP,EBP
00E13657    5D            POP EBP
00E13658    C3            RETN

来到这里 F8 往下走
00E2F31A    50            PUSH EAX
00E2F31B    8B4D 08         MOV ECX,DWORD PTR SS:
00E2F31E    8B51 08         MOV EDX,DWORD PTR DS:
00E2F321    52            PUSH EDX
00E2F322    6A 00         PUSH 0
00E2F324    8B45 08         MOV EAX,DWORD PTR SS:
00E2F327    8B48 0C         MOV ECX,DWORD PTR DS:
00E2F32A    51            PUSH ECX
00E2F32B    8B55 F4         MOV EDX,DWORD PTR SS:
00E2F32E    2B55 DC         SUB EDX,DWORD PTR SS:
00E2F331    FFD2            CALL EDX

进入这个CALL EDX
到达OEP ^_^
5.修复 用 LordPE DUMP 后 用Import REConstructor v1.6 FINAL 找IAT 无效的全部CAT 修复下就OK了 呵呵

--------------------------------------------------------------------------------
【经验总结】
1.其他版本标准保护的 PATCH KEY 和脱壳 都可以用这些断点 方法都差不多
2.套用名人的一句话 站在巨人肩膀上的感觉正好 不过什么时候也成巨人呢 ^_^

--------------------------------------------------------------------------------
【版权声明】: 版权没有 ^_^

                                                       2008年04月04日 20:00:29

月之精灵 发表于 2008-4-4 20:25:10

学习,老千越来越猛了/:good

glassfox 发表于 2008-4-4 20:53:31

学习 一步一步的揭开了 5.x 的面纱咯...:loveliness:

5.4x 也差不多的吧

幻影¤雾之戀 发表于 2008-4-4 21:12:28

很强大.支持.

lqiulu 发表于 2008-4-4 22:49:35

k:OpenMutexA(双进程转单进程)
k:GetSystemTime(补丁KEY)
K:VirtualProtect(辅助)
K:CreateFileMappingA(辅助)
K:GetModuleHandleA(魔幻跳转)
K:CreateThread(寻找OEP)
可以只用四个断点,
前两个断点不可少,但处理IAT加密问题可以只用VirtualProtect这一个断点.
断下后看EAX寄存器中为00401000后就可以ALT+F9返回,CTRL+F
查找PUSH 100 然后把这个语句上面的PUSH EBP改为RETN就可以了,下一个直接下
CreateThread断点寻找OEP就行了.
可以减少断点,好像5.XX的都可以这样解决.再早的就不好说了.自己的一点点认识,可能大家都知道,见笑了.

Squn 发表于 2008-4-5 01:46:08

:loveliness: :loveliness: :loveliness:
*.学习 收藏了 慢慢分析 -,-

yunfeng 发表于 2008-4-6 08:26:41

几日不见,兄弟的脱壳水平是越来越高了,感觉自己快要落伍了。

PUCUA 发表于 2008-4-29 15:00:28

重新运行就还是需要KEY 这个时候
可以在OD中运行时候 用脱壳机处理 :-)
脱壳机哪有?
我的一个程序还有提示key正确后,我的跳出出错啊 General extraction error location ES1
谢谢指教下
是5.42的版本

[ 本帖最后由 PUCUA 于 2008-4-29 15:09 编辑 ]

forags 发表于 2008-7-27 19:14:14

不懂,收藏慢慢看...........

linchun 发表于 2008-8-3 11:45:02

收藏一下,慢慢看 手头正好有个5.02BEAT版的记事本还脱不了!正好练习下!
页: [1] 2
查看完整版本: Armadillo5.2PatchKey&Unpack