Rooking 发表于 2015-1-1 16:26:55

新年某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原形:


Rooking 发表于 2015-1-1 16:28:18

貌似还校验了最后一位,前面看到了 后面居然找不到了 哪位大牛找到 贴出来 3Q

pentium450 发表于 2015-1-1 16:35:58

坐不了沙发,板凳也行,赞一个!

Dxer 发表于 2015-1-1 16:42:50

谢谢rooking带来简单算法分析教程。

Nisy 发表于 2015-1-1 17:22:58

{:soso_e154:} 这里也有一个CM :https://www.chinapyg.com/thread-75778-1-1.html

零下八度 发表于 2015-1-1 20:21:50

顶一个,支持技术贴~

GeekCat 发表于 2015-1-1 21:44:03

我等小前来学习
前排坐

轩轩1018 发表于 2015-1-3 20:26:48

呵呵,楼主以后的新星啊
页: [1]
查看完整版本: 新年某CM第一篇菜鸟级算法分析