首页
社区
课程
招聘
[原创]riijj Crackme13 算法简析
发表于: 2007-5-12 13:41 12330

[原创]riijj Crackme13 算法简析

2007-5-12 13:41
12330

【文章标题】: riijj Crackme13 算法简析
【文章作者】: hawking
【作者邮箱】: [EMAIL="rich_hawking@hotmail.com"]rich_hawking@hotmail.com[/EMAIL]
【软件名称】: riijj Crackme 13
【软件大小】: 332K
【下载地址】: http://bbs.pediy.com/showthread.php?t=44271
【保护方式】: 子进程
【编写语言】: VC++ 6.0
【使用工具】: OD PEiD TaskExplorer
【操作平台】: win2k
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  可能自己是从riijj crackme1入门的吧,怀有某种情结,一直以来都很喜欢riijj的crackme作品。(真实原因是riijj的Crackme类型多变,讲究的是自己喜欢的调试技巧,而不是自己不熟悉的算法部分吧 )
  这次我们再来看看riijj最新的Riijj crackme 13吧。
  OD载入,一看就是标准的C++程序的OEP。我们直接来到Main函数。
  
  0040518D  |> \6A 0A         push    0A
  0040518F  |.  58            pop     eax
  00405190  |>  50            push    eax                              ; /Arg4
  00405191  |.  FF75 9C       push    dword ptr [ebp-64]               ; |Arg3
  00405194  |.  56            push    esi                              ; |Arg2
  00405195  |.  56            push    esi                              ; |/pModule
  00405196  |.  FF15 60C04000 call    dword ptr [<&KERNEL32.GetModuleH>; |\GetModuleHandleA
  0040519C  |.  50            push    eax                              ; |Arg1
  0040519D  |.  E8 0EC1FFFF   call    004012B0                         ; \crackme1.004012B0 Main函数
  
  004012B0  /$  81EC 1C050000 sub     esp, 51C
  004012B6  |.  33C0          xor     eax, eax
  004012B8  |.  8A4C24 03     mov     cl, byte ptr [esp+3]
  .......................................
  00401310  |.  52            push    edx
  00401311  |.  8D4C24 48     lea     ecx, dword ptr [esp+48]
  00401315  |.  50            push    eax
  00401316  |.  51            push    ecx
  00401317  |.  E8 54FDFFFF   call    00401070        ;提取bin资源
  0040131C  |.  8B4424 5C     mov     eax, dword ptr [esp+5C]
  00401320  |.  8B4C24 60     mov     ecx, dword ptr [esp+60]
  00401324  |.  8D9424 6C0100>lea     edx, dword ptr [esp+16C]
  0040132B  |.  52            push    edx
  0040132C  |.  50            push    eax
  0040132D  |.  51            push    ecx
  0040132E  |.  E8 CDFCFFFF   call    00401000        ;创建临时文件wood
  00401333  |.  83C4 1C       add     esp, 1C
  00401336  |.  8D5424 7C     lea     edx, dword ptr [esp+7C]
  0040133A  |.  33F6          xor     esi, esi
  0040133C  |.  52            push    edx                              ; /pThreadId
  0040133D  |.  56            push    esi                              ; |CreationFlags => 0
  0040133E  |.  56            push    esi                              ; |pThreadParm => NULL
  0040133F  |.  68 20124000   push    00401220                         ; |ThreadFunction = crackme1.00401220
  00401344  |.  56            push    esi                              ; |StackSize => 0
  00401345  |.  56            push    esi                              ; |pSecurity => NULL
  00401346  |.  FF15 30C04000 call    dword ptr [<&KERNEL32.CreateThre>; \CreateThread 这个线程显示 Now Loading 窗口
  0040134C  |.  8D5424 14     lea     edx, dword ptr [esp+14]
  00401350  |.  8B4424 44     mov     eax, dword ptr [esp+44]
  00401354  |.  8B4C24 40     mov     ecx, dword ptr [esp+40]
  00401358  |.  50            push    eax
  00401359  |.  51            push    ecx
  0040135A  |.  52            push    edx
  0040135B  |.  E8 A0FDFFFF   call    00401100
  00401360  |.  B9 11000000   mov     ecx, 11
  00401365  |.  33C0          xor     eax, eax
  00401367  |.  8DBC24 240100>lea     edi, dword ptr [esp+124]
  0040136E  |.  83C4 0C       add     esp, 0C
  00401371  |.  F3:AB         rep     stos dword ptr es:[edi]
  00401373  |.  894424 2C     mov     dword ptr [esp+2C], eax
  00401377  |.  B9 18000000   mov     ecx, 18
  0040137C  |.  894424 30     mov     dword ptr [esp+30], eax
  00401380  |.  8DBC24 B80000>lea     edi, dword ptr [esp+B8]
  00401387  |.  894424 34     mov     dword ptr [esp+34], eax
  0040138B  |.  8D9424 180100>lea     edx, dword ptr [esp+118]
  00401392  |.  F3:AB         rep     stos dword ptr es:[edi]
  00401394  |.  8D4C24 2C     lea     ecx, dword ptr [esp+2C]
  00401398  |.  894424 38     mov     dword ptr [esp+38], eax
  0040139C  |.  51            push    ecx                              ; /pProcessInfo
  0040139D  |.  52            push    edx                              ; |pStartupInfo
  0040139E  |.  56            push    esi                              ; |CurrentDir
  0040139F  |.  56            push    esi                              ; |pEnvironment
  004013A0  |.  6A 01         push    1                                ; |CreationFlags = DEBUG_PROCESS
  004013A2  |.  56            push    esi                              ; |InheritHandles
  004013A3  |.  56            push    esi                              ; |pThreadSecurity
  004013A4  |.  56            push    esi                              ; |pProcessSecurity
  004013A5  |.  8D8424 7C0100>lea     eax, dword ptr [esp+17C]         ; |
  004013AC  |.  56            push    esi                              ; |CommandLine
  004013AD  |.  50            push    eax                              ; |ModuleFileName
  004013AE  |.  C78424 400100>mov     dword ptr [esp+140], 44          ; |
  004013B9  |.  FF15 2CC04000 call    dword ptr [<&KERNEL32.CreateProc>; \CreateProcessA  以DEBUG_PROCESS方式创建wood子进程
  004013BF  |.  397424 2C     cmp     dword ptr [esp+2C], esi
  004013C3  |.  75 2E         jnz     short 004013F3
  004013C5  |.  8B4424 18     mov     eax, dword ptr [esp+18]
  004013C9  |.  8D4C24 24     lea     ecx, dword ptr [esp+24]
  004013CD  |.  50            push    eax
  004013CE  |.  51            push    ecx
  004013CF  |.  8D4C24 1C     lea     ecx, dword ptr [esp+1C]
  004013D3  |.  E8 68020000   call    00401640
  004013D8  |.  8B10          mov     edx, dword ptr [eax]
  004013DA  |.  8D4424 2C     lea     eax, dword ptr [esp+2C]
  004013DE  |.  52            push    edx
  004013DF  |.  50            push    eax
  004013E0  |.  8D4C24 20     lea     ecx, dword ptr [esp+20]
  004013E4  |.  E8 67020000   call    00401650
  004013E9  |.  8B4C24 18     mov     ecx, dword ptr [esp+18]
  004013ED  |.  51            push    ecx
  004013EE  |.  E9 98010000   jmp     0040158B
  004013F3  |>  897424 3C     mov     dword ptr [esp+3C], esi
  004013F7  |>  8B5424 34     /mov     edx, dword ptr [esp+34]
  004013FB  |.  B9 18000000   |mov     ecx, 18
  00401400  |.  33C0          |xor     eax, eax
  00401402  |.  8DBC24 B80000>|lea     edi, dword ptr [esp+B8]
  00401409  |.  F3:AB         |rep     stos dword ptr es:[edi]
  0040140B  |.  8B4424 38     |mov     eax, dword ptr [esp+38]
  0040140F  |.  8D8C24 B80000>|lea     ecx, dword ptr [esp+B8]
  00401416  |.  6A FF         |push    -1                              ; /Timeout = INFINITE
  00401418  |.  51            |push    ecx                             ; |pDebugEvent
  00401419  |.  899424 C40000>|mov     dword ptr [esp+C4], edx         ; |
  00401420  |.  898424 C80000>|mov     dword ptr [esp+C8], eax         ; |
  00401427  |.  FF15 28C04000 |call    dword ptr [<&KERNEL32.WaitForDe>; \WaitForDebugEvent
  0040142D  |.  8B8424 B80000>|mov     eax, dword ptr [esp+B8]
  00401434  |.  48            |dec     eax                             ;  Switch (cases 1..5)
  00401435  |.  74 0E         |je      short 00401445
  00401437  |.  83E8 04       |sub     eax, 4
  0040143A  |.  0F84 30010000 |je      00401570
  00401440  |.  E9 0B010000   |jmp     00401550
  00401445  |>  8BAC24 D00000>|mov     ebp, dword ptr [esp+D0]         ;  Case 1 of switch 00401434
  0040144C  |.  81FD 00005000 |cmp     ebp, 500000
  00401452  |.  896C24 28     |mov     dword ptr [esp+28], ebp
  00401456  |.  0F83 F4000000 |jnb     00401550
  0040145C  |.  B9 06000000   |mov     ecx, 6
  00401461  |.  8D7424 54     |lea     esi, dword ptr [esp+54]
  00401465  |.  8DBC24 A00000>|lea     edi, dword ptr [esp+A0]
  0040146C  |.  89AC24 9C0000>|mov     dword ptr [esp+9C], ebp
  00401473  |.  8D9424 9C0000>|lea     edx, dword ptr [esp+9C]
  0040147A  |.  8D4424 6C     |lea     eax, dword ptr [esp+6C]
  0040147E  |.  F3:A5         |rep     movs dword ptr es:[edi], dword >
  00401480  |.  52            |push    edx
  00401481  |.  50            |push    eax
  00401482  |.  8D4C24 1C     |lea     ecx, dword ptr [esp+1C]
  00401486  |.  E8 95020000   |call    00401720
  0040148B  |.  8D7424 54     |lea     esi, dword ptr [esp+54]
  0040148F  |.  8DBC24 840000>|lea     edi, dword ptr [esp+84]
  00401496  |.  8B4C24 6C     |mov     ecx, dword ptr [esp+6C]
  0040149A  |.  89AC24 800000>|mov     dword ptr [esp+80], ebp
  004014A1  |.  8D9424 800000>|lea     edx, dword ptr [esp+80]
  004014A8  |.  8D4424 74     |lea     eax, dword ptr [esp+74]
  004014AC  |.  8B59 10       |mov     ebx, dword ptr [ecx+10]
  004014AF  |.  B9 06000000   |mov     ecx, 6
  004014B4  |.  F3:A5         |rep     movs dword ptr es:[edi], dword >
  004014B6  |.  52            |push    edx
  004014B7  |.  50            |push    eax
  004014B8  |.  8D4C24 1C     |lea     ecx, dword ptr [esp+1C]
  004014BC  |.  E8 5F020000   |call    00401720
  004014C1  |.  8B35 24C04000 |mov     esi, dword ptr [<&KERNEL32.Writ>;  KERNEL32.WriteProcessMemory
  004014C7  |.  8D4C24 48     |lea     ecx, dword ptr [esp+48]
  004014CB  |.  8B5424 74     |mov     edx, dword ptr [esp+74]
  004014CF  |.  51            |push    ecx                             ; /pBytesWritten
  004014D0  |.  8B4C24 30     |mov     ecx, dword ptr [esp+30]         ; |
  004014D4  |.  83C2 14       |add     edx, 14                         ; |
  004014D7  |.  53            |push    ebx                             ; |BytesToWrite
  004014D8  |.  8BC5          |mov     eax, ebp                        ; |
  004014DA  |.  52            |push    edx                             ; |Buffer
  004014DB  |.  50            |push    eax                             ; |Address
  004014DC  |.  51            |push    ecx                             ; |hProcess
  004014DD  |.  FFD6          |call    esi                             ; \WriteProcessMemory 实时解密wood子进程当前代码语句
  004014DF  |.  85C0          |test    eax, eax
  004014E1  |.  0F84 E8000000 |je      004015CF
  004014E7  |.  8B4424 30     |mov     eax, dword ptr [esp+30]
  004014EB  |.  8D9424 600200>|lea     edx, dword ptr [esp+260]
  004014F2  |.  BF 07000100   |mov     edi, 10007
  004014F7  |.  52            |push    edx                             ; /pContext
  004014F8  |.  50            |push    eax                             ; |hThread
  004014F9  |.  89BC24 680200>|mov     dword ptr [esp+268], edi        ; |
  00401500  |.  FF15 20C04000 |call    dword ptr [<&KERNEL32.GetThread>; \GetThreadContext
  00401506  |.  8D8C24 600200>|lea     ecx, dword ptr [esp+260]
  0040150D  |.  89BC24 600200>|mov     dword ptr [esp+260], edi
  00401514  |.  8B5424 30     |mov     edx, dword ptr [esp+30]
  00401518  |.  51            |push    ecx                             ; /pContext
  00401519  |.  52            |push    edx                             ; |hThread
  0040151A  |.  89AC24 200300>|mov     dword ptr [esp+320], ebp        ; |
  00401521  |.  FF15 1CC04000 |call    dword ptr [<&KERNEL32.SetThread>; \SetThreadContext
  00401527  |.  8B4424 3C     |mov     eax, dword ptr [esp+3C]
  0040152B  |.  85C0          |test    eax, eax
  0040152D      74 17         je      short 00401546   ;修改成jmp short 00401546,然后F9运行程序。输入试炼码后并注册后,Dump出wood文件。riijj简介中说这个东西运行得慢一点,结构有少许特别。其实也就慢在这里了,改成jmp之后会时显感觉速度快多了。
  0040152F  |.  8B5424 24     |mov     edx, dword ptr [esp+24]
  00401533  |.  8D4C24 48     |lea     ecx, dword ptr [esp+48]
  00401537  |.  51            |push    ecx                             ; /pBytesWritten
  00401538  |.  8D4C24 58     |lea     ecx, dword ptr [esp+58]         ; |
  0040153C  |.  52            |push    edx                             ; |BytesToWrite
  0040153D  |.  8B5424 34     |mov     edx, dword ptr [esp+34]         ; |
  00401541  |.  51            |push    ecx                             ; |Buffer
  00401542  |.  50            |push    eax                             ; |Address
  00401543  |.  52            |push    edx                             ; |hProcess
  00401544  |.  FFD6          |call    esi                             ; \WriteProcessMemory  重新将CC写回wood子进程。如果这里被执行,将会导致子进程每条语句执行前都需要重新解密,将会严重影响程序性能。
  00401546  |>  896C24 3C     |mov     dword ptr [esp+3C], ebp
  0040154A  |.  895C24 24     |mov     dword ptr [esp+24], ebx
  0040154E  |.  33F6          |xor     esi, esi
  00401550  |>  8B8424 C00000>|mov     eax, dword ptr [esp+C0]         ;  Default case of switch 00401434
  00401557  |.  8B8C24 BC0000>|mov     ecx, dword ptr [esp+BC]
  0040155E  |.  68 02000100   |push    10002                           ; /ContinueStatus = DBG_CONTINUE
  00401563  |.  50            |push    eax                             ; |ThreadId
  00401564  |.  51            |push    ecx                             ; |ProcessId
  00401565  |.  FF15 18C04000 |call    dword ptr [<&KERNEL32.ContinueD>; \ContinueDebugEvent
  0040156B  |.^ E9 87FEFFFF   \jmp     004013F7
  00401570  |>  8B4424 18     mov     eax, dword ptr [esp+18]          ;  Case 5 of switch 00401434
  00401574  |.  8D5424 24     lea     edx, dword ptr [esp+24]
  00401578  |.  50            push    eax
  .......................................
  0040162F  |>  5F            pop     edi
  00401630  |.  5E            pop     esi
  00401631  |.  5D            pop     ebp
  00401632  |.  83C8 FF       or      eax, FFFFFFFF
  00401635  |.  5B            pop     ebx
  00401636  |.  81C4 1C050000 add     esp, 51C
  0040163C  \.  C2 1000       retn    10
  
  我们修改0040152D处代码后F9直接运行程序,然后输入自己的用户名及Key试一试,确保wood注册这一块的主要代码都被运行一遍之后,用Task Explorer Dump出wood进程保存为wood_dumped.exe。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (21)
雪    币: 1969
活跃值: (46)
能力值: (RANK:550 )
在线值:
发帖
回帖
粉丝
2
OD载入刚刚Dump出来的文件wood_dumped.exe 这同样是一个标准的C++程序OEP
  但是由于先前父进程只解密了程序执行过的语句,所以这里还是有很多的CC代码。
  F9直接运行会出错,根据出错提示一一加以修改就行了。
  
  repl 00401F97,#??#,#90#,2
  asm 00401E10,"jmp 00401E1E"
  repl 004034F4,#??#,#90#,2
  asm 004034FB,"jmp 0040350B"
  repl 0040350F,#??#,#90#,2
  asm 00401458,"jmp short 00401460"
  ret

  
  终于看到注册的界面了。F7跟进Main函数看一下。
  
  004010C0  /$  83EC 4C       sub     esp, 4C
  004010C3  |.  53            push    ebx
  004010C4  |.  55            push    ebp
  004010C5  |.  56            push    esi
  004010C6  |.  8B7424 5C     mov     esi, dword ptr [esp+5C]
  004010CA  |.  57            push    edi
    .......................................
  00401108  |.  6A 65         push    65                               ; /RsrcName = 101.
  0040110A  |.  56            push    esi                              ; |hInst
  0040110B  |.  894424 50     mov     dword ptr [esp+50], eax          ; |
  0040110F  |.  C74424 54 100>mov     dword ptr [esp+54], 10           ; |
  00401117  |.  896C24 58     mov     dword ptr [esp+58], ebp          ; |
  0040111B  |.  C74424 5C F87>mov     dword ptr [esp+5C], 004070F8     ; |dappleclass
  00401123  |.  FFD7          call    edi                              ; \LoadIconA
  00401125  |.  894424 58     mov     dword ptr [esp+58], eax
  00401129  |.  8D4424 2C     lea     eax, dword ptr [esp+2C]
  0040112D  |.  50            push    eax                              ; /pWndClassEx
  0040112E  |.  FF15 AC704000 call    dword ptr [<&USER32.RegisterClas>; \RegisterClassExA
  
00401134  |.  8B3D B0704000 mov     edi, dword ptr [<&USER32.GetSyst>;  USER32.GetSystemMetrics
    .......................................
  00401143  |.  99            cdq
  00401144  |.  55            push    ebp                              ; /lParam => NULL
  00401145  |.  2BC2          sub     eax, edx                         ; |
  00401147  |.  56            push    esi                              ; |hInst
  00401148  |.  55            push    ebp                              ; |hMenu => NULL
  00401149  |.  D1F8          sar     eax, 1                           ; |
  0040114B  |.  55            push    ebp                              ; |hParent => NULL
  0040114C  |.  68 D2000000   push    0D2                              ; |Height = D2 (210.)
  00401151  |.  83E8 69       sub     eax, 69                          ; |
  00401154  |.  68 2C010000   push    12C                              ; |Width = 12C (300.)
  00401159  |.  50            push    eax                              ; |Y
  0040115A  |.  8BC3          mov     eax, ebx                         ; |
  0040115C  |.  99            cdq                                      ; |
  0040115D  |.  2BC2          sub     eax, edx                         ; |
  0040115F  |.  D1F8          sar     eax, 1                           ; |
  00401161  |.  2D 96000000   sub     eax, 96                          ; |
  00401166  |.  50            push    eax                              ; |X
  00401167  |.  68 00008A00   push    8A0000                           ; |Style = WS_OVERLAPPED|WS_MINIMIZEBOX|WS_SYSMENU|WS_BORDER
  0040116C  |.  68 68804000   push    00408068                         ; |WindowName = "Riijj - Crackme 13 20070510"
  00401171  |.  68 F8704000   push    004070F8                         ; |dappleclass
  00401176  |.  55            push    ebp                              ; |ExtStyle => 0
  00401177  |.  FF15 B4704000 call    dword ptr [<&USER32.CreateWindow>; \CreateWindowExA
  0040117D  |.  55            push    ebp                              ; /lParam => 0
  0040117E  |.  68 70104000   push    00401070                         ; |pDlgProc = wood_Dum.00401070  注意一下这里
  00401183  |.  50            push    eax                              ; |hOwner
  00401184  |.  6A 65         push    65                               ; |pTemplate = 65
  00401186  |.  56            push    esi                              ; |hInst
  00401187  |.  A3 30A84000   mov     dword ptr [40A830], eax          ; |
  0040118C  |.  FF15 B8704000 call    dword ptr [<&USER32.CreateDialog>; \CreateDialogParamA
  00401192  |.  8B0D 30A84000 mov     ecx, dword ptr [40A830]
    .......................................
  004011F6  |> /8B0D 34A84000 /mov     ecx, dword ptr [40A834]
  004011FC  |. |8D4424 10     |lea     eax, dword ptr [esp+10]
  00401200  |. |50            |push    eax                             ; /pMsg
  00401201  |. |51            |push    ecx                             ; |hWnd => 0016076A
  00401202  |. |FF15 D4704000 |call    dword ptr [<&USER32.IsDialogMes>; \IsDialogMessageA
  00401208  |. |85C0          |test    eax, eax
  0040120A  |. |75 0E         |jnz     short 0040121A
  0040120C  |. |8D5424 10     |lea     edx, dword ptr [esp+10]
  00401210  |. |52            |push    edx
  00401211  |. |FFD7          |call    edi
  00401213  |. |8D4424 10     |lea     eax, dword ptr [esp+10]
  00401217  |. |50            |push    eax
  00401218  |. |FFD3          |call    ebx
  0040121A  |> |55            |push    ebp
  0040121B  |. |55            |push    ebp
  0040121C  |. |8D4C24 18     |lea     ecx, dword ptr [esp+18]
  00401220  |. |55            |push    ebp
  00401221  |. |51            |push    ecx
  00401222  |. |FFD6          |call    esi
  00401224  |. |85C0          |test    eax, eax
  00401226  |.^\75 CE         \jnz     short 004011F6
  00401228  |>  CC            int3
  00401229  |.  CC            int3
  
  00401070   .  8B4424 08     mov     eax, dword ptr [esp+8]
  00401074   .  3D 10010000   cmp     eax, 110
  00401079   .  75 1C         jnz     short 00401097
  0040107B   .  8B4424 04     mov     eax, dword ptr [esp+4]
  0040107F   .  68 E8030000   push    3E8                              ; /ControlID = 3E8 (1000.)
  00401084   .  50            push    eax                              ; |hWnd
  00401085   .  FF15 D8704000 call    dword ptr [<&USER32.GetDlgItem>] ; \GetDlgItem
  0040108B   .  50            push    eax                              ; /hWnd
  0040108C   .  FF15 DC704000 call    dword ptr [<&USER32.SetFocus>]   ; \SetFocus
  00401092   .  33C0          xor     eax, eax
  00401094   .  C2 1000       retn    10
  00401097   >  3D 11010000   cmp     eax, 111                         ;WM_COMMAND事件
  0040109C   .  75 0E         jnz     short 004010AC
  0040109E   .  66:817C24 0C >cmp     word ptr [esp+C], 3EA            ;按钮ID
  004010A5   .  75 05         jnz     short 004010AC
  004010A7   .  E8 94010000   call    00401240
  004010AC   >  33C0          xor     eax, eax
  004010AE   .  C2 1000       retn    10
  
  我们直接在00401240处F2下断点,然后F9运行程序,输入用户名及Key并点击注册按钮后就会停在这里了。
2007-5-12 14:00
0
雪    币: 1969
活跃值: (46)
能力值: (RANK:550 )
在线值:
发帖
回帖
粉丝
3
00401240  |$  83EC 74       sub     esp, 74
  00401243  |.  53            push    ebx
  00401244  |.  56            push    esi
  00401245  |.  57            push    edi
  00401246  |.  B9 0A000000   mov     ecx, 0A
  0040124B  |.  33C0          xor     eax, eax
  0040124D  |.  8D7C24 55     lea     edi, dword ptr [esp+55]
  00401251  |.  C64424 54 00  mov     byte ptr [esp+54], 0
  00401256  |.  8B35 A0704000 mov     esi, dword ptr [<&USER32.GetDlgI>;  USER32.GetDlgItemTextA
  0040125C  |.  F3:AB         rep     stos dword ptr es:[edi]
  0040125E  |.  B9 0A000000   mov     ecx, 0A
  00401263  |.  8D7C24 29     lea     edi, dword ptr [esp+29]
  00401267  |.  884424 28     mov     byte ptr [esp+28], al
  0040126B  |.  6A 15         push    15                               ; /Count = 15 (21.) 用户名最大有效长度21个字符
  0040126D  |.  F3:AB         rep     stos dword ptr es:[edi]          ; |
  0040126F  |.  8B0D 34A84000 mov     ecx, dword ptr [40A834]          ; |
  00401275  |.  8D4424 14     lea     eax, dword ptr [esp+14]          ; |
  00401279  |.  50            push    eax                              ; |Buffer
  0040127A  |.  68 E8030000   push    3E8                              ; |ControlID = 3E8 (1000.)
  0040127F  |.  51            push    ecx                              ; |hWnd => 0016076A
  00401280  |.  FFD6          call    esi                              ; \GetDlgItemTextA
  00401282  |.  A1 34A84000   mov     eax, dword ptr [40A834]
  00401287  |.  8D5424 54     lea     edx, dword ptr [esp+54]
  0040128B  |.  6A 29         push    29                               ; /Count = 29 (41.) key最大有效长度40个字符
  0040128D  |.  52            push    edx                              ; |Buffer
  0040128E  |.  68 E9030000   push    3E9                              ; |ControlID = 3E9 (1001.)
  00401293  |.  50            push    eax                              ; |hWnd => 0016076A
  00401294  |.  FFD6          call    esi                              ; \GetDlgItemTextA
  00401296  |.  8D7C24 10     lea     edi, dword ptr [esp+10]
  0040129A  |.  83C9 FF       or      ecx, FFFFFFFF
  0040129D  |.  33C0          xor     eax, eax
  0040129F  |.  F2:AE         repne   scas byte ptr es:[edi]
  004012A1  |.  F7D1          not     ecx
  004012A3  |.  49            dec     ecx
  004012A4  |.  8BD9          mov     ebx, ecx
  004012A6  |.  83FB 03       cmp     ebx, 3                           ;  用户名长度不得小于3
  004012A9  |.  7C 74         jl      short 0040131F
  004012AB  |.  55            push    ebp
  
  004012AC  |.  33ED          xor     ebp, ebp             ;  i=0
  004012AE  |.  896C24 10     mov     dword ptr [esp+10], >
  004012B2  |.  33F6          xor     esi, esi             ;  j=0
  004012B4  |>  DB4424 10     /fild    dword ptr [esp+10]
  004012B8  |.  8BC5          |mov     eax, ebp
  004012BA  |.  B9 28000000   |mov     ecx, 28
  004012BF  |.  99            |cdq
  004012C0  |.  D9FE          |fsin                        ;  sin(i)
  004012C2  |.  F7F9          |idiv    ecx
  004012C4  |.  8D7C14 2C     |lea     edi, dword ptr [esp>;  result[i%0x28]
  004012C8  |.  DC0D 08714000 |fmul    qword ptr [407108]  ;  sin(i) * (-100)
  004012CE  |.  E8 AD000000   |call    00401380            ;  将结果转换成整数t
  004012D3  |.  8A0F          |mov     cl, byte ptr [edi]
  004012D5  |.  2AC8          |sub     cl, al              ;  result[i%0x28] - t
  004012D7  |.  8BC6          |mov     eax, esi
  004012D9  |.  99            |cdq
  004012DA  |.  F7FB          |idiv    ebx                 ;  j % len(name)
  004012DC  |.  83C6 03       |add     esi, 3              ;  j = j + 3
  004012DF  |.  8A4414 14     |mov     al, byte ptr [esp+e>;  name[j%len]
  004012E3  |.  32C8          |xor     cl, al              ;  result[i%0x28] = (result[i%0x28] - t ) ^ name[j%len]
  004012E5  |.  45            |inc     ebp                 ;  i++
  004012E6  |.  81FE 2C010000 |cmp     esi, 12C            ;  j < 0x12C ?
  004012EC  |.  880F          |mov     byte ptr [edi], cl  ;  result[i%0x28] = (result[i%0x28] - t ) ^ name[j%len]
  004012EE  |.  896C24 10     |mov     dword ptr [esp+10],>
  004012F2  |.^ 7C C0         \jl      short 004012B4
  004012F4  |.  33C9          xor     ecx, ecx             ;  i = 0
  004012F6  |.  5D            pop     ebp
  004012F7  |>  0FBE440C 28   /movsx   eax, byte ptr [esp+>;  result[i]
  004012FC  |.  99            |cdq
  004012FD  |.  33C2          |xor     eax, edx
  004012FF  |.  BE 1A000000   |mov     esi, 1A
  00401304  |.  2BC2          |sub     eax, edx
  00401306  |.  99            |cdq
  00401307  |.  F7FE          |idiv    esi                 ;  result[i] % 0x1A
  00401309  |.  8A440C 54     |mov     al, byte ptr [esp+e>;  key[i]
  0040130D  |.  80C2 61       |add     dl, 61              ;  result[i] % 0x1A + 0x61
  00401310  |.  3AD0          |cmp     dl, al
  00401312  |.  75 0B         |jnz     short 0040131F      ;  key[i] == result[i] % 0x1A + 0x61 ?
  00401314  |.  41            |inc     ecx
  00401315  |.  83F9 28       |cmp     ecx, 28             ;  由此可知key一共40(0x28)个字符
  00401318  |.^ 7C DD         \jl      short 004012F7
  0040131A  |.  E8 31FDFFFF   call    00401050             ;  弹出成功对话框
  0040131F  |>  5F            pop     edi
  00401320  |.  5E            pop     esi
  00401321  |.  5B            pop     ebx
  00401322  |.  83C4 74       add     esp, 74
  00401325  \.  C3            retn
  
  C#版本代码(注册机)
     byte[] result = new byte[0x28];
     byte[] name = System.Text.Encoding.Default.GetBytes(tbName.Text);
     int len = name.Length;
     if ( len < 3 ) return;
     for ( int i = 0 , j = 0 ; j < 0x12C ; i++ , j = j + 3 )
     {
      byte k = (byte)(Math.Sin(i) * (-100));
      result[i%0x28] = (byte)((result[i%0x28]-k) ^ name[j%len]);
     }
     for ( int i = 0 ; i < 0x28 ; i++ )
     {
      result[i] = (byte)(((result[i] >= 0x80 ? (0x100 - result[i]) : result[i])  % 0x1A) + 0x61) ;
     }
     tbKey.Text = System.Text.Encoding.Default.GetString(result);
  
  总结:
  其实这个crackme算法简单,难度不大。主要就是父进程通过DEBUG_PROCESS方式创建子进程,造成了我们无法对子进程直接进行Ring3级的调试。想办法在子进程代码解密之后Dump出来分析,这个Crackme就没有什么难度了。
  riijj还有一个Crackme4 也是自调试的Crackme,感觉难度比这个要大,而且更有意思。有兴趣的朋友可以看看(http://bbs.pediy.com/showthread.php?t=10799)。
2007-5-12 14:36
0
雪    币: 47147
活跃值: (20450)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
分析的精彩,等riijj回来评介.:)
2007-5-12 14:46
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
5
riijj的cm一个比一个有创意
期待riijj的Protector.exe
2007-5-12 14:58
0
雪    币: 333
活跃值: (116)
能力值: ( LV9,RANK:570 )
在线值:
发帖
回帖
粉丝
6
hawking 太气人了 ,太气人了 ,我才找到一点点头绪,一上论坛,你都把注册机写出来了,小小的'鄙视'你一下 ,嘿嘿。。。

希望看懂你的大作之前,riijj版的v14不要出来呀!
2007-5-12 15:41
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
请教下hawking:
  为什么解密出来后的程序不能正常的运行?而需要处理下?按理说存在CC的地方程序并没有经过啊?
先谢谢了
2007-5-12 19:30
0
雪    币: 1969
活跃值: (46)
能力值: (RANK:550 )
在线值:
发帖
回帖
粉丝
8
下次不敢了


因为子进程并没有解密完全,只是运行过的代码被解密了。而直接运行dump出来的程序和其作为子进程被运行时,某些跳转时的条件有不一样,所以需要处理下。不知道这样理解对不对?如果能将完整的子进程dump出来就完美了
2007-5-12 19:45
0
雪    币: 242
活跃值: (1664)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
9
精彩,学习!
2007-5-12 22:37
0
雪    币: 538
活跃值: (460)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
10
[QUOTE=;]...[/QUOTE]
不懂“子进程”。。。。还是支持下。。。。。。。
2007-5-12 22:38
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
11
解释十分清楚,谢谢 hawking兄 !

这个 crackme 的第二次 WriteProcessMemory,的确是使程序很慢,它的作用就是使程序每一次也需要解密。当然,我也知道它会轻易被大家 nop 了

你说得对啊, crackme 4 是比这个复杂,它的难度也是源于它复杂 ! 是很麻烦的东西 ~  呵呵~~

我在编写时,想过好不好在 core process内,加入一些检查自己某些地方是不是 0xCC 的检测,如果不是 0xCC 便自杀。但想过后,还是觉得用处不大,不弄了

算法中有一个 sin 的数学function,是因为我无聊,加入去的,没有甚么意思
2007-5-12 23:36
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
hawking 兄:  00401314  |.  41            |inc     ecx
  00401315  |.  83F9 28       |cmp     ecx, 28             ;  由此可知key一共40(0x28)个字符
  00401318  |.^ 7C DD         \jl      short 004012F7
  0040131A  |.  E8 31FDFFFF   call    00401050             ;  弹出成功对话框
  0040131F  |>  5F            pop     edi
  00401320  |.  5E            pop     esi
  00401321  |.  5B            pop     ebx
  00401322  |.  83C4 74       add     esp, 74
  00401325  \.  C3            retn

上面这段我DUMP出来的程序里没有,因为后面是第一位KEY正确后和注册成功后的代码.请问你是通过得到KEY后才DUMP出来的这段或者是你用的其它方法,请指教,万分感谢!!
2007-5-13 21:40
0
雪    币: 1969
活跃值: (46)
能力值: (RANK:550 )
在线值:
发帖
回帖
粉丝
13
newmovie兄弟客气了,大家一起学习进步  
其实我也是先分析算法,然后找了个能运行到下面代码的临时key然后再重新dump出来的。
2007-5-13 21:51
0
雪    币: 1969
活跃值: (46)
能力值: (RANK:550 )
在线值:
发帖
回帖
粉丝
14
上面我们提到了用工具直接dump出子进程,但是这个方案有个局限性,那就是只有被运行过的代码作了解密,没有运行到的代码依然是CC。
我们可以从CrackMe的资源文件中提取出两个Bin文件,分别保存为bin.exe和bin.dat 。
bin.exe和被程序复制到临时文件夹中的wood.exe是一样的,代码段全部都是CC,没有解密。
bin.dat并不是一个PE文件。
00000000h: 00 10 40 00 04 00 00 00 8B 4C 24 08 00 00 00 00 ; ..@.....婰$.....
00000010h: 00 00 00 00 00 00 00 00
85 3D E6 77 04 10 40 00 ; ........?鎤..@.
00000020h: 02 00 00 00 8B C1 30 36 00 00 00 00 00 00 00 00 ; ....嬃06........
00000030h: 00 00 00 00 85 3D E6 77 06 10 40 00 03 00 00 00 ; ....?鎤..@.....
00000040h: 83 E8 02 39 00 00 00 00 00 00 00 00 00 00 00 00 ; 冭.9............
00000050h: 85 3D E6 77 09 10 40 00 02 00 00 00 74 2E 30 42 ; ?鎤[EMAIL="..@.....t.0B"]..@.....t.0B[/EMAIL]
00000060h: 00 00 00 00 00 00 00 00 00 00 00 00 85 3D E6 77 ; ............?鎤
可以看出bin.dat中的数据都是按28个字节一组进行组织的,其中蓝色的部分代表代码在wood.exe中的地址,红色部分代表代码的长度,紫色部分代表代码的字节数据,最后绿色的部分应该是一个结束标志。
struct CodeInfo
  {
    uint Address ;
    uint Length ;
    byte Code[16] ;
    uint EndFlag ;
  };
有了这个数据结构和bin.dat中的数据,我们就可以自己动手写个小程序来完美解密wood.exe了。当然对于这个Crackme来说有点多此一举 。感兴趣riijj是怎样生成这个bin.dat文件,主要是怎样判断每条语句长度的。
上传的附件:
2007-5-15 20:06
0
雪    币: 1969
活跃值: (46)
能力值: (RANK:550 )
在线值:
发帖
回帖
粉丝
15
请教个关于imul的问题
B60B60B7 * 5 = 38E38E393
可是imul之后
EAX:8E38E393
EDX:FFFFFFFE

7FFFFFFF * 6 = 2FFFFFFFA
imul之后
EAX:FFFFFFFA
EDX:00000002
imul之后EDX值有什么规律没有?我看了关于imul指令的介绍依然没弄明白。
2007-5-15 20:47
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
16
数据结构也被解开了    hawking 兄很有耐心,分析很仔细

wood 是一块被挖空了的木头,现在你把那些也填回了,真正完美破解。

这个 cm 的制作方法有点麻烦,在写这个 cm 前,先要写一些工具,再使用 OD 和工具一起补助,把 wood制造出来,也把核心弄成这个 structure样子

cm13 的引导程序,懂得把核心读取,在内存建立好一个指令索引。当引导程序执行 wood, wood 便产生密集的中断,引导程序便找出相应的指令,放到中断位置。
2007-5-16 08:30
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
17
找了一篇 Intel software manual

---
Performs a signed multiplication of two operands. This instruction has three forms,
depending on the number of operands.

• One-operand form — This form is identical to that used by the MUL instruction.
Here, the source operand (in a general-purpose register or memory location) is
multiplied by the value in the AL, AX, EAX, or RAX register (depending on the
operand size) and the product is stored in the AX, DX:AX, EDX:EAX, or RDX:RAX
registers, respectively.

• Two-operand form — With this form the destination operand (the first
operand) is multiplied by the source operand (second operand). The destination
operand is a general-purpose register and the source operand is an immediate
value, a general-purpose register, or a memory location. The product is then
stored in the destination operand location.

• Three-operand form — This form requires a destination operand (the first
operand) and two source operands (the second and the third operands). Here,
the first source operand (which can be a general-purpose register or a memory
location) is multiplied by the second source operand (an immediate value). The
product is then stored in the destination operand (a general-purpose register).
When an immediate value is used as an operand, it is sign-extended to the length of
the destination operand format.

The CF and OF flags are set when significant bit (including the sign bit) are carried
into the upper half of the result. The CF and OF flags are cleared when the result
(including the sign bit) fits exactly in the lower half of the result.
The three forms of the IMUL instruction are similar in that the length of the product
is calculated to twice the length of the operands. With the one-operand form, the
product is stored exactly in the destination. With the two- and three- operand forms,
however, the result is truncated to the length of the destination before it is stored in
the destination register. Because of this truncation, the CF or OF flag should be tested
to ensure that no significant bits are lost.
2007-5-16 09:31
0
雪    币: 6051
活跃值: (1441)
能力值: ( LV15,RANK:1473 )
在线值:
发帖
回帖
粉丝
18
非常经典的分析,学习了!
2007-5-16 11:03
0
雪    币: 242
活跃值: (112)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
太感谢楼主了!!!
2007-5-18 15:39
0
雪    币: 241
活跃值: (35)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
看不明白,以后再学习!!
2007-5-26 09:33
0
雪    币: 4441
活跃值: (805)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
21
只有看了白看的份,太高深了
2007-5-26 09:41
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
好多要学的,新手真的是有些害怕,还是顶下

以后多练习练习!

2007-5-26 09:46
0
游客
登录 | 注册 方可回帖
返回
//