飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 7526|回复: 10

[原创] Armadillo5.2PatchKey&Unpack

[复制链接]

该用户从未签到

发表于 2008-4-4 19:54:10 | 显示全部楼层 |阅读模式
【文章标题】: 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
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-3 23:07
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2008-4-4 20:25:10 | 显示全部楼层
    学习,老千越来越猛了/:good
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-4-4 20:53:31 | 显示全部楼层
    学习 一步一步的揭开了 5.x 的面纱咯...  :loveliness:

    5.4x 也差不多的吧
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-4-4 21:12:28 | 显示全部楼层
    很强大.支持.
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-7-26 14:34
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 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的都可以这样解决.再早的就不好说了.自己的一点点认识,可能大家都知道,见笑了.

    评分

    参与人数 1飘云币 +20 收起 理由
    千里之外 + 20 PYG有你更精彩!

    查看全部评分

    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-4-5 01:46:08 | 显示全部楼层
    :loveliness: :loveliness: :loveliness:
    *.学习 收藏了 慢慢分析 -,-
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2019-3-25 06:30
  • 签到天数: 1096 天

    [LV.10]以坛为家III

    发表于 2008-4-6 08:26:41 | 显示全部楼层
    几日不见,兄弟的脱壳水平是越来越高了,感觉自己快要落伍了。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-4-29 15:00:28 | 显示全部楼层
    重新运行就还是需要KEY 这个时候
      可以在OD中运行时候 用脱壳机处理 :-)
    脱壳机哪有?
    我的一个程序还有提示key正确后,我的跳出出错啊 General extraction error location ES1
    谢谢指教下
    是5.42的版本

    [ 本帖最后由 PUCUA 于 2008-4-29 15:09 编辑 ]
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-7-27 19:14:14 | 显示全部楼层
    不懂,收藏慢慢看...........
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-8-3 11:45:02 | 显示全部楼层
    收藏一下,慢慢看 手头正好有个5.02BEAT版的记事本还脱不了!正好练习下!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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