【文章标题】: 骗子软件(远程视频嗅探器)算法分析
【文章作者】: 网络断魂
【软件名称】: 远程视频嗅探器
【下载地址】: 见附件!
【加壳方式】: 无壳
【保护方式】: 用户名+注册码
【编写语言】: Microsoft Visual C++ 6.0
【使用工具】: OD
【操作平台】: winxp2
【作者声明】: 菜鸟学习算法,失误之处请多指教!
今天拿到一个软件“远程视频嗅探器”,想分析一下算法,分析来分析去原来这软件无解,不管什么注册码都是错误的,软件留了一个“免费注册”,欺骗网友帮他们做推广!被人耍了,特此发布破文,供我这样的菜鸟人物学习算法之用,
1、PEID查壳,Microsoft Visual C++ 6.0
2、根据字符串提示找到关键点:
00402420 . 6A FF push -1
00402422 . 68 D04F4000 push 00404FD0 ; 膏n@; SE 处理程序安装
00402427 . 64:A1 0000000>mov eax, dword ptr fs:[0]
0040242D . 50 push eax
0040242E . 64:8925 00000>mov dword ptr fs:[0], esp
00402435 . 83EC 0C sub esp, 0C
00402438 . 53 push ebx
00402439 . 55 push ebp
0040243A . 56 push esi
0040243B . 57 push edi
0040243C . 8BF9 mov edi, ecx
0040243E . 8D4C24 10 lea ecx, dword ptr [esp+10]
00402442 . E8 79240000 call <jmp.&MFC42.#540>
00402447 . 8D4424 10 lea eax, dword ptr [esp+10]
0040244B . 33F6 xor esi, esi ; //标志位清零
0040244D . 50 push eax
0040244E . 68 EB030000 push 3EB
00402453 . 8BCF mov ecx, edi
00402455 . 897424 2C mov dword ptr [esp+2C], esi
00402459 . E8 80240000 call <jmp.&MFC42.#3092>
0040245E . 8BC8 mov ecx, eax
00402460 . E8 A9240000 call <jmp.&MFC42.#3874> ; //计算注册码长度,
00402465 . 8B4C24 10 mov ecx, dword ptr [esp+10] ; //送注册码
00402469 . 8B69 F8 mov ebp, dword ptr [ecx-8] ; //送长度
0040246C . 3BEE cmp ebp, esi ; //注册码是否为空
0040246E . 75 3F jnz short 004024AF ; //不为空则跳走
00402470 . 56 push esi
00402471 . 56 push esi
00402472 . 51 push ecx
00402473 . 8BCC mov ecx, esp
00402475 . 896424 20 mov dword ptr [esp+20], esp
00402479 . 68 D0814000 push 004081D0 ; x+vpymrkyovxorlhwuuhow==
0040247E . E8 61240000 call <jmp.&MFC42.#537>
00402483 . 8D5424 20 lea edx, dword ptr [esp+20] ; |
00402487 . 8BCF mov ecx, edi ; |
00402489 . 52 push edx ; |Arg1
0040248A . E8 A1010000 call 00402630 ; \远程视频.00402630
0040248F . 8BC8 mov ecx, eax
00402491 . C64424 2C 01 mov byte ptr [esp+2C], 1
00402496 . E8 55020000 call 004026F0
0040249B . 50 push eax
0040249C . E8 97240000 call <jmp.&MFC42.#1200>
004024A1 . C64424 24 00 mov byte ptr [esp+24], 0
004024A6 . 8D4C24 14 lea ecx, dword ptr [esp+14]
004024AA . E9 B2000000 jmp 00402561
004024AF > 83FD 23 cmp ebp, 23 ; //长度是否为23(35)位
004024B2 . 74 3C je short 004024F0 ; //是则跳走
004024B4 . 56 push esi
004024B5 . 56 push esi
004024B6 . 51 push ecx
004024B7 . 8BCC mov ecx, esp
004024B9 . 896424 20 mov dword ptr [esp+20], esp
004024BD . 68 8C814000 push 0040818C ; 16ky4clrs6s2ylk7ttsjrmfr1nnk5mjr0ru0zqos16ls4rk70qrt0l/vupghow==
004024C2 . E8 1D240000 call <jmp.&MFC42.#537>
004024C7 . 8D4424 20 lea eax, dword ptr [esp+20] ; |
004024CB . 8BCF mov ecx, edi ; |
004024CD . 50 push eax ; |Arg1
004024CE . E8 5D010000 call 00402630 ; \远程视频.00402630
004024D3 . 8BC8 mov ecx, eax
004024D5 . C64424 2C 02 mov byte ptr [esp+2C], 2
004024DA . E8 11020000 call 004026F0
004024DF . 50 push eax
004024E0 . E8 53240000 call <jmp.&MFC42.#1200> ; //注册码长度不对
004024E5 . C64424 24 00 mov byte ptr [esp+24], 0
004024EA . 8D4C24 14 lea ecx, dword ptr [esp+14]
004024EE . EB 71 jmp short 00402561
004024F0 > 3BEE cmp ebp, esi ; //再次较验注册码是否为空,
004024F2 . 7E 31 jle short 00402525 ; //为空则跳走,跳往错误
004024F4 > 8B4C24 10 mov ecx, dword ptr [esp+10] ; //送注册码
004024F8 . 8A1C0E mov bl, byte ptr [esi+ecx] ; //依次取注册码
004024FB . 0FBED3 movsx edx, bl ; //送取到的注册码
004024FE . 52 push edx ; /c
004024FF . FF15 C0624000 call dword ptr [<&MSVCRT.isdigit>] ; \如果参数是一个十进制的数字,函数将返回一个非零数字。如果不符合判断条件,返回0
00402505 . 83C4 04 add esp, 4
00402508 . 85C0 test eax, eax ; //通过EAX返回值,非零说明是数字,是数字则取下一位
0040250A . 75 14 jnz short 00402520
0040250C . 80FB 61 cmp bl, 61 ; //与61(a)比较
0040250F . 7C 05 jl short 00402516 ; //小于转移
00402511 . 80FB 7A cmp bl, 7A ; //与7A(z)比较
00402514 . 7E 0A jle short 00402520 ; //小于等于则转移,这两个比较确认是不是小定字母
00402516 > 80FB 41 cmp bl, 41 ; //若小于61(a)则与41(A)比较
00402519 . 7C 6F jl short 0040258A ; //小于则转移
0040251B . 80FB 5A cmp bl, 5A ; //与5A(Z)比较
0040251E . 7F 6A jg short 0040258A ; //大于转移,这两个比较确认是不是大写字母
00402520 > 46 inc esi ; //是小写字母则跳到此处,标志位+1,取下一位
00402521 . 3BF5 cmp esi, ebp ; //标志位与注册码长度比较,是否取完
00402523 .^ 7C CF jl short 004024F4 ; //没取完则取下一位
00402525 > 6A 00 push 0 ; //是字母则死,说明注册码中不能含字母
00402527 . 6A 00 push 0
00402529 . 51 push ecx
0040252A . 8BCC mov ecx, esp
0040252C . 896424 24 mov dword ptr [esp+24], esp
00402530 . 68 78814000 push 00408178 ; zt7qp7xe16ky4clr
00402535 . E8 AA230000 call <jmp.&MFC42.#537>
0040253A . 8D4C24 24 lea ecx, dword ptr [esp+24] ; |
0040253E . 51 push ecx ; |Arg1
0040253F . 8BCF mov ecx, edi ; |
00402541 . E8 EA000000 call 00402630 ; \远程视频.00402630
00402546 . 8BC8 mov ecx, eax
00402548 . C64424 2C 05 mov byte ptr [esp+2C], 5
0040254D . E8 9E010000 call 004026F0
00402552 . 50 push eax
00402553 . E8 E0230000 call <jmp.&MFC42.#1200> ; //无效的注册码
00402558 . C64424 24 00 mov byte ptr [esp+24], 0
0040255D . 8D4C24 18 lea ecx, dword ptr [esp+18]
00402561 > E8 42230000 call <jmp.&MFC42.#800>
00402566 . 8D4C24 10 lea ecx, dword ptr [esp+10]
0040256A . C74424 24 FFF>mov dword ptr [esp+24], -1
00402572 . E8 31230000 call <jmp.&MFC42.#800>
00402577 . 8B4C24 1C mov ecx, dword ptr [esp+1C]
0040257B . 5F pop edi
0040257C . 5E pop esi
0040257D . 5D pop ebp
0040257E . 64:890D 00000>mov dword ptr fs:[0], ecx
00402585 . 5B pop ebx
00402586 . 83C4 18 add esp, 18
00402589 . C3 retn
0040258A > 85F6 test esi, esi ; //不是字母则跳来此处,较验标志位是否仍为空
0040258C . 74 4F je short 004025DD ; //不管什么条什都会跳了,(数字,字母都死亡,标志位加不上去)
0040258E . 8BC6 mov eax, esi
00402590 . B9 06000000 mov ecx, 6
00402595 . 99 cdq
00402596 . F7F9 idiv ecx
00402598 . 85D2 test edx, edx
0040259A . 75 41 jnz short 004025DD
0040259C . 80FB 2D cmp bl, 2D
0040259F . 74 3C je short 004025DD
004025A1 . 52 push edx
004025A2 . 52 push edx
004025A3 . 51 push ecx
004025A4 . 8BCC mov ecx, esp
004025A6 . 896424 20 mov dword ptr [esp+20], esp
004025AA . 68 64814000 push 00408164 ; uphkvbk7ttshow==
004025AF . E8 30230000 call <jmp.&MFC42.#537>
004025B4 . 8D5424 20 lea edx, dword ptr [esp+20] ; |
004025B8 . 8BCF mov ecx, edi ; |
004025BA . 52 push edx ; |Arg1
004025BB . E8 70000000 call 00402630 ; \远程视频.00402630
004025C0 . 8BC8 mov ecx, eax
004025C2 . C64424 2C 03 mov byte ptr [esp+2C], 3
004025C7 . E8 24010000 call 004026F0
004025CC . 50 push eax
004025CD . E8 66230000 call <jmp.&MFC42.#1200>
004025D2 . C64424 24 00 mov byte ptr [esp+24], 0
004025D7 . 8D4C24 14 lea ecx, dword ptr [esp+14]
004025DB .^ EB 84 jmp short 00402561
004025DD > 6A 00 push 0 ; //为空跳来此处
004025DF . 6A 00 push 0
004025E1 . 51 push ecx
004025E2 . 8BCC mov ecx, esp
004025E4 . 896424 20 mov dword ptr [esp+20], esp
004025E8 . 68 4C814000 push 0040814C ; tobu2rfht6jx1rf7oam=
004025ED . E8 F2220000 call <jmp.&MFC42.#537>
004025F2 . 8D4424 20 lea eax, dword ptr [esp+20] ; |
004025F6 . 8BCF mov ecx, edi ; |
004025F8 . 50 push eax ; |Arg1
004025F9 . E8 32000000 call 00402630 ; \远程视频.00402630
004025FE . 8BC8 mov ecx, eax
00402600 . C64424 2C 04 mov byte ptr [esp+2C], 4
00402605 . E8 E6000000 call 004026F0
0040260A . 50 push eax
0040260B . E8 28230000 call <jmp.&MFC42.#1200> ; //存在非法字符(汗死!!!! 骗人的软件!)
00402610 . C64424 24 00 mov byte ptr [esp+24], 0
00402615 . 8D4C24 14 lea ecx, dword ptr [esp+14]
00402619 .^ E9 43FFFFFF jmp 00402561
算法总结:
1、注册码要求为35位,不为注册码则提示位数不对,
2、通过C库函数MSVCRT.isdigit返回值较验注册码是否为数字,是数字则取下一位
3、较验注册码是否为大小写字母,是则取下一位,一直到取完,然后提示你无效的注册码,
4、若注册码即不是字母也不是数字,直接提示你有非法字符
5、软件注册码不存在,纯属骗人的软件
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!