ZD Soft Screen Recorder 8.1算法的简单分析+注册机
本帖最后由 何必丨在意妳 于 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:
004187E1 .8B45 F8 mov eax,dword ptr ss:
004187E4 .85C0 test eax,eax
004187E6 .0F84 C5000000 je ScnRec.004188B1 ;判断Name是否为空
004187EC .8B07 mov eax,dword ptr ds:
004187EE .8B48 F8 mov ecx,dword ptr ds:
004187F1 .85C9 test ecx,ecx
004187F3 .0F84 B8000000 je ScnRec.004188B1 ;判断E-Mail是否为空
004187F9 .8B0B mov ecx,dword ptr ds:
004187FB .8B41 F8 mov eax,dword ptr ds:
004187FE .85C0 test eax,eax
00418800 .0F84 AB000000 je ScnRec.004188B1 ;判断Key是否为空
00418806 .8B4E 6C mov ecx,dword ptr ds:
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:
00418814 .8B4E 6C mov ecx,dword ptr ds:
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:
00418822 .8B4E 6C mov ecx,dword ptr ds:
00418825 .50 push eax
00418826 .E8 D5F30000 call ScnRec.00427C00
0041882B .8B4E 6C mov ecx,dword ptr ds:
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往下F800428245|.50 push eax
00428246|.E8 6FC00700 call jmp.&MFC42u.#??H@YG?AVCString@@ABV0@0@Z
往注册表里写入注册信息
0042824B|.8B00 mov eax,dword ptr ds:
0042824D|.8BCE mov ecx,esi
0042824F|.50 push eax
00428250|.68 E8030000 push 0x3E8
00428255|.C64424 20 01mov byte ptr ss:,0x1
0042825A E8 C1FDFFFF call ScnRec.00428020 ;算法
0042825F|.8D4C24 08 lea ecx,dword ptr ss:
00428263|.8946 18 mov dword ptr ds:,eax
00428266|.C64424 18 00mov byte ptr ss:,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: ;
00428026|.6A FF push -0x1
00428028|.68 08295000 push ScnRec.00502908
0042802D|.50 push eax
0042802E|.64:8925 00000>mov dword ptr fs:,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: ;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:
0042805A|.884424 10 mov byte ptr ss:,al
0042805E|.F3:AB rep stos dword ptr es:
00428060|.8B8424 8C0000>mov eax,dword ptr ss:
00428067|.8D4C24 10 lea ecx,dword ptr ss:
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:
0042808B|.66:895C24 34mov word ptr ss:,bx
00428090|.F3:AB rep stos dword ptr es:
00428092|.8D45 0C lea eax,
00428095|.8D8C24 8C0000>lea ecx,dword ptr ss:
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:,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:
004280BD|.6A 21 |push 0x21
004280BF|.52 |push edx
004280C0|.8D4424 18 |lea eax,dword ptr ss:
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:
004280D1|.8D5424 10 |lea edx,dword ptr ss:
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:
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: ;取当前数字的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: ;取当前数字的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:
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:
0042814D|.66:3D 4F00 ||cmp ax,0x4F
00428151|.66:894474 34||mov word ptr ss:,ax
00428156|.75 07 ||jnz short ScnRec.0042815F
00428158|.66:C74474 34 >||mov word ptr ss:,0x30
0042815F|>66:837C74 34 >||cmp word ptr ss:,0x49
00428165|.75 07 ||jnz short ScnRec.0042816E
00428167|.66:C74474 34 >||mov word ptr ss:,0x31
0042816E|>66:837C74 34 >||cmp word ptr ss:,0x5A
00428174|.75 07 ||jnz short ScnRec.0042817D
00428176|.66:C74474 34 >||mov word ptr ss:,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:
0042818B|.8BCD |mov ecx,ebp
0042818D|.52 |push edx
0042818E|.E8 6DFAFFFF |call ScnRec.00427C00
00428193|.8B8424 8C0000>|mov eax,dword ptr ss:
0042819A|.8B4D 0C |mov ecx,
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:
004281B3|.47 |inc edi
004281B4|.3BF8 |cmp edi,eax ;循环1000次
004281B6|.^ 0F8C FDFEFFFF \jl ScnRec.004280B9
004281BC|>8D8C24 8C0000>lea ecx,dword ptr ss:
004281C3|.8D77 01 lea esi,dword ptr ds:
004281C6|.C78424 800000>mov dword ptr ss:,-0x1
004281D1|.E8 7EC00700 call <jmp.&MFC42u.#??1CString@@QAE@XZ_800>
004281D6|.8BC6 mov eax,esi
004281D8|>8B4C24 78 mov ecx,dword ptr ss:
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:,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中的大写字母转化为小写字母
也就是本例中Software\ZDSoft\Screen Recorder\[email protected] 加密
加密后的结果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次,只要其中的某一次正确,程序即注册成功
初学易语言,代码比较渣感谢大家观看
PYG有你更精彩! 好作品!! 欢迎来到飘云阁发布原创作品,PYG 有你更精彩 前排学习,谢谢分享! 感谢分享原创,支持一下了 学习算法分析感谢 {:victory:} 很好的破文,感谢楼主 膜拜算法分析! 谢谢楼主,水平太低,主要看楼主贴出的过程。
羡慕楼主,的确是很羡慕,顶一下