- UID
- 31985
注册时间2007-5-6
阅读权限40
最后登录1970-1-1
独步武林
该用户从未签到
|
【文章标题】: 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 里面添加下面几个断点
[8]
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:[EBP-6]
00DFB06A 51 PUSH ECX
00DFB06B 0FB755 F8 MOVZX EDX,WORD PTR SS:[EBP-8]
00DFB06F 52 PUSH EDX
00DFB070 0FB745 F6 MOVZX EAX,WORD PTR SS:[EBP-A]
00DFB074 50 PUSH EAX
00DFB075 0FB74D F4 MOVZX ECX,WORD PTR SS:[EBP-C]
00DFB079 51 PUSH ECX
00DFB07A 0FB755 F2 MOVZX EDX,WORD PTR SS:[EBP-E]
00DFB07E 52 PUSH EDX
00DFB07F 0FB745 EE MOVZX EAX,WORD PTR SS:[EBP-12]
00DFB083 50 PUSH EAX
00DFB084 0FB74D EC MOVZX ECX,WORD PTR SS:[EBP-14]
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:[EBP-10],ECX
00DEFAF9 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
00DEFAFC 8B88 5C060000 MOV ECX,DWORD PTR DS:[EAX+65C]
00DEFB02 894D FC MOV DWORD PTR SS:[EBP-4],ECX
00DEFB05 8B55 F0 MOV EDX,DWORD PTR SS:[EBP-10]
00DEFB08 8B82 5C060000 MOV EAX,DWORD PTR DS:[EDX+65C]
00DEFB0E 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
00DEFB11 6A 01 PUSH 1
00DEFB13 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
00DEFB16 E8 F57B0100 CALL 00E07710
00DEFB1B 8845 F7 MOV BYTE PTR SS:[EBP-9],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:[EBP-10]
00DEFB3C 8B9401 5C200000 MOV EDX,DWORD PTR DS:[ECX+EAX+205C]
00DEFB43 8955 EC MOV DWORD PTR SS:[EBP-14],EDX
00DEFB46 EB 07 JMP SHORT 00DEFB4F
00DEFB48 C745 EC 0000000>MOV DWORD PTR SS:[EBP-14],0
00DEFB4F 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
00DEFB52 50 PUSH EAX
00DEFB53 6A 01 PUSH 1
00DEFB55 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
00DEFB58 E8 F37B0100 CALL 00E07750
00DEFB5D 0FB64D F7 MOVZX ECX,BYTE PTR SS:[EBP-9]
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:[EBP-14]
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:[EBP-4C],ECX
00E0775A C745 FC 0000000>MOV DWORD PTR SS:[EBP-4],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:[E4E2FC] ; ntdll.RtlEnterCriticalSection
00E07775 68 F854E600 PUSH 0E654F8
00E0777A FF15 FCE2E400 CALL DWORD PTR DS:[E4E2FC] ; ntdll.RtlEnterCriticalSection
00E07780 8B0D 7477E500 MOV ECX,DWORD PTR DS:[E57774]
............
下面的代码就老长了 我们 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:[EBP+8],0
7C80B6AA 74 18 JE SHORT kernel32.7C80B6C4
7C80B6AC FF75 08 PUSH DWORD PTR SS:[EBP+8]
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:[EAX+4]
7C80B6BB E8 7D2D0000 CALL kernel32.GetModuleHandleW
7C80B6C0 5D POP EBP
7C80B6C1 C2 0400 RETN 4
取消其他的断点 在 RETN处下断
这个时候 堆栈里是这样
0013947C 00E50BA0 ASCII "kernel32.dll"
00139480 00E51A68 ASCII "VirtualAlloc"
再SHIT+F9后
00139478 00E25343 返回到 00E25343 来自 kernel32.GetModuleHandleA
0013947C 00E50BA0 ASCII "kernel32.dll"
00139480 00E51A5C ASCII "VirtualFree"
再来一下
001391C4 00E07EF4 返回到 00E07EF4 来自 kernel32.GetModuleHandleA
001391C8 00139340 ASCII "kernel32.dll"
001391CC 00000000
OK了 取消断点 返回
00E07EF4 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00E07EF7 8B0D 4CDFE500 MOV ECX,DWORD PTR DS:[E5DF4C]
00E07EFD 890491 MOV DWORD PTR DS:[ECX+EDX*4],EAX
00E07F00 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00E07F03 A1 4CDFE500 MOV EAX,DWORD PTR DS:[E5DF4C]
00E07F08 833C90 00 CMP DWORD PTR DS:[EAX+EDX*4],0
00E07F0C 75 5C JNZ SHORT 00E07F6A
00E07F0E 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
00E07F11 8B51 08 MOV EDX,DWORD PTR DS:[ECX+8]
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:[E5BB04] ; NOTEPAD.0046D378
00E07F27 8B15 04BBE500 MOV EDX,DWORD PTR DS:[E5BB04] ; NOTEPAD.0046D378
00E07F2D 8B35 04BBE500 MOV ESI,DWORD PTR DS:[E5BB04] ; NOTEPAD.0046D378
00E07F33 8B5E 08 MOV EBX,DWORD PTR DS:[ESI+8]
00E07F36 335A 30 XOR EBX,DWORD PTR DS:[EDX+30]
00E07F39 331C01 XOR EBX,DWORD PTR DS:[ECX+EAX]
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:[EBP-138]
00E07F57 51 PUSH ECX
00E07F58 FF15 D8E1E400 CALL DWORD PTR DS:[E4E1D8] ; kernel32.LoadLibraryA
00E07F5E 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00E07F61 8B0D 4CDFE500 MOV ECX,DWORD PTR DS:[E5DF4C]
00E07F67 890491 MOV DWORD PTR DS:[ECX+EDX*4],EAX
00E07F6A 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00E07F6D A1 4CDFE500 MOV EAX,DWORD PTR DS:[E5DF4C]
00E07F72 833C90 00 CMP DWORD PTR DS:[EAX+EDX*4],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:[E64C5C]
00E08214 8995 B4FDFFFF MOV DWORD PTR SS:[EBP-24C],EDX
走出循环后来到这里 我们在通过我们下的断点 很快定位到我们修改的地方 撤销修改 :-)
4.寻找OEP 这个就用这个断点
K:CreateThread(寻找OEP) 下断后 取消 返回
00E1364C 50 PUSH EAX
00E1364D FF15 5CE2E400 CALL DWORD PTR DS:[E4E25C] ; 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:[EBP+8]
00E2F31E 8B51 08 MOV EDX,DWORD PTR DS:[ECX+8]
00E2F321 52 PUSH EDX
00E2F322 6A 00 PUSH 0
00E2F324 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
00E2F327 8B48 0C MOV ECX,DWORD PTR DS:[EAX+C]
00E2F32A 51 PUSH ECX
00E2F32B 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00E2F32E 2B55 DC SUB EDX,DWORD PTR SS:[EBP-24]
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 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入我们
x
|