本帖最后由 何必丨在意妳 于 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次,只要其中的某一次正确,程序即注册成功
感谢大家观看
|