新年某CM第一篇菜鸟级算法分析
本帖最后由 Rooking 于 2015-1-1 16:33 编辑首先恭祝各位兄弟姐妹,大叔大嫂,姥姥老爷,孙子孙女们,新年好,万事吉,行大运.
头一次这么认真的看一个CM 了 居然还是VB 程序 代码臭长 浪费了好久 算法 是不难 但是难找 (对于我来说 哈哈)
此CM 是GG 找来的放群共享的 于是下载下来练练手.
不多说了 来说说CM吧
首先CM加了UPX 上工具杀之
其次CM 编辑框 是灰色的 NND 上工具杀之
下来是算法了,拖入OD先
查找一下字符串 很好 有提示
高兴吧 双击进来,经过分析后第一个提示失败的是 检测用户名 不是7位 直接挂掉
那就输入7位吧 我的名字刚好七位 不信? Rooking 你数一下? 呵呵
直接贴代码吧
比较用户名是否7位 不等直接挂
<font color="#ff0000">00401FE3 .FF15 28104000 call dword ptr ds: ;msvbvm60.__vbaHresultCheckObj
00401FE9 >8B45 A8 mov eax,dword ptr ss: ;取用户名
00401FEC .50 push eax ; /String
00401FED .FF15 10104000 call dword ptr ds: ; \__vbaLenBstr
00401FF3 .33DB xor ebx,ebx ;取长度
00401FF5 .83F8 07 cmp eax,0x7
00401FF8 .0F94C3 sete bl
00401FFB .8D4D A8 lea ecx,dword ptr ss:
00401FFE .4B dec ebx
00401FFF .FF15 B8104000 call dword ptr ds: ;msvbvm60.__vbaFreeStr
00402005 .8D4D A0 lea ecx,dword ptr ss:
00402008 .FF15 BC104000 call dword ptr ds: ;msvbvm60.__vbaFreeObj
0040200E .66:3BDF cmp bx,di
00402011 .74 4A je short 0040205D ;gglhy-cr.0040205D \\\\\\\\\\\\\比较用户名是否7位 不等直接挂</font>
取用户名每一位ASC+1之后累计和
<font color="#0000ff">7710A759 0FBF46 08 movsx eax,word ptr ds: ; 取用户名每一位ASC+1之后累计和
7710A75D 0FBF4F 08 movsx ecx,word ptr ds:
7710A761 03C1 add eax,ecx
7710A763 0FBFC8 movsx ecx,ax
7710A766 3BC1 cmp eax,ecx
7710A768 8B4D 10 mov ecx,dword ptr ss:</font>
取用户名第一位ASC
<font color="#008000">004022C2 .50 push eax ; /String
004022C3 .FF15 20104000 call dword ptr ds: ; \rtcAnsiValueBstr
004022C9 .8D4D AC lea ecx,dword ptr ss: ;\\\\\\\\\\\\\取用户名第一位ASC
004022CC .66:8985 68FFF>mov word ptr ss:,ax
004022D3 .8D95 60FFFFFF lea edx,dword ptr ss:
004022D9 .51 push ecx ; /var18
004022DA .8D45 80 lea eax,dword ptr ss: ; |
004022DD .52 push edx ; |var28
004022DE .50 push eax ; |SaveTo8
004022DF .899D 60FFFFFF mov dword ptr ss:,ebx ; |
004022E5 .FF15 68104000 call dword ptr ds: ; \\\\\\\\\\\__vbaVarMul \\\\\\\\\\相乘
004022EB .8BD0 mov edx,eax
004022ED .8D4D AC lea ecx,dword ptr ss:</font>
取用户名最后一位ASC
<font color="#696969">0040236F .FF15 48104000 call dword ptr ds: ;msvbvm60.rtcMidCharBstr
00402375 .8BD0 mov edx,eax ; \\\\\\\\\\\\\\\\\最后一位
00402377 .8D4D A4 lea ecx,dword ptr ss:
0040237A .FF15 A4104000 call dword ptr ds: ;msvbvm60.__vbaStrMove
00402380 .50 push eax ; /String
00402381 .FF15 20104000 call dword ptr ds: ; \rtcAnsiValueBstr
00402387 .66:8985 68FFF>mov word ptr ss:,ax ; \\\\\\\\\\\\\\\\\\(g)ASC=67
0040238E .8D55 AC lea edx,dword ptr ss:
00402391 .8D85 60FFFFFF lea eax,dword ptr ss:
00402397 .52 push edx
00402398 .8D4D 80 lea ecx,dword ptr ss:
0040239B .50 push eax
0040239C .51 push ecx
0040239D .899D 60FFFFFF mov dword ptr ss:,ebx
004023A3 .FF15 30104000 call dword ptr ds: ;msvbvm60.__vbaVarXor \\\\\\\\\\异或</font>
取注册码第三位并与上面异或结果相乘
<font color="#800080">00402419 > \8B45 A8 mov eax,dword ptr ss: ;\\\\\\\\\\\\\\\\\\\\\\\取注册码
0040241C .8D55 90 lea edx,dword ptr ss:
0040241F .52 push edx
00402420 .6A 03 push 0x3
00402422 .50 push eax
00402423 .C745 98 01000>mov dword ptr ss:,0x1
0040242A .895D 90 mov dword ptr ss:,ebx
0040242D .FF15 48104000 call dword ptr ds: ;msvbvm60.rtcMidCharBstr
00402433 .8BD0 mov edx,eax ; \\\\\\\\\\\\\\\\\\\取注册码第3位
00402435 .8D4D A4 lea ecx,dword ptr ss:
00402438 .FF15 A4104000 call dword ptr ds: ;msvbvm60.__vbaStrMove
0040243E .50 push eax ; /String
0040243F .FF15 20104000 call dword ptr ds: ; \rtcAnsiValueBstr
00402445 .8D4D AC lea ecx,dword ptr ss: ; \\\\\\\\\\\\\\\\\\\\\取字符后转ASC
00402448 .66:8985 68FFF>mov word ptr ss:,ax
0040244F .8D95 60FFFFFF lea edx,dword ptr ss:
00402455 .51 push ecx ; /var18
00402456 .8D45 80 lea eax,dword ptr ss: ; |
00402459 .52 push edx ; |var28
0040245A .50 push eax ; |SaveTo8
0040245B .899D 60FFFFFF mov dword ptr ss:,ebx ; |
00402461 .FF15 68104000 call dword ptr ds: ; \__vbaVarMul
00402467 .8BD0 mov edx,eax</font>
与A相除,余数重新组合
<font color="#008080">
770FA4ED 8B45 08 mov eax,dword ptr ss: ; \\\\\\\\\\\\\\\\\相乘 结果放EAX
770FA4F0 33D2 xor edx,edx
770FA4F2 6A 0A push 0xA
770FA4F4 5B pop ebx
770FA4F5 F7F3 div ebx ; \\\\\\\\\\\\\\\\\\324C6F/A=4B1D3余数7放ebx
770FA4F7 83C2 30 add edx,0x30 ; 取ASC
770FA4FA 66:8911 mov word ptr ds:,dx ; \\\\\\\\\\\\\\\\\\\\\\\\得到一组新的字符串
770FA4FD 41 inc ecx
770FA4FE 41 inc ecx
770FA4FF 85C0 test eax,eax
770FA501 8945 08 mov dword ptr ss:,eax
770FA504^ 77 E7 ja short 770FA4ED ; oleaut32.770FA4ED</font>
翻转结果(即真码)
<font color="#0000ff">770FA50D 66:8B16 mov dx,word ptr ds: ; \\\\\\\\\\\\\\\\\\\\\\\\翻转字符串
770FA510 66:8B01 mov ax,word ptr ds:
770FA513 66:8911 mov word ptr ds:,dx
770FA516 49 dec ecx
770FA517 66:8906 mov word ptr ds:,ax
770FA51A 49 dec ecx
770FA51B 46 inc esi
770FA51C 46 inc esi
770FA51D 3BF1 cmp esi,ecx
770FA51F^ 72 EC jb short 770FA50D ; oleaut32.770FA50D</font>
取第一位与假码比较
<font color="#ff0000">7710A81F 56 push esi ; /////////////////////// 真码
7710A820 57 push edi ; ////////////////////////假码
7710A821 8B7D 0C mov edi,dword ptr ss:
7710A824 8B75 08 mov esi,dword ptr ss:
7710A827 8B4D 10 mov ecx,dword ptr ss:
7710A82A 33C0 xor eax,eax
7710A82C 66:F3:A7 repe cmps word ptr es:,word ptr ds: ; //////////////比较第一位
7710A82F 74 05 je short 7710A836 ; oleaut32.7710A836
7710A831 1BC0 sbb eax,eax
7710A833 83D8 FF sbb eax,-0x1
7710A836 5F pop edi
7710A837 5E pop esi
7710A838 5D pop ebp</font>
算法分析:
第一:比较用户名是否7位 不等直接挂
第二:(用户名转ASC 且每位ASC+1后累加和) * (用户名第一位ASC) xor (用户名最后一位ASC) =SS
(SS * 注册码第三位ASC)循环/A 余数重新组合 = 字符串
CMP [字符串new = 翻转 (字符串)] 是否 = 假码
<font color="#808000">if 字符串new = 假码
well done!
else
you failed!</font>
<font color="#0000ff">例 : RoOking
3296367
GgLHYgG
2399871</font>
<font color="#ff0000" style="background-color: yellow;" size="5" face="楷体, 楷体_GB2312"><b>总结 : 注册码 = 翻转 [(用户名转ASC 且每位ASC+1后累加和) * (用户名第一位ASC) xor (用户名最后一位ASC) * 随机数) 循环/A 余数重新组合]</b></font>
CM原形:
貌似还校验了最后一位,前面看到了 后面居然找不到了 哪位大牛找到 贴出来 3Q 坐不了沙发,板凳也行,赞一个! 谢谢rooking带来简单算法分析教程。 {:soso_e154:} 这里也有一个CM :https://www.chinapyg.com/thread-75778-1-1.html 顶一个,支持技术贴~ 我等小前来学习
前排坐 呵呵,楼主以后的新星啊
页:
[1]