| 本帖最后由 何必丨在意妳 于 2015-7-20 11:22 编辑 
 
 ZD Soft Screen Recorder 是一款高性能的屏幕录像机,它可以录制屏幕活动(可以是全屏、指定的区域、指定的窗口等)为视频文件,并实时同步录制音频(使用LAME编码),供演示或讲解之用。 
 1.首先用PEID查壳,无壳,是QT程序  接着我们来到注册窗口,随便填入KEY等 
 由于软件会占用F8和F9键,最好提前修改一下
 
 
 2.输入注册信息之后点击OK,我们用 F12暂停法, ALT+K打开调用堆栈窗口我们会发现,有很多调用,其中绝大多数都是在系统领空,我们找到程序领空的调用就只有几个,我是直接给它们全部下断点,重载程序。看看那个能断下来,段下来之后通过它,再找关键位置 
   
 程序在此处断下00418790,往下F8,来到下面 复制代码004187DE   .  8B6D 00       mov ebp,dword ptr ss:[ebp]
004187E1   .  8B45 F8       mov eax,dword ptr ss:[ebp-0x8]
004187E4   .  85C0          test eax,eax
004187E6   .  0F84 C5000000 je ScnRec.004188B1                            ;  判断Name是否为空
004187EC   .  8B07          mov eax,dword ptr ds:[edi]
004187EE   .  8B48 F8       mov ecx,dword ptr ds:[eax-0x8]
004187F1   .  85C9          test ecx,ecx
004187F3   .  0F84 B8000000 je ScnRec.004188B1                            ;  判断E-Mail是否为空
004187F9   .  8B0B          mov ecx,dword ptr ds:[ebx]
004187FB   .  8B41 F8       mov eax,dword ptr ds:[ecx-0x8]
004187FE   .  85C0          test eax,eax
00418800   .  0F84 AB000000 je ScnRec.004188B1                            ;  判断Key是否为空
00418806   .  8B4E 6C       mov ecx,dword ptr ds:[esi+0x6C]
00418809   .  55            push ebp
0041880A   .  83C1 04       add ecx,0x4
0041880D   .  E8 54BA0800   call <jmp.&MFC42u.#??4CString@@QAEABV0@PBG@Z_>
00418812   .  8B17          mov edx,dword ptr ds:[edi]
00418814   .  8B4E 6C       mov ecx,dword ptr ds:[esi+0x6C]
00418817   .  52            push edx
00418818   .  83C1 08       add ecx,0x8
0041881B   .  E8 46BA0800   call <jmp.&MFC42u.#??4CString@@QAEABV0@PBG@Z_>
00418820   .  8B03          mov eax,dword ptr ds:[ebx]
00418822   .  8B4E 6C       mov ecx,dword ptr ds:[esi+0x6C]
00418825   .  50            push eax
00418826   .  E8 D5F30000   call ScnRec.00427C00                          
0041882B   .  8B4E 6C       mov ecx,dword ptr ds:[esi+0x6C]
0041882E   .  E8 BDF90000   call ScnRec.004281F0                           关键点
00418833   .  85C0          test eax,eax
00418835   .  75 3A         jnz short ScnRec.00418871
00418837   .  E8 66BA0800   call <jmp.&MFC42u.#?AfxGetThread@@YGPAVCWinTh>
F7进入0041882E  往下F8 复制代码00428245  |.  50            push eax
00428246  |.  E8 6FC00700   call jmp.&MFC42u.#??H@YG?AVCString@@ABV0@0@Z  
往注册表里写入注册信息
0042824B  |.  8B00          mov eax,dword ptr ds:[eax]
0042824D  |.  8BCE          mov ecx,esi
0042824F  |.  50            push eax
00428250  |.  68 E8030000   push 0x3E8
00428255  |.  C64424 20 01  mov byte ptr ss:[esp+0x20],0x1
0042825A      E8 C1FDFFFF   call ScnRec.00428020                          ;  算法
0042825F  |.  8D4C24 08     lea ecx,dword ptr ss:[esp+0x8]
00428263  |.  8946 18       mov dword ptr ds:[esi+0x18],eax
00428266  |.  C64424 18 00  mov byte ptr ss:[esp+0x18],0x0
0042826B  |.  E8 E4BF0700   call <jmp.&MFC42u.#??1CString@@QAE@XZ_800>
F7进入0042825A  来到下面关键算法 复制代码00428020  /[        DISCUZ_CODE_11        ]nbsp; 64:A1 0000000>mov eax,dword ptr fs:[0]                       ;   
00428026  |.  6A FF         push -0x1
00428028  |.  68 08295000   push ScnRec.00502908
0042802D  |.  50            push eax
0042802E  |.  64:8925 00000>mov dword ptr fs:[0],esp
00428035  |.  83EC 68       sub esp,0x68
00428038  |.  33C0          xor eax,eax
0042803A  |.  53            push ebx
0042803B  |.  55            push ebp
0042803C  |.  56            push esi
0042803D  |.  8BB424 840000>mov esi,dword ptr ss:[esp+0x84]                ;  ScnRec.0042825F
00428044  |.  33DB          xor ebx,ebx
00428046  |.  57            push edi
00428047  |.  3BF3          cmp esi,ebx
00428049  |.  8BE9          mov ebp,ecx
0042804B  |.  0F8E 87010000 jle ScnRec.004281D8
00428051  |.  B9 08000000   mov ecx,0x8
00428056  |.  8D7C24 11     lea edi,dword ptr ss:[esp+0x11]
0042805A  |.  884424 10     mov byte ptr ss:[esp+0x10],al
0042805E  |.  F3:AB         rep stos dword ptr es:[edi]
00428060  |.  8B8424 8C0000>mov eax,dword ptr ss:[esp+0x8C]
00428067  |.  8D4C24 10     lea ecx,dword ptr ss:[esp+0x10]
0042806B  |.  50            push eax
0042806C  |.  51            push ecx
0042806D  |.  8BCD          mov ecx,ebp
0042806F  |.  E8 ECFDFFFF   call ScnRec.00427E60                           ;  MD5加密
00428074  |.  85C0          test eax,eax
00428076  |.  75 08         jnz short ScnRec.00428080
00428078  |.  83C8 FF       or eax,-0x1
0042807B  |.  E9 58010000   jmp ScnRec.004281D8
00428080  |>  B9 10000000   mov ecx,0x10
00428085  |.  33C0          xor eax,eax
00428087  |.  8D7C24 36     lea edi,dword ptr ss:[esp+0x36]
0042808B  |.  66:895C24 34  mov word ptr ss:[esp+0x34],bx
00428090  |.  F3:AB         rep stos dword ptr es:[edi]
00428092  |.  8D45 0C       lea eax,[arg.2]
00428095  |.  8D8C24 8C0000>lea ecx,dword ptr ss:[esp+0x8C]
0042809C  |.  50            push eax
0042809D  |.  E8 30C20700   call <jmp.&MFC42u.#??0CString@@QAE@ABV0@@Z_535>
004280A2  |.  33FF          xor edi,edi
004280A4  |.  3BF3          cmp esi,ebx
004280A6  |.  899C24 800000>mov dword ptr ss:[esp+0x80],ebx
004280AD  |.  0F8E 09010000 jle ScnRec.004281BC
004280B3  |.  8B1D 64315200 mov ebx,dword ptr ds:[<&KERNEL32.MultiByteToWi>;  kernel32.MultiByteToWideChar
004280B9  |>  8D5424 34     /lea edx,dword ptr ss:[esp+0x34]
004280BD  |.  6A 21         |push 0x21
004280BF  |.  52            |push edx
004280C0  |.  8D4424 18     |lea eax,dword ptr ss:[esp+0x18]
004280C4  |.  6A FF         |push -0x1
004280C6  |.  50            |push eax
004280C7  |.  6A 00         |push 0x0
004280C9  |.  6A 00         |push 0x0
004280CB  |.  FFD3          |call ebx
004280CD  |.  8D4C24 34     |lea ecx,dword ptr ss:[esp+0x34]
004280D1  |.  8D5424 10     |lea edx,dword ptr ss:[esp+0x10]
004280D5  |.  51            |push ecx
004280D6  |.  52            |push edx
004280D7  |.  8BCD          |mov ecx,ebp
004280D9  |.  E8 82FDFFFF   |call ScnRec.00427E60                          ;  MD5加密
004280DE  |.  33F6          |xor esi,esi
004280E0  |>  66:8B4474 34  |/mov ax,word ptr ss:[esp+esi*2+0x34]
004280E5  |.  50            ||push eax                                     ; /w
004280E6  |.  FF15 D4365200 ||call dword ptr ds:[<&MSVCRT.iswalpha>]       ; \判断是否是字符或数字
004280EC  |.  83C4 04       ||add esp,0x4
004280EF  |.  85C0          ||test eax,eax
004280F1  |.  0F85 86000000 ||jnz ScnRec.0042817D
004280F7  |.  8BC6          ||mov eax,esi                                  ;  先进行位数的比较,前一位
004280F9  |.  25 01000080   ||and eax,0x80000001                           ;  前面得位数与0x80000001与运算
004280FE  |.  79 05         ||jns short ScnRec.00428105                    ;  sf=0跳转
00428100  |.  48            ||dec eax
00428101  |.  83C8 FE       ||or eax,-0x2
00428104  |.  40            ||inc eax
00428105  |>  74 16         ||je short ScnRec.0042811D                     ;  zf=1跳,当EAX=0时跳    奇数位不跳
00428107  |.  33C9          ||xor ecx,ecx
00428109  |.  66:8B4C74 34  ||mov cx,word ptr ss:[esp+esi*2+0x34]          ;  取当前数字的ASCII码
0042810E  |.  81E1 01000080 ||and ecx,0x80000001
00428114  |.  79 05         ||jns short ScnRec.0042811B
00428116  |.  49            ||dec ecx
00428117  |.  83C9 FE       ||or ecx,-0x2
0042811A  |.  41            ||inc ecx
0042811B  |>  75 60         ||jnz short ScnRec.0042817D                    ;  ZF=0跳,数字的ASCII码为奇数位时,跳转
0042811D  |>  85C0          ||test eax,eax
0042811F  |.  75 16         ||jnz short ScnRec.00428137                    ;  当EAX=0时不跳
00428121  |.  33D2          ||xor edx,edx
00428123  |.  66:8B5474 34  ||mov dx,word ptr ss:[esp+esi*2+0x34]          ;  取当前数字的ASCII码
00428128  |.  81E2 01000080 ||and edx,0x80000001
0042812E  |.  79 05         ||jns short ScnRec.00428135
00428130  |.  4A            ||dec edx
00428131  |.  83CA FE       ||or edx,-0x2
00428134  |.  42            ||inc edx
00428135  |>  74 46         ||je short ScnRec.0042817D
00428137  |>  33C0          ||xor eax,eax
00428139  |.  B9 14000000   ||mov ecx,0x14
0042813E  |.  66:8B4474 34  ||mov ax,word ptr ss:[esp+esi*2+0x34]
00428143  |.  03C6          ||add eax,esi
00428145  |.  03C7          ||add eax,edi
00428147  |.  99            ||cdq
00428148  |.  F7F9          ||idiv ecx
0042814A  |.  8D42 47       ||lea eax,dword ptr ds:[edx+0x47]
0042814D  |.  66:3D 4F00    ||cmp ax,0x4F
00428151  |.  66:894474 34  ||mov word ptr ss:[esp+esi*2+0x34],ax
00428156  |.  75 07         ||jnz short ScnRec.0042815F
00428158  |.  66:C74474 34 >||mov word ptr ss:[esp+esi*2+0x34],0x30
0042815F  |>  66:837C74 34 >||cmp word ptr ss:[esp+esi*2+0x34],0x49
00428165  |.  75 07         ||jnz short ScnRec.0042816E
00428167  |.  66:C74474 34 >||mov word ptr ss:[esp+esi*2+0x34],0x31
0042816E  |>  66:837C74 34 >||cmp word ptr ss:[esp+esi*2+0x34],0x5A
00428174  |.  75 07         ||jnz short ScnRec.0042817D
00428176  |.  66:C74474 34 >||mov word ptr ss:[esp+esi*2+0x34],0x32
0042817D  |>  46            ||inc esi
0042817E  |.  83FE 20       ||cmp esi,0x20
00428181  |.^ 0F8C 59FFFFFF |\jl ScnRec.004280E0
00428187  |.  8D5424 34     |lea edx,dword ptr ss:[esp+0x34]
0042818B  |.  8BCD          |mov ecx,ebp
0042818D  |.  52            |push edx
0042818E  |.  E8 6DFAFFFF   |call ScnRec.00427C00
00428193  |.  8B8424 8C0000>|mov eax,dword ptr ss:[esp+0x8C]
0042819A  |.  8B4D 0C       |mov ecx,[arg.2]
0042819D  |.  50            |push eax                                      ; /wstr2 = 00000001 ???
0042819E  |.  51            |push ecx                                      ; |wstr1 = "??P..艟B?"
0042819F  |.  FF15 80365200 |call dword ptr ds:[<&MSVCRT.wcscmp>]          ; \wcscmp
004281A5  |.  83C4 08       |add esp,0x8
004281A8      85C0          test eax,eax
004281AA      74 10         je short ScnRec.004281BC
004281AC      8B8424 880000>mov eax,dword ptr ss:[esp+0x88]
004281B3  |.  47            |inc edi
004281B4  |.  3BF8          |cmp edi,eax                                   ;  循环1000次
004281B6  |.^ 0F8C FDFEFFFF \jl ScnRec.004280B9
004281BC  |>  8D8C24 8C0000>lea ecx,dword ptr ss:[esp+0x8C]
004281C3  |.  8D77 01       lea esi,dword ptr ds:[edi+0x1]
004281C6  |.  C78424 800000>mov dword ptr ss:[esp+0x80],-0x1
004281D1  |.  E8 7EC00700   call <jmp.&MFC42u.#??1CString@@QAE@XZ_800>
004281D6  |.  8BC6          mov eax,esi
004281D8  |>  8B4C24 78     mov ecx,dword ptr ss:[esp+0x78]
004281DC  |.  5F            pop edi                                        ;  0012F138
004281DD  |.  5E            pop esi                                        ;  0012F138
004281DE  |.  5D            pop ebp                                        ;  0012F138
004281DF  |.  5B            pop ebx                                        ;  0012F138
004281E0  |.  64:890D 00000>mov dword ptr fs:[0],ecx
004281E7  |.  83C4 74       add esp,0x74
004281EA  \.  C2 0800       retn 0x8
3.算法流程
 
 这个0042806F  |.  E8ECFDFFFF   call ScnRec.00427E60          ; 是MD5加密 
 将你输入的 “Software\ZDSoft\Screen Recorder\输入的E-Mail”  加密(不包括引号) 
 程序会先将E-Mail中的大写字母转化为小写字母 
 
 加密后的结果D8BE24247C846E0343B4F0E9B870A097 
 004280D9 |.  E8 82FDFFFF   |call ScnRec.00427E60(此处加密不进行算法运算)将上次的MD5结果再次进行MD5加密,保存,以被下次循环时直接使用
 
 
 先判断是否是字母,若是字母直接保留,循环验证下一位。若不是则
 1.判断他的前一位,位数是否为奇数,是,则判断该数字的ASCII码是否为奇数,如果是则不改变数字
 
 2.判断他的前一位,位数是否为偶数,是,则判断该数字的ASCII码是否为奇数,如果是奇数则进行运算
 
 3.判断他的前一位,位数是否为奇数,是,则判断该数字的ASCII码是否为偶数,如果是偶数则进行运算
 
 4.判断他的前一位,位数是否为偶数,是,则判断该数字的ASCII码是否为偶数,如果是则不改变数字
 
 一共分为4中情况,同是偶数或同是奇数是不改变数字的,否则将进行运算。
 
 上面的偶数或奇数的称呼,只是我对与运算之后结果进行相应运算的称呼,纯属个人理解称呼。
 
 其中的运算过程:
 1.该数字的ASCII码+该数字在字符串中的位置序号-1+当前是第几次MD5循环
 
 2.将上面的结果除以0x14取余数,余数+0x47的ASCII码转化为字符,填在该数字的相应位置
 
 最后,将上面的结果与输入的KEY进行循环验证,循环1000次,只要其中的某一次正确,程序即注册成功
 
 
 
   
 
 感谢大家观看
 
 
 |