cu629944 发表于 2011-6-30 14:14

闲着无聊,手脱TTP壳全过程

本帖最后由 cu629944 于 2014-8-6 11:51 编辑

【文章标题】: 闲着无聊,手脱TTP壳
【软件名称】: 加了TTP壳的记事本
【下载地址】: 自己搜索下载
【软件介绍】: OD LORDPE IMPORT REC
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
   闲着无聊,就给一个记事本加了下TTP的壳,来脱下,如果可能的话,骗个精华走,哇咔咔!呵呵!废话不多说,直接进入主题。
   PS:参考了下当红小生的视频,然后自己脱了下!
   
   先介绍下什么是TTProtect:
   
   什么是TTProtect?TTProtect是专为软件开发者设计的保护软件不被非法修改或反编译的专业加密软件。
TTProtect是新一代软件保护工具,吸收众多保护工具的优点,并加入了独有的特色功能。
TTProtect使用了特别的反跟踪方法,使得对保护对象的非法调试非常困难,并且对保护代码进行全局优化、乱序和混淆,使得非法分析相当困难。

   TTP这款壳是反硬件执行断点的,所以要用到一个插件,PhantOm这款插件,和SOD一起用,效果还不错哈,直接进入主题了,先跑OEP吧!我是给XP的记事本加的TTP,所以是相当于给C++的软件加了一个壳吧。
   
   我们运行程序,暂停,点击按钮“K”,在

      

          调用来自006DD40F这里,右键====》显示调用,此时停在WinMain函数上面,如果一个程序很了解的话,就知道在软件的退出的的上面就是WinMain函数,WinMain函数上面就是GetMoudleHandleA函数了。


   006DD405    6A 0A         push    0A
   006DD407    58            pop   eax
   006DD408    50            push    eax
   006DD409    56            push    esi
   006DD40A    53            push    ebx
   006DD40B    53            push    ebx
   006DD40C    FFD7            call    edi                              ; GetMoudleHandleA
   006DD40E    50            push    eax
   006DD40F    E8 22559200   call    ttp.01002936                     ; WinMain


   此时向上面翻,会找到OEP

   006DD29F    016A 70         add   dword ptr , ebp
   006DD2A2    68 98180001   push    1001898
   006DD2A7    E8 BCA29200   call    ttp.01007568
   006DD2AC    33DB            xor   ebx, ebx
   006DD2AE    53            push    ebx
   006DD2AF    8B3D CC100001   mov   edi, dword ptr
   006DD2B5    FFD7            call    edi
   006DD2B7    66:8138 4D5A    cmp   word ptr , 5A4D

    006DD29F这里就是OEP了,可是我们知道,记事本的OEP的头一句是PUSH 70,我们可以发现,壳把第一句变形了,我们来给他NOP一字节,就会发现,程序的OEP正常了!

   006DD2A0    6A 70         push    70
   006DD2A2    68 98180001   push    1001898
   006DD2A7    E8 BCA29200   call    ttp.01007568
   006DD2AC    33DB            xor   ebx, ebx
   006DD2AE    53            push    ebx
   006DD2AF    8B3D CC100001   mov   edi, dword ptr
   006DD2B5    FFD7            call    edi
   006DD2B7    66:8138 4D5A    cmp   word ptr , 5A4D
   
   如果我们细心的看下,就会发现,记事本的OEP的地址应该是在0100739D,而加了TTP壳的记事本的OEP地址是006DD2A0,我们点击“M”,发现006DD2A0在壳段,就像是把代码抽到壳段执行了!
我们CTRL+G转到0100739D来看下,会发现一堆空代码,所以我们DUMP程序之前,需要将壳代码中的OEP复制到0100739D这里,否则程序是不会运行的。我们复制下整个OEP的二进制代码!

   6A 70 68 98 18 00 01 E8 BC A2 92 00 33 DB 53 8B 3D CC 10 00 01 FF D7 66 81 38 4D 5A 75 1F 8B 48
   3C 03 C8 81 39 50 45 00 00 75 12 0F B7 41 18 3D 0B 01 00 00 74 1F 3D 0B 02 00 00 74 05 89 5D E4
   EB 27 83 B9 84 00 00 00 0E 76 F2 33 C0 39 99 F8 00 00 00 EB 0E 83 79 74 0E 76 E2 33 C0 39 99 E8
   00 00 00 0F 95 C0 89 45 E4 89 5D FC 6A 02 FF 15 38 13 00 01 59 83 0D 9C AB 00 01 FF 83 0D A0 AB
   00 01 FF FF 15 34 13 00 01 8B 0D B8 9A 00 01 89 08 FF 15 30 13 00 01 8B 0D B4 9A 00 01 89 08 A1
   2C 13 00 01 8B 00 A3 A4 AB 00 01 E8 A4 A2 92 00 39 1D 08 96 00 01 75 0C 68 F4 75 00 01 FF 15 28
   13 00 01 59 E8 74 A2 92 00 68 10 90 00 01 68 0C 90 00 01 E8 5A A2 92 00 A1 B0 9A 00 01 89 45 DC
   8D 45 DC 50 FF 35 AC 9A 00 01 8D 45 D4 50 8D 45 D0 50 8D 45 CC 50 FF 15 20 13 00 01 89 45 C8 68
   08 90 00 01 68 00 90 00 01 E8 24 A2 92 00 83 C4 24 A1 1C 13 00 01 8B 30 89 75 E0 80 3E 22 75 3A
   46 89 75 E0 8A 06 3A C3 74 04 3C 22 75 F2 80 3E 22 75 04 46 89 75 E0 8A 06 3A C3 74 04 3C 20 76
   F2 89 5D AC 8D 45 80 50 FF 15 D0 10 00 01 F6 45 AC 01 74 11 0F B7 45 B0 EB 0E 80 3E 20 76 D8 46
   89 75 E0 EB F5 6A 0A 58 50 56 53 53 FF D7 50 E8 22 55 92 00 8B F0 89 75 C4 39 5D E4 75 07 56 FF
   15 18 13 00 01 FF 15 00 13 00 01 EB 2D 8B 45 EC 8B 08 8B 09 89 4D D8 50 51 E8 88 A1 92 00 59 59
   C3 8B 65 E8 8B 75 D8 83 7D E4 00 75 07 56 FF 15 F0 12 00 01 FF 15 F4 12 00 01 83 4D FC FF 8B C6
   E8 3E A1 92 00 C3

   复制下来后,我们来找IAT,我们在006DD2AF    8B3D CC100001   mov   edi, dword ptr ,右键====》数据窗口中跟随=====》内存地址,发现大部分的IAT都被加密了,只有少数部分没有被加密,所以我们来找下Magic JUMP,来跳过IAT加密!

   我们重新载入,在VirtualProtect函数下的RETN处下断点,并把数据窗口转到10010CC处,然后F9运行,观察数据窗口,大概6次左右吧,会发现数据窗口中的IAT都出现了,再按一次会发现IAT都被加密了,这就是我们的返回时机,ALT+F9返回,然后F8单步走,发现走过 10007A7F后,IAT被加密了!

   10007A66    33F6            xor   esi, esi
   10007A68    8D4C24 14       lea   ecx, dword ptr
   10007A6C    51            push    ecx
   10007A6D    8D8C24 8C010000 lea   ecx, dword ptr
   10007A74    E8 D49BFFFF   call    1000164D
   10007A79    8B15 D10A0210   mov   edx, dword ptr       ; ttp.01000000
   10007A7F    52            push    edx
   10007A80    E8 C8DFFFFF   call    10005A4D            //IAT被加密了
   10007A85    6A 01         push    1
   10007A87    FF15 E10A0210   call    dword ptr              ; ttp.01013000

   我们再次重新载入,再次来到 10007A80处,在数据窗口0100108C处下硬件写入断点====》byte断点!然后F9运行!

   0100108800000000
   0100108C7C8097B8kernel32.7C8097B8
   010010907C80932EASCII "LL.VerSetConditionMask"
   010010947C80A4B7kernel32.7C80A4B7
   010010987C80A864kernel32.7C80A864
   0100109C7C809FA0kernel32.7C809FA0
   010010A07C83378Dkernel32.7C83378D
   010010A47C833FEBkernel32.7C833FEB
   010010A87C80FFA9kernel32.7C80FFA9
   010010AC7C80FF12kernel32.7C80FF12
   010010B07C810CFDkernel32.7C810CFD
   010010B47C809420kernel32.7C809420
   010010B87C8017E9kernel32.GetSystemTimeAsFileTime
   010010BC7C801E1Akernel32.TerminateProcess

   断在了这里

   10006C36    897C24 18       mov   dword ptr , edi
   10006C3A    8B4424 18       mov   eax, dword ptr
   10006C3E    8945 00         mov   dword ptr , eax      ;开始加密了!
   10006C41    8B4424 24       mov   eax, dword ptr           ; 断在这里
   10006C45    8B78 04         mov   edi, dword ptr

   我们向上面翻,找能跳过这个加密的跳转:

   10006AAF   /74 19         je      short 10006ACA
   10006AB1   |3D 4DE75D66   cmp   eax, 665DE74D
   10006AB6   |74 12         je      short 10006ACA
   10006AB8   |3D 5FF05127   cmp   eax, 2751F05F
   10006ABD   |74 0B         je      short 10006ACA
   10006ABF   |3D 59F04E75   cmp   eax, 754EF059
   10006AC4   |0F85 70010000   jnz   10006C3A                        ;Magic Jump
   10006ACA   \68 F4010000   push    1F4
   10006ACF    E8 F93D0000   call    1000A8CD

   发现10006AC4这个跳转可以跳过我们的IAT加密,所以10006AC4是我们要找的MAGIC JUMP,找到后,我们再次重新载入,删除硬件写入断点,再次来到10007A80,然后我们F7单步进入,寻找到我们的Magic Jump,将三个JE给NOP掉,将JNZ给改成JMP,此时在VirtualProtect函数下的RETN处下断点不要取消,再次F9,我们发现所有的IAT都恢复了,我们ALT+F9返回后,我们直接搜索JMP EAX,发现提示错误



   怎么解决呢?我用的是最简单的方法,点击M,来到写有SFX的区段,我们右键设置访问====》全部访问,就可以了,我们再次搜索,发现我们找到了!我们在JMP EAX处下F2断点,然后F9断下后,F7跟进,此时到达了我们的OEP,这些代码都是没有加密的,我们现在的任务就是来到0100739D处,将我们复制的二进制代码拷贝过去,拷贝好以后,我们在0100739D这里新建EIP,然后打开LORDPE来DUMP程序,这个壳有ANTI DUMP,我们把VirtualProtect的页面属性给改成可读可写和可执行就可以了,呵呵,我在这里就不说了!DUMP好以后,IMPORT REC进行修复,修复成功后,运行,可以正常运行,此时我们的脱壳就完成了。

--------------------------------------------------------------------------------
【经验总结】
闲着无聊来脱的一个壳,侥幸被我搞定了,呵呵!

--------------------------------------------------------------------------------
【版权声明】: 本文原创于nisycc, 转载请注明作者并保持文章的完整, 谢谢!
                                                       2011年06月30日 14:12:08


Smoke 发表于 2011-6-30 14:15

沙发是我的。。。支持你个小美女~

125096 发表于 2011-6-30 14:23

支持笨笨。。。

温柔 发表于 2011-6-30 14:25

過來搶個位子,順便膜拜下

65302666 发表于 2011-6-30 14:39

学习了··谢谢楼主哈···

老万 发表于 2011-6-30 15:38

希望楼主用插图说明一下“把VirtualProtect的页面属性给改成可读可写和可执行”,如何操作?

金罡 发表于 2011-6-30 22:08

楼主的脱文不错,受教了。

xJ_Juno_Jr 发表于 2011-7-1 00:02

难得看到搞TTP的
TTP公关做这么好还是有人去调戏它啦

qzy0549 发表于 2011-7-1 09:36

呵呵 支持你一下哈你给弄成视频多爽啊

cloudkm 发表于 2011-7-1 10:48

是呀,有个视频教程,就更爽了。
页: [1] 2 3 4
查看完整版本: 闲着无聊,手脱TTP壳全过程