首页
社区
课程
招聘
[原创]CodeCharge Studio 5 破解笔记
发表于: 2021-3-14 17:10 9047

[原创]CodeCharge Studio 5 破解笔记

2021-3-14 17:10
9047

CodeCharge Studio 5 破解笔记

 

YesSoftware出品的CodeCharge Studio是一个可视化的网络应用开发工具软件,可以生成ASP(C#或VB)、PHP、Java、Perl等语言的源代码。
可以从YesSoftware的官网下载CodeCharge Studio 5.1.1.18992的20天试用版,安装启动后先显示该软件的Splash窗口:

单击“Activation”按钮,弹出以下对话框:

在对话框中填入基础信息,在“Serial Number”文本框中随便输入一些东西,然后单击“OK”按钮,就会弹出提示框,提示“Invalid Serial Number.”。
于是,我们用OllyICE载入主程序CodeChargeStudio5.exe,在MessageBoxA的入口处下断,然后让程序跑起来。出现Splash窗口后重复以上的工作,发现程序执行中断于MessageBoxA的入口处。
从MessageBoxA返回,就会来到CCProject.dll的10007ADF处。再一次返回,会回到CCProject.dll的1000A1C7处,该地址落在始于10007AF0的子程序中。再向上返回,就会去到User32的代码空间,所以我们把目光瞄向CCProject.dll开始于10007AF0的子程序。
鉴于本文的目的,同时为了节约篇幅,我们只关注关键算法和技巧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
10007AF0    ; ……
; 取上个对话框中Name、Company、Address、Zip、Country、Email、
; Serial Number的输入值
; ……
10007BF5    mov      [ebp+FlagWord], 0
10007BFC    lea      ecx, [ebp+HexSN]
10007C02    push     ecx
10007C03    lea      edx, [ebp+StrSN]
10007C09    push     edx
; 按照"%hx-%hx-%hx-%hx-%hx"的格式将序列号转换成数值
10007C0A    call     sub_1001B380
10007C0F    add      esp, 8
10007C12    movzx    eax, [ebp+HexSN]
10007C19    and      eax, 0FF00h
10007C1E    cmp      eax, 500h
10007C23    jnz      loc_100086B7    ; 序列号首节非05XX的形式则转
10007C29    movsx    ecx, byte ptr [ebp+HexSN]
10007C30    cmp      ecx, 11h
10007C33    jl       short loc_10007C45
10007C35    movsx    edx, byte ptr [ebp+HexSN]
10007C3C    cmp      edx, 1Eh
10007C3F    jle      loc_100086B7        ; 序列号首节为0511h051Eh也转
; 以下开始校验序列号
10007C45    mov      [ebp+FlagWord], 1
10007C4C    cmp      [ebp+FlagWord], 0
10007C50    jz       short loc_10007C97
10007C52    movzx    eax, [ebp+HexSN+2]
10007C59    and      eax, 1    ; 取序列号第二节D0位
10007C5C    neg      eax
10007C5E    sbb      eax, eax
10007C60    neg      eax    ; 非零则eax=1,否则eax=0
10007C62    movzx    ecx, [ebp+HexSN+4]
10007C69    and      ecx, 20h    ; 取序列号第三节D5位
10007C6C    neg      ecx
10007C6E    sbb      ecx, ecx
10007C70    neg      ecx    ; 非零则ecx=1,否则ecx=0
10007C72    movzx    edx, [ebp+HexSN]
10007C79    and      edx, 200h    ; 取序列号第一节D9位
10007C7F    neg      edx
10007C81    sbb      edx, edx
10007C83    neg      edx    ; 非零则edx=1,否则edx=0
10007C85    and      ecx, edx    ; ecx和edx相与
10007C87    cmp      eax, ecx    ; 再与eax比较
10007C89    jnz      short loc_10007C97
10007C8B    mov      [ebp+var_1610], 1
10007C95    jmp      short loc_10007CA1
 
10007C97    mov      [ebp+var_1610], 0
 
10007CA1    mov      eax, [ebp+var_1610]
10007CA7    mov      [ebp+FlagWord], eax    ;相等则标志为1,否则为0
10007CAA    cmp      [ebp+FlagWord], 0
10007CAE    jz       short loc_10007CF5    ; 标志为0则跳过下次校验
10007CB0    ;……

我把这个校验操作取名为“AndCmp”,类似的还有OrCmp和XorCmp。对序列号的校验操作共有28次,整理后如表一(“S.0.9”表示序列号第一节的D9位,依此类推)。
下面让我们继续。校验操作进行完毕,会来到100086B7处。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
100086B7    ; ……
; 取Reseller的输入值
; ……
100086D1    cmp      [ebp+FlagWord], 0
100086D5    jnz      loc_1000A207    ; 通过校验则转1000A207
100086DB    lea      edx, [ebp+StrInpSN]
100086E1    push     edx    ; char *
100086E2    call     _strlen
100086E7    add      esp, 4
100086EA    cmp      eax, 18h
; 未通过校验,且序列号不少于24字符则转1000A124
100086ED    jnb      loc_1000A124
100086F3    ; ……
; 假定序列号形如“XXXX-XXXX-XXXX-XXXX”,并对其进行校验,
; 如果第一节的高字节是03h10h的数值,且序列号通过校验,
; 则提示“序列号对CodeCharge Studio 5无效”,然后退出子程序。
; 否则直接退出。
; ……
1000A124    ; ……
; 提示“序列号无效”,退出子程序
; ……

由此可见,序列号必须符合“05XX-XXXX-XXXX-XXXX-XXXX”的形式,其中的X全部为十六进制数字,并且第一节的低字节不能是11h到1Eh的值。重要的是,序列号必须能通过校验。
从1000A207开始,先是取得对话框中Install Code、Version和Activation Key的值,把Name、Company、Address、Zip、Country、Email和Reseller的值记录到注册表里,接着对“Auto-activation though the Internet”检查框的设置情况进行检查。如被勾选,就用字符串“http://www.yessoftware.com/activation/activation.php”再加上Serial Number、Install Code、Name、Company、Zip、Country、Email、Reseller、Version和Address的值生成一个URL,创建始于1000CCC0的线程进行在线激活。如果在线激活时出错,就扫尾退出。

1
2
3
4
5
6
7
; ……
1000A704    push     eax    ; lpParameter
1000A705    push     offset sub_1000CCC0    ; lpStartAddress
1000A70A    push     0    ; dwStackSize
1000A70C    push     0    ; lpThreadAttributes
1000A70E    call     ds:CreateThread
; ……

无论是在线激活时返回的,还是非在线激活时手工输入的Activation Key,都要进行校验。激活码的校验与序列号校验类似,不过序列号的校验相当于自校验,而激活码则是用Install Code和Serial Number来校验的,看如下代码片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
; ……
1000A7FE    mov      [ebp+FlagWord], 1
1000A805    lea      eax, [ebp+HexInAK2]
1000A80B    push     eax
1000A80C    lea      ecx, [ebp+StrInAK]
1000A812    push     ecx
; Scan string with "%hx-%hx-%hx-%hx-%hx" format
1000A813    call     sub_1001B380
1000A818    add      esp, 8
1000A81B    lea      edx, [ebp+HexInSN2]
1000A821    push     edx
1000A822    lea      eax, [ebp+StrInSN]
1000A828    push     eax
; Scan string with "%hx-%hx-%hx-%hx-%hx" format
1000A829    call     sub_1001B380
1000A82E    add      esp, 8
1000A831    lea      ecx, [ebp+HexInstCode]
1000A837    push     ecx
1000A838    lea      edx, [ebp+StrInstallCode]
1000A83E    push     edx
; Scan string with "%hx-%hx-%hx-%hx-%hx" format
1000A83F    call     sub_1001B380
1000A844    add      esp, 8
1000A847    mov      [ebp+FlagWord], 1
1000A84E    cmp      [ebp+FlagWord], 0
1000A852    jz       short loc_1000A899
1000A854    movzx    eax, [ebp+HexInAK2]
1000A85B    and      eax, 2    ; 取激活码第一节D1位
1000A85E    neg      eax
1000A860    sbb      eax, eax
1000A862    neg      eax    ; 非零则eax=1,否则eax=0
1000A864    movzx    ecx, [ebp+HexInSN2+4]
1000A86B    and      ecx, 400h    ; 取序列号第三节D11位
1000A871    neg      ecx
1000A873    sbb      ecx, ecx
1000A875    neg      ecx    ; 非零则ecx=1,否则ecx=0
1000A877    movzx    edx, [ebp+HexInstCode+4]
1000A87E    and      edx, 40h    ; 取序列号第三节D6位
1000A881    neg      edx
1000A883    sbb      edx, edx
1000A885    neg      edx    ; 非零则edx=1,否则edx=0
1000A887    and      ecx, edx    ; ecx和edx相与
1000A889    cmp      eax, ecx    ; 再与eax比较
1000A88B    jnz      short loc_1000A899
1000A88D    mov      [ebp+var_1788], 1
1000A897    jmp      short loc_1000A8A3
 
1000A899    mov      [ebp+var_1788], 0
 
1000A8A3    mov      eax, [ebp+var_1788]
1000A8A9    mov      [ebp+FlagWord], eax    ;相等则标志为1,否则为0
1000A8AC    cmp      [ebp+FlagWord], 0
1000A8B0    jz       short loc_1000A8F4    ; 标志为0则跳过下次校验
; ……

我把上边的校验操作标记为AndCmp(H.3.6, S.3.11, A.0.1)。之所以用“H”来标记Install Code,是因为它在注册表里的值名称是“HardwareKey”。而“S”就表示“Serial Number”,“A”就表示“Activation Key”。
在始于10007AF0的子程序中,对激活码的校验操作共有33次,整理后见表二。
激活码校验操作进行完毕后,要判断校验是否通过,不通过时会弹出消息框提示“激活码无效”;通过时还要判断注册表里是不是已经记录有激活信息,现在的激活信息和原有的激活信息是否一致等,还要把通过校验的序列号和激活码写入注册表,这里不再一一赘述。
至此我们可以看出,只要序列号和激活码通过了校验,那么一切就都OK了。
这样,我们还需要弄清楚两个问题,一个是序列号的构成规律,另一个是序列号和激活码的其它位还有什么作用。
因为程序要读取两个注册表值,一个名称是“SerialNumber”,对应序列号;另一个名称是“ActivationKey”,对应激活码。所以,我所采取的方法就是“地毯式搜索”。用PowerGREP在CodeCharge Studio的安装目录及其子目录下对所有文件进行二进制搜索,查找包含有这两个名称字符串的二进制文件,其结果如表八。然后,用IDA Pro对找到的文件一一反汇编,阅读反汇编后的代码,查看对两个名称的引用,分析序列号和激活码的作用。
在阅读分析期间,我们还会发现有使用自解码技术的现象。用自解码代码的特征码进行二进制搜索,发现使用自解码技术的文件共有7个,分别是、CCProjectExplorer.ocx、CCPropertiesU.dll、CCSchema.dll、CCShell.dll、CCToolBox.ocx和IEScriptHelper.dll。经过仔细分析,可以编写一段程序将加密过的代码予以还原。还原后,还发现有二次加密的地方,也都一一予以还原。还原后,再对其反汇编,然后阅读、分析。
经过大量的阅读、分析,我们会得出以下几点信息:
1、 序列号必须符合“05XX-XXXX-XXXX-XXXX-XXXX”的格式,第一节的低字节不能是11h到1Eh的值,必须能通过序列号校验;
2、 序列号第一节的低字节与软件版本有关。经过分析可知,注册表中没有记录序列号和激活码,或记录的序列号和激活码为空的话,软件就是试用版(Trial)的;如果第一节的低字节是04h~09h、0Bh~10h、12h~17h或19h~1Eh那么软件就是个人版(Personal)的;如果第一节的低字节是0Ah~10h或18h~1Eh,那么软件就是教学版(Academic)的;非这些范围,可能就是全功能版(Full)的。这可以从CCProject.dll的反汇编结果中看出,尤其是始于101DFB40的子程序。
试用版、个人版和教学版在使用上是有限制的;
3、 序列号第一节的低字节还决定着创建工程时所能使用的编程语言。在Schema.dll中,可以清晰地看到这一点。序列号第一节低字节的值和编程语言的关系如表九;
4、 在CCProject.dll始于1003E650的子程序中,除了要对序列号进行与前所述相同的校验外,还要对激活码进行校验。对激活码的校验与前所述有所不同。校验操作共42次,整理后见表三;
5、 CCGenerator.dll始于10024580的子程序中,对激活码有5次校验操作。这是有关XSL样式表的,整理后见表四;
6、 CCPropertiesU.dll中,始于31249B0和3138DD0的子程序对对激活码各有3次校验操作。这是有关工程属性的“Events”和“Format”标签的,整理后见表五;
7、 CCLang.dll始于432D390的子程序对激活码有5次校验操作,整理后见表六。顺便说的是,该子程序还使用了非顺序执行的方式来干扰阅读者。同时,该子程序还将激活码的A.2.12与A.0.0、A.3.8与A.1.2以及A.4.12与A.1.13相比较;
8、 CCProject.dll始于1003E650、10064AD0、10214E60的子程序还按从低位到高位的顺序,依次用A.0.0、A.0.4、A.0.7、A.0.9、A.0.13、A.1.0、A.1.1、A.1.2、A.1.3、A.1.4、A.1.5、A.1.8、A.1.9、A.1.10、A.1.13、A.2.2组成一个16位的整数,该整数表示许可期限的天数。经过试验,该值非零,Splash窗口就会有显示。
  综上所述,我们把所有的校验规则综合起来,就成了激活码的完整校验规则(见表七)。让序列号符合“0503-XXXX-XXXX-XXXX-XXXX”的格式,且满足序列号校验规则,然后根据激活码校验规则生成激活码,就可以正确激活CodeCharge Studio 5了。

 

表一、序列号校验操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
序号  操作      源1      2      比较目标
1     AndCmp    S.0.9    S.2.5    S.1.0
2     XorCmp    S.0.2    S.4.7    S.1.1
3     AndCmp    S.4.14   S.0.12   S.1.4
4     XorCmp    S.3.9    S.4.2    S.1.5
5     OrCmp     S.3.15   S.2.13   S.1.6
6     OrCmp     S.4.6    S.4.13   S.1.9
7     XorCmp    S.0.6    S.2.3    S.1.10
8     OrCmp     S.1.12   S.3.4    S.1.11
9     XorCmp    S.2.11   S.4.12   S.1.14
10    OrCmp     S.3.10   S.0.13   S.1.15
11    OrCmp     S.1.7    S.4.15   S.2.2
12    XorCmp    S.3.0    S.0.11   S.2.6
13    AndCmp    S.2.0    S.1.2    S.2.9
14    XorCmp    S.0.3    S.0.14   S.2.10
15    AndCmp    S.4.1    S.0.10   S.2.15
16    OrCmp     S.3.13   S.0.7    S.3.3
17    AndCmp    S.4.11   S.0.2    S.3.5
18    XorCmp    S.0.3    S.0.15   S.3.6
19    XorCmp    S.4.4    S.2.14   S.3.7
20    OrCmp     S.2.8    S.0.4    S.3.8
21    OrCmp     S.2.4    S.0.8    S.3.11
22    AndCmp    S.0.5    S.4.6    S.3.12
23    AndCmp    S.1.8    S.2.1    S.3.14
24    OrCmp     S.2.7    S.0.0    S.4.0
25    OrCmp     S.4.3    S.0.15   S.4.5
26    XorCmp    S.3.1    S.1.13   S.4.8
27    AndCmp    S.1.3    S.0.6    S.4.9
28    AndCmp    S.2.12   S.0.1    S.4.10

表二、CCProject.dll始于10007AF0的子程序对激活码的校验操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
序号  操作      源1      2       比较目标
1     AndCmp    H.2.6    S.2.10    A.0.1
2     OrCmp     H.3.2    S.4.2     A.0.2
3     OrCmp     H.1.13   S.1.15    A.0.5
4     AndCmp    H.1.12   S.3.9     A.0.6
5     XorCmp    H.4.3    S.3.3     A.0.8
6     XorCmp    H.0.15   S.3.12    A.0.11
7     OrCmp     H.0.7    S.3.2     A.0.12
8     OrCmp     H.4.0    S.3.4     A.0.14
9     AndCmp    H.4.14   S.2.13    A.1.6
10    XorCmp    H.1.11   S.0.9     A.1.7
11    XorCmp    H.2.11   S.3.14    A.1.11
12    OrCmp     H.0.2    S.4.0     A.1.14
13    XorCmp    H.1.6    S.3.11    A.2.1
14    OrCmp     H.1.1    S.1.7     A.2.3
15    XorCmp    H.1.0    S.2.2     A.2.4
16    XorCmp    H.2.10   S.0.2     A.2.7
17    OrCmp     H.4.12   S.4.7     A.2.8
18    AndCmp    H.2.4    S.4.11    A.2.9
19    XorCmp    H.3.10   S.1.14    A.2.11
20    XorCmp    H.1.3    S.3.10    A.3.1
21    AndCmp    H.0.1    S.0.14    A.3.2
22    XorCmp    H.0.5    S.2.8     A.3.7
23    OrCmp     H.0.9    S.1.6     A.3.11
24    AndCmp    H.4.9    S.0.6     A.3.13
25    AndCmp    H.2.1    S.1.8     A.3.14
26    OrCmp     H.2.3    S.2.9     A.4.0
27    XorCmp    H.2.12   S.0.13    A.4.1
28    AndCmp    H.4.5    S.1.4     A.4.3
29    XorCmp    H.3.0    S.1.1     A.4.5
30    OrCmp     H.2.0    S.0.7     A.4.6
31    XorCmp    H.1.9    S.1.10    A.4.8
32    XorCmp    H.4.4    S.1.5     A.4.10
33    AndCmp    H.2.14   S.2.4     A.4.13

表三、CCProject.dll始于1003E650的子程序对激活码的校验操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
序号  操作      源1      2       比较目标
1     AndCmp    H.2.6    S.2.10    A.0.1
2     OrCmp     H.3.2    S.4.2     A.0.2
3     OrCmp     H.4.1    S.1.0     A.0.3
4     OrCmp     H.1.13   S.1.15    A.0.5
5     XorCmp    H.4.3    S.3.3     A.0.8
6     AndCmp    H.0.0    S.0.4     A.0.10
7     XorCmp    H.0.15   S.3.12    A.0.11
8     OrCmp     H.0.7    S.3.2     A.0.12
9     OrCmp     H.4.0    S.3.4     A.0.14
10    AndCmp    H.3.14   S.4.12    A.0.15
11    AndCmp    H.4.14   S.2.13    A.1.6
12    XorCmp    H.1.11   S.0.9     A.1.7
13    XorCmp    H.2.11   S.3.14    A.1.11
14    OrCmp     H.0.2    S.4.0     A.1.14
15    AndCmp    H.0.4    S.3.13    A.1.15
16    AndCmp    H.0.8    S.3.6     A.2.0
17    XorCmp    H.1.6    S.3.11    A.2.1
18    OrCmp     H.1.1    S.1.7     A.2.3
19    XorCmp    H.1.0    S.2.2     A.2.4
20    XorCmp    H.4.10   S.4.5     A.2.5
21    XorCmp    H.1.5    S.1.12    A.2.6
22    XorCmp    H.2.10   S.0.2     A.2.7
23    OrCmp     H.4.12   S.4.7     A.2.8
24    AndCmp    H.0.10   S.4.1     A.2.10
25    XorCmp    H.3.10   S.1.14    A.2.11
26    OrCmp     H.1.10   S.2.11    A.2.15
27    XorCmp    H.1.3    S.3.10    A.3.1
28    XorCmp    H.3.1    S.2.5     A.3.4
29    XorCmp    H.0.5    S.2.8     A.3.7
30    AndCmp    H.3.12   S.4.8     A.3.9
31    OrCmp     H.0.9    S.1.6     A.3.11
32    AndCmp    H.4.9    S.0.6     A.3.13
33    AndCmp    H.2.1    S.1.8     A.3.14
34    XorCmp    h.2.12   S.0.13    A.4.1
35    AndCmp    H.4.5    S.1.4     A.4.3
36    OrCmp     H.2.2    S.2.1     A.4.4
37    XorCmp    H.3.0    S.1.1     A.4.5
38    OrCmp     H.2.0    S.0.7     A.4.6
39    XorCmp    H.1.9    S.1.10    A.4.8
40    XorCmp    H.4.4    S.1.5     A.4.10
41    AndCmp    H.2.14   S.2.4     A.4.13
42    AndCmp    H.3.8    S.3.8     A.4.15

表四、CCGenerator.dll对激活码的校验操作

1
2
3
4
5
6
序号  操作      源1      2       比较目标
1     XorCmp    H.4.6    S.4.15    A.4.9
3     AndCmp    H.4.2    S.0.12    A.1.12
3     AndCmp    H.0.1    S.0.14    A.3.2
4     AndCmp    H.2.4    S.4.11    A.2.9
5     OrCmp     H.2.3    S.2.9     A.4.0

表五、CCPropertiesU.dll对激活码的校验操作

1
2
3
4
5
6
7
8
9
序号  操作      源1       2       比较目标
始于31249B0的子程序
1     AndCmp    H.1.12    S.3.9     A.0.6
2     XorCmp    H.2.10    S.0.2     A.2.7
3     AndCmp    H.3.12    S.4.8     A.3.9
始于3138DD0的子程序
1     AndCmp    H.4.2     S.0.12    A.1.12
2     XorCmp    H.2.10    S.0.2     A.2.7
3     AndCmp    H.0.1     S.0.14    A.3.2

表六、CCLang.dll对激活码的校验操作

1
2
3
4
5
6
序号  操作      源1       2       比较目标
1     XorCmp    H.4.10    S.4.5     A.2.5
2     OrCmp     H.0.9     S.1.6     A.3.11
3     AndCmp    H.2.4     S.4.11    A.2.9
4     AndCmp    H.2.1     S.1.8     A.3.14
5     AndCmp    H.3.12    S.4.8     A.3.9

表七、综合后的校验操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
序号  操作      源1      2       比较目标
1     AndCmp    H.2.6    S.2.10    A.0.1
2     OrCmp     H.3.2    S.4.2     A.0.2
3     OrCmp     H.4.1    S.1.0     A.0.3
4     OrCmp     H.1.13   S.1.15    A.0.5
5     AndCmp    H.1.12   S.3.9     A.0.6
6     XorCmp    H.4.3    S.3.3     A.0.8
7     AndCmp    H.0.0    S.0.4     A.0.10
8     XorCmp    H.0.15   S.3.12    A.0.11
9     OrCmp     H.0.7    S.3.2     A.0.12
10    OrCmp     H.4.0    S.3.4     A.0.14
11    AndCmp    H.3.14   S.4.12    A.0.15
12    AndCmp    H.4.14   S.2.13    A.1.6
13    XorCmp    H.1.11   S.0.9     A.1.7
14    XorCmp    H.2.11   S.3.14    A.1.11
15    AndCmp    H.4.2    S.0.12    A.1.12
16    OrCmp     H.0.2    S.4.0     A.1.14
17    AndCmp    H.0.4    S.3.13    A.1.15
18    AndCmp    H.0.8    S.3.6     A.2.0
19    XorCmp    H.1.6    S.3.11    A.2.1
20    OrCmp     H.1.1    S.1.7     A.2.3
21    XorCmp    H.1.0    S.2.2     A.2.4
22    XorCmp    H.4.10   S.4.5     A.2.5
23    XorCmp    H.1.5    S.1.12    A.2.6
24    XorCmp    H.2.10   S.0.2     A.2.7
25    OrCmp     H.4.12   S.4.7     A.2.8
26    AndCmp    H.2.4    S.4.11    A.2.9
27    AndCmp    H.0.10   S.4.1     A.2.10
28    XorCmp    H.3.10   S.1.14    A.2.11
29    OrCmp     H.1.10   S.2.11    A.2.15
30    XorCmp    H.1.3    S.3.10    A.3.1
31    AndCmp    H.0.1    S.0.14    A.3.2
32    XorCmp    H.3.1    S.2.5     A.3.4
33    XorCmp    H.0.5    S.2.8     A.3.7
34    AndCmp    H.3.12   S.4.8     A.3.9
35    OrCmp     H.0.9    S.1.6     A.3.11
36    AndCmp    H.4.9    S.0.6     A.3.13
37    AndCmp    H.2.1    S.1.8     A.3.14
38    OrCmp     H.2.3    S.2.9     A.4.0
39    XorCmp    H.2.12   S.0.13    A.4.1
40    AndCmp    H.4.5    S.1.4     A.4.3
41    OrCmp     H.2.2    S.2.1     A.4.4
42    XorCmp    H.3.0    S.1.1     A.4.5
43    OrCmp     H.2.0    S.0.7     A.4.6
44    XorCmp    H.1.9    S.1.10    A.4.8
45    XorCmp    H.4.6    S.4.15    A.4.9
46    XorCmp    H.4.4    S.1.5     A.4.10
47    AndCmp    H.2.14   S.2.4     A.4.13
48    AndCmp    H.3.8    S.3.8     A.4.15

表八、搜索“SerialNumber”和“ActivationKey”的出现次数

1
2
3
4
5
6
7
8
9
10
11
12
13
序号  名称                      SerialNumber    ActivationKey
1     CCGenerator.dll          6               6
2     CCHelper.dll             1               1
3     CCLang.dll               1               1
4     CCProject.dll            56              63
5     CCProjectExplorer.ocx    5               5
6     CCPropertiesU.dll        11              11
7     CCSchema.dll             43              43
8     CCToolBox.ocx            1               1
9     CCViews.dll              10              10
10    CodeChargeStudio5.exe    1               1
11    HTMLHelpers.dll          1               1
12    Logger.exe               1               1

表九、序列号第一节低字节值与编程语言

1
2
3
4
5
6
7
8
        序号    值    编程语言
1    4111825    ASP with Templates
2    5121926    PHP with Templates
3    6132027    JSP/Servlet with Templates
4    7142128    C#/C# InMotion, VB/VB InMotion
5    8152229    CFML / CFML with Templates
6    9162330    Perl with Templates
7    3101724    以上全部

附录一、自解码代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
102350F9    call     $+5
102350FE    pop      eax
102350FF    add      eax, 0Fh
 
10235102    mov      ebx, [eax]
10235104    cmp      ebx, 1900190h    ; 向下查找特征值
1023510A    jz       short loc_1023510F
1023510C    inc      eax
1023510D    jmp      short loc_10235102
 
1023510F    mov      edx, [eax+5]
10235112    mov      ebx, edx
10235114    inc      edx
10235115    mov      [eax+5], edx    ; 设置解码标志
 
10235118    cmp      ebx, 0
1023511B    jz       short loc_10235122
1023511D    jmp      loc_1023530A
 
10235122    push     ebp
10235123    mov      ebp, eax
10235125    add      ebp, 11h    ; ebp指向偏移表
 
10235128    add      eax, 9
1023512B    mov      ecx, [eax]    ; ecx=解码区长度
1023512D    add      eax, 4
 
10235130    mov      edx, [eax]    ; edx=偏移表项数
10235132    push     eax
10235133    mov      eax, edx
10235135    mov      edx, 4
1023513A    mul      edx
1023513C    mov      edx, eax
1023513E    pop      eax
1023513F    mov      ebx, edx
10235141    add      eax, 4
10235144    add      eax, edx    ; eax指向解码区开始
10235146    mov      edi, edx
10235148    add      edi, 11h    ; edi=解码区首偏移
1023514B    xor      edx, edx    ; edx为解码区字节索引
1023514D    xor      esi, esi    ; esi为偏移表字节索引
 
1023514F    cmp      edx, ecx
10235151    jz       short loc_10235186
10235153    cmp      ebx, 0
10235156    jz       short loc_10235179
10235158    cmp      esi, ebx
1023515A    jz       short loc_10235179
1023515C    push     ecx
1023515D    mov      ecx, [ebp+esi+0]    ; 取偏移表当前项
10235161    cmp      ecx, 0
10235164    jz       short loc_10235178    ; 为零则跳过4字节
10235166    sub      ecx, edi    ; 减去解码区首偏移
10235168    cmp      ecx, edx    ; 与解码区字节索引比较
1023516A    jnz      short loc_10235178    ; 相等则跳过4字节
1023516C    pop      ecx
1023516D    add      eax, 3
10235170    add      edx, 3
10235173    add      esi, 4
10235176    jmp      short loc_10235182
 
10235178    pop      ecx
 
10235179    push     ebx
1023517A    mov      bl, [eax]    ; 取一字节
1023517C    xor      bl, 0FFh    ; 与Key值异或
1023517F    mov      [eax], bl    ; 回存
10235181    pop      ebx
 
10235182    inc      eax
10235183    inc      edx
10235184    jmp      short loc_1023514F
 
10235186    pop      ebp
10235187    jz       loc_1023530A
 
1023518D    dd       1900190h    ; 特征值
10235191    db       1
10235192    dd       0    ; 解码标志
10235196    dd       1935h    ; 解码区长度
1023519A    dd       5Bh    ; 偏移表项数
; 偏移表,每一项是相对于特征值所在位置的偏移
1023519E    dd       204h, 20Fh, 242h, 24Fh, 26Ah, 277h, 2B8h
1023519E    dd       3E9h, 3F4h, 427h, 434h, 44Fh, 45Ch, 49Ah
1023519E    dd       6DCh, 808h, 934h, 0A60h, 0B8Ch, 0CB8h, 0DE4h
1023519E    dd       0DF8h, 0FE6h, 1112h, 1126h, 15A4h, 1680h, 16BDh
1023519E    dd       16E9h, 1763h, 1782h, 17B5h, 17DBh, 17F7h, 17FFh
1023519E    dd       1808h, 1811h, 18CAh, 192Dh

注:自解码代码不完全相同,但原理一样。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2021-4-3 19:43 被chywan编辑 ,原因:
收藏
免费 3
支持
分享
最新回复 (6)
雪    币: 324
活跃值: (1034)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
直接粘贴,导致表格全部被转成了文本,影响了美观
2021-3-14 17:22
0
雪    币: 21449
活跃值: (62288)
能力值: (RANK:125 )
在线值:
发帖
回帖
粉丝
3
chywan 直接粘贴,导致表格全部被转成了文本,影响了美观
格式确实有些乱看,可以用代码样式,格式化一下相关代码,就美观了。
2021-3-15 11:12
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
2021-3-15 19:59
0
雪    币: 34603
活跃值: (7135)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
像010editor、EmEditor、TC、PowerGREP中的正则都是有效的大海捞金工具。
2021-3-15 21:17
0
雪    币: 324
活跃值: (1034)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
Editor 格式确实有些乱看,可以用代码样式,格式化一下相关代码,就美观了。
怎么对齐?
2021-3-17 12:43
0
雪    币: 3051
活跃值: (1115)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
没有注册机提供吗
2022-11-7 14:55
0
游客
登录 | 注册 方可回帖
返回
//