飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 5632|回复: 17

[原创] Themida/WinLicense Delphi 6.0 寻找Stolen Code!

[复制链接]
  • TA的每日心情
    开心
    2020-12-31 08:08
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 2008-4-30 10:01:30 | 显示全部楼层 |阅读模式
    Themida/WinLicense Delphi 6.0 寻找Stolen Code!
    【文章标题】: Themida/WinLicense Delphi 6.0 寻找Stolen Code!
    【文章作者】: lal978112
    【作者邮箱】: 38768802@qq.com
    【软件名称】: Project1.exe
    【加壳方式】: Themida/WinLicense
    【保护方式】: 代码变形 iat加密  oep偷取
    【编写语言】: Delphi 6.0
    【使用工具】: OllyICE(Hideod 0.17) LordPE ImportREC
    【操作平台】: XP SP2
    【作者声明】: 我是一只小菜鸟,偶得一点心得,愿与大家分享
    【详细过程】:

    首先OD 载入 ,忽略所有异常,用Hideod 插件隐藏OD!
    目标程序是:Project1.exe
    PEID查得是:Themida|WinLicense V1.9.2.0  -> Oreans Technologies *
    我这里用另一种思路,查找程序编写的语言:
    运行Project1.exe,然后DUMP出来,再用PEID核心扫描为:Borland Delphi 6.0 - 7.0
    知道是什么语言的就好办了,现在我们就开始脱壳
    运行脚本:THEMIDA脚本(for IAT restore).txt

    运行完脚本,OD停在这里:
    00405C60    53              PUSH EBX   记位这个地址,同时记住 EAX=00453A1C  (1)
    00405C61    8BD8            MOV EBX,EAX
    00405C63    33C0            XOR EAX,EAX
    00405C65    A3 9C404500     MOV DWORD PTR DS:[45409C],EAX
    00405C6A    6A 00           PUSH 0
    00405C6C    E8 2BFFFFFF     CALL Project1.00405B9C           ; JMP 到 kernel32.GetModuleHandleA
    00405C71    A3 64664500     MOV DWORD PTR DS:[456664],EAX
    00405C76    A1 64664500     MOV EAX,DWORD PTR DS:[456664]
    00405C7B    A3 A8404500     MOV DWORD PTR DS:[4540A8],EAX
    00405C80    33C0            XOR EAX,EAX
    00405C82    A3 AC404500     MOV DWORD PTR DS:[4540AC],EAX
    00405C87    33C0            XOR EAX,EAX
    00405C89    A3 B0404500     MOV DWORD PTR DS:[4540B0],EAX
    00405C8E    E8 C1FFFFFF     CALL Project1.00405C54
    00405C93    BA A4404500     MOV EDX,Project1.004540A4
    00405C98    8BC3            MOV EAX,EBX
    00405C9A    E8 F5DEFFFF     CALL Project1.00403B94
    00405C9F    5B              POP EBX
    00405CA0    C3              RETN      //在这里F4 F8跟进

    来到这里:到VM里面了
    006AF013    68 107C3A6C     PUSH 6C3A7C10
    006AF018  ^ E9 16C4FFFF     JMP Project1.006AB433
    006AF01D    07              POP ES                           ; 段寄存器修饰
    006AF01E    42              INC EDX
    006AF01F    56              PUSH ESI
    006AF020    DBF4            FCOMI ST,ST(4)
    006AF022    15 4672686C     ADC EAX,6C687246

    现在我们Alt+M,在代码段下F2断点 到这里了

    00C2004F    FF33            PUSH DWORD PTR DS:[EBX]         ;在这里断下  EBX=00455058 (2)
    00C20051    8B1C24          MOV EBX,DWORD PTR SS:[ESP]
    00C20054    81EC 04000000   SUB ESP,4
    00C2005A    890424          MOV DWORD PTR SS:[ESP],EAX

    此时停在:00C2004F      PUSH DWORD PTR DS:[EBX]上,注意代码中用到了EBX,那么我们
    就记下EBX的值:00455058 数据窗口跟随,可以看到该处的值为:00456BDC
    好了,继续F8一次,再在代码段下F2断点,来到这里:

    004039EC    8B4424 04       mov     eax, dword ptr [esp+4]    ;在这里断下 单步向下
    004039F0    F740 04 0600000>test    dword ptr [eax+4], 6      ;这里实际上是一个反调试的地方
    004039F7    0F85 89000000   jnz     00403A86                  ;在这里改跳转,不让程序执行下面代码
    004039FD    803D 28404500 0>cmp     byte ptr [454028], 0
    00403A04    77 0F           ja      short 00403A15
    00403A06    8D4424 04       lea     eax, dword ptr [esp+4]
    00403A0A    50              push    eax
    00403A0B    E8 FCD7FFFF     call    0040120C                ; jmp 到 kernel32.UnhandledExceptionFilter
    00403A10    83F8 00         cmp     eax, 0
    00403A13    74 71           je      short 00403A86
    00403A15    8B4424 04       mov     eax, dword ptr [esp+4]
    改完跳转后程序来到这里:
    7C9237BF    64:8B25 0000000>mov     esp, dword ptr fs:[0]
    7C9237C6    64:8F05 0000000>pop     dword ptr fs:[0]
    7C9237CD    8BE5            mov     esp, ebp
    7C9237CF    5D              pop     ebp
    7C9237D0    C2 1400         retn    14
    在代码段下F2断点 到这里了
    00C4C574    FF33            push    dword ptr [ebx]        ;在这里断下
    00C4C576    FF3424          push    dword ptr [esp]
    00C4C579    E9 3C920600     jmp     00CB57BA

    程序在取地址00456BDC中的值,可以不管它
    继续F8一次,再在代码段下F2断点,来到这里:

    0045207C    53              push    ebx                 ;在这里断下,记住这个地址    (3)
    0045207D    A1 B44F4500     mov     eax, dword ptr [454FB4>
    00452082    8338 00         cmp     dword ptr [eax], 0
    00452085    74 0A           je      short 00452091
    00452087    8B1D B44F4500   mov     ebx, dword ptr [454FB4>; Project1.00456040
    0045208D    8B1B            mov     ebx, dword ptr [ebx]
    0045208F    FFD3            call    ebx
    00452091    5B              pop     ebx
    00452092    C3              retn                          //在这里F4 F8跟进
    又来到VM里面了
    006AF025    68 6C23E169     push    69E1236C
    006AF02A  ^ E9 04C4FFFF     jmp     006AB433
    006AF02F    91              xchg    eax, ecx
    006AF030    AC              lods    byte ptr [esi]
    继续在代码段下F2断点 到这里了
    00C4C574    FF33            push    dword ptr [ebx]        ;在这里断下  EBX=00455138   (4)  
    00C4C576    FF3424          push    dword ptr [esp]
    00C4C579    E9 3C920600     jmp     00CB57BA

    记下EBX的值:00455138   这里有一个技巧,如果:push  dword ptr [ebx]是用的哪个寄存器,就记下那个
    寄存器的地址
    继续F8一次,再在代码段下F2断点,来到这里:

    00C24A6D    FF32            PUSH DWORD PTR DS:[EDX]          ;在这里断下 EDX=00455058 (5)
    00C24A6F    812C24 64103460 SUB DWORD PTR SS:[ESP],60341064
    00C24A76    E9 9E580000     JMP 00C2A319
    00C24A7B    BA 20000000     MOV EDX,20
    00C24A80    01FA            ADD EDX,EDI

    记下EDX的值:00455058
    继续F8一次,再在代码段下F2断点,又来到反调试的这里,继续改跳转:

    004039EC    8B4424 04       mov     eax, dword ptr [esp+4]   ;在这里断下 单步向下
    004039F0    F740 04 0600000>test    dword ptr [eax+4], 6
    004039F7    0F85 89000000   jnz     00403A86                 ;在这里改跳转,不让程序执行下面代码
    004039FD    803D 28404500 0>cmp     byte ptr [454028], 0
    00403A04    77 0F           ja      short 00403A15
    00403A06    8D4424 04       lea     eax, dword ptr [esp+4]
    00403A0A    50              push    eax
    00403A0B    E8 FCD7FFFF     call    0040120C                   ; jmp 到 kernel32.UnhandledExceptionFilter
    00403A10    83F8 00         cmp     eax, 0
    00403A13    74 71           je      short 00403A86
    改完跳转后程序来到这里:
    7C9237BF    64:8B25 0000000>mov     esp, dword ptr fs:[0]
    7C9237C6    64:8F05 0000000>pop     dword ptr fs:[0]
    7C9237CD    8BE5            mov     esp, ebp
    7C9237CF    5D              pop     ebp
    7C9237D0    C2 1400         retn    14
    在代码段下F2断点 到这里了
    00C0004F    FF33            push    dword ptr [ebx]           ;在这里断下
    00C00051    8B1C24          mov     ebx, dword ptr [esp]
    00C00054    81EC 04000000   sub     esp, 4

    程序在取地址00456BDC中的值,可以不管它
    继续F8一次,再在代码段下F2断点,来到这里:

    00C4C574    FF33             push    dword ptr [ebx]          ;在这里断下 EBX=00453700 (6)
    00C4C576    FF3424           push    dword ptr [esp]
    00C4C579    E9 3C920600      jmp     00CB57BA
    00C4C57E    51               push    ecx
    记下EBX的值:00453700
    继续F8一次,再在代码段下F2断点:
    00452094    55               push    ebp    ;在这里断下,有点象OEP,可是它不是,记住这个地址 (7)
    00452095    8BEC             mov     ebp, esp   
    00452097    51               push    ecx
    00452098    53               push    ebx
    00452099    56               push    esi
    0045209A    57               push    edi
    0045209B    894D FC          mov     dword ptr [ebp-4], ecx
    0045209E    8BDA             mov     ebx, edx
    F8单步向下一直走
    来到这里
    00452108    897E 44          mov     dword ptr [esi+44], edi
    0045210B    5F               pop     edi
    0045210C    5E               pop     esi
    0045210D    5B               pop     ebx
    0045210E    59               pop     ecx
    0045210F    5D               pop     ebp
    00452110    C3               retn               //在这里F4 F8跟进  

    又来到VM里面了

    006AF032    68 634D1A64      push    641A4D63   ;在这里断下
    006AF037  ^ E9 F7C3FFFF      jmp     006AB433
    006AF03C    3B59 2D          cmp     ebx, dword ptr [ecx+2D]
    006AF03F    52               push    edx
    006AF040    0E               push    cs

    再在代码段下F2断点:

    00C04A6D    FF32             push    dword ptr [edx]          ;在这里断下  EDX=00455058 (8)
    00C04A6F    812C24 64103460  sub     dword ptr [esp], 60341064
    00C04A76    E9 9E580000      jmp     00C0A319

    记下EDX的值:00455058
    继续F8一次,再在代码段下F2断点:
    00C4C574    FF33             push    dword ptr [ebx]    ;在这里断下
    00C4C576    FF3424           push    dword ptr [esp]
    00C4C579    E9 3C920600      jmp     00CB57BA
    00C4C57E    51               push    ecx
    程序仍然在取地址00456BDC中的值,可以不管它
    继续F8一次,再在代码段下F2断点:

    00453C3F    E8 D0E4FFFF      call    00452114   ;在这里断下,这里就OEP了,不过需要补代码
    00453C44    E8 1301FBFF      call    00403D5C   ;从这里大家就能看出来这是Delphi 6.0 的程序吧
    00453C49    8D40 00          lea     eax, dword ptr [eax]
    00453C4C    0000             add     byte ptr [eax], al
    00453C4E    0000             add     byte ptr [eax], al
    00453C50    0000             add     byte ptr [eax], al
    00453C52    0000             add     byte ptr [eax], al
    00453C54    0000             add     byte ptr [eax], al
    00453C56    0000             add     byte ptr [eax], al
    00453C58    0000             add     byte ptr [eax], al
    00453C5A    0000             add     byte ptr [eax], al
    00453C5C    0000             add     byte ptr [eax], al
    00453C5E    0000             add     byte ptr [eax], al
    00453C60    0000             add     byte ptr [eax], al
    00453C62    0000             add     byte ptr [eax], al
    00453C64    0000             add     byte ptr [eax], al

    好,找一个Delphi 6.0 的程序
    push    ebp
    mov     ebp, esp
    add     esp, -10
    mov     eax,00453A1C              上面(1)的EAX值
    call    00405C60                    (1)
    mov     eax, dword ptr [455058]     (2)
    mov     eax, dword ptr [eax]
    call    0045207C                    (3)
    mov     ecx, dword ptr [455138]     (4)
    mov     eax, dword ptr [455058]     (5)
    mov     eax, dword ptr [eax]
    mov     edx, dword ptr [453700]     (6)  
    call    00452094                    (7)
    mov     eax, dword ptr [455058]     (8)
    mov     eax, dword ptr [eax]
    call    00452114
    call    00403D5C
    lea     eax, dword ptr [eax]
    add     byte ptr [eax], al
    add     byte ptr [eax], al

    补代码地址如下:

    00453C04    55               push    ebp
    00453C05    8BEC             mov     ebp, esp
    00453C07    83C4 F0          add     esp, -10
    00453C0A    B8 1C3A4500      mov     eax, 00453A1C
    00453C0F    E8 4C20FBFF      call    00405C60
    00453C14    A1 58504500      mov     eax, dword ptr [455058]
    00453C19    8B00             mov     eax, dword ptr [eax]
    00453C1B    E8 5CE4FFFF      call    0045207C
    00453C20    8B0D 38514500    mov     ecx, dword ptr [455138]    ; Project1.00456C00
    00453C26    A1 58504500      mov     eax, dword ptr [455058]
    00453C2B    8B00             mov     eax, dword ptr [eax]
    00453C2D    8B15 00374500    mov     edx, dword ptr [453700]    ; Project1.0045374C
    00453C33    E8 5CE4FFFF      call    00452094
    00453C38    A1 58504500      mov     eax, dword ptr [455058]
    00453C3D    8B00             mov     eax, dword ptr [eax]

    在00453C04处新建EIP 然后DUMP出来,修复都没有问题,可是运行不了,后来一跟踪才知道有VM,请教高手
    是不是还需要补区段?

    评分

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

    查看全部评分

    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-4-30 16:47:56 | 显示全部楼层
    赞一个,很详细,很暴力。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-5-5 16:37:26 | 显示全部楼层
    好贴,顶一下~~~~~~~~~~~~
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-5-6 12:35:07 | 显示全部楼层
    如果把程序也一起带上来方便大家学习研究,那就更好了
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-5-20 00:30:34 | 显示全部楼层
    一般是要补区段。好还你那没有KEY,有KEY的话就跑不起来了
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2024-2-21 13:53
  • 签到天数: 624 天

    [LV.9]以坛为家II

    发表于 2008-5-21 19:03:29 | 显示全部楼层
    对啊。有个程序就更好了。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2020-12-31 08:08
  • 签到天数: 7 天

    [LV.3]偶尔看看II

     楼主| 发表于 2008-5-22 14:18:44 | 显示全部楼层
    原程序在这里:http://www.namipan.com/d/Project1.exe/c8bd2ba302bb8c0d5fca2bf85a02d5553a435ada00201500
    有兴趣的朋友可以练习练习!!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-5-22 20:01:41 | 显示全部楼层
    附件没有勒,楼主能不能换个地址~
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-5-25 02:04:41 | 显示全部楼层
    要慢慢学习研究下了
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-7-16 20:29:44 | 显示全部楼层
    /:good 好贴啊
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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