mod5689 发表于 2014-6-30 00:22:35

文件批量重命名 4.20 验证流程分析

本帖最后由 mod5689 于 2014-6-30 00:47 编辑

纯代码的东西估计没几个人愿意去看,先说下大概流程


启动时:先看\user\renamefile.txt 文件是否存在,不存在标题自然是未注册,同时功能限制的全局变量赋值0.
                                                                         若文件存在,验证其保存的机器码、注册码与程序计算的两项是否都相等,不一样则未注册版,功能限制全局变量赋值0;
                                                                                                                                                                                             若一样则注册版,功能限制全局变量赋值-1
注册时:与启动时一样,先检查文件是否存在,内容是否正确。若都正确刚显示 已注册!但是功能限制的全局变量未重新赋值。
                                                                                                若不正确,让你输入注册码再进行验证。
功能限制:检查全局变量的值,-1代表已注册,0代表未注册同时开启限制。


无代码无真相



启动时验证流程:

004C63B4   .E8 87FDFFFF   call    004C6140                                                             ;判断 \文件批量重命名4.20\user\renamefile.txt 是否存在
004C63B9   .0FBFD0      movsx   edx, ax                                                                ;ax=-1 为文件存在
004C63BC   .85D2          test    edx, edx
004C63BE   .0F84 6A030000 je      004C672E                                                          ;文件不存在直接跳向004C679A   push00491E20   ; / 未注册版

004C6411   .8B4D D4       mov   ecx, dword ptr ss:                                  ;读取文件的内容 (UNICODE "123          1111-1111-1111-1111")

004C64F6   .8BD0          mov   edx, eax                                                               ;读取机器码eax:(UNICODE "123")
004C65E4   .8BD0          mov   edx, eax                                                               ;程序自己计算的机器码eax=001922DC, (UNICODE "0--0-")
004C65F0   .FF15 F4104000 call    near dword ptr ds:[<&MSVBVM60.__>                ;比较读取和程序自己计算的 机器码是否一样


004C65FF   .8B4D D8       mov   ecx, dword ptr ss:                                 ;读取的注册码:(UNICODE "1111-1111-1111-1111")
004C6602   .51            push    ecx
004C6603   .E8 98020000   call    004C68A0
004C6608   .8BD0          mov   edx, eax                                                               ;程序计算的注册码 eax=00191A3C, (UNICODE "0000-0000-0000-0000")
004C660A   .8D4D BC       lea   ecx, dword ptr ss:
004C660D   .FF15 BC124000 call    near dword ptr ds:[<&MSVBVM60.__>               ;MSVBVM60.__vbaStrMove
004C6613   .50            push    eax
004C6614   .FF15 F4104000 call    near dword ptr ds:[<&MSVBVM60.__>                ;比对 读取和计算的注册码


004C6621   .66:23F0       and   si, ax                                                                      ;si 为机器码比对结果, ax为注册码比对结果
004C6624   .66:8975 80    mov   word ptr ss:, si                                    ;si:最终校验结果
004C6628   .8D55 BC       lea   edx, dword ptr ss:
004C662B   .52            push    edx
004C662C   .8D45 C0       lea   eax, dword ptr ss:
004C662F   .50            push    eax
004C6630   .6A 02         push    2
004C6632   .FF15 50124000 call    near dword ptr ds:[<&MSVBVM60.__>               ;MSVBVM60.__vbaFreeStrList
004C6638   .83C4 0C       add   esp, 0C
004C663B   .0FBF4D 80   movsx   ecx, word ptr ss:                                 ;最终校验结果
004C663F   .85C9          test    ecx, ecx
004C6641   . /0F84 E2000000 je      004C6729                                                         ;启动时验证机器码、注册码 确定是不是注册版
004C6647   .C745 FC 0C000>mov   dword ptr ss:, 0C
004C664E   .66:C745 D0 FF>mov   word ptr ss:, 0FFFF                           ;是注册版的话就赋值-1, 功能限制 全局变量
004C6654   .C745 FC 0D000>mov   dword ptr ss:, 0D
004C665B   . |833D 7C405200>cmp   dword ptr ds:, 0
004C6662   . |75 1C         jnz   short 004C6680
004C6664   . |68 7C405200   push    0052407C
004C6669   . |68 08C84800   push    0048C808
004C666E   . |FF15 2C124000 call    near dword ptr ds:[<&MSVBVM60.__>               ;MSVBVM60.__vbaNew2
004C6674   . |C785 40FFFFFF>mov   dword ptr ss:, 0052407C
004C667E   . |EB 0A         jmp   short 004C668A
004C6680   > |C785 40FFFFFF>mov   dword ptr ss:, 0052407C
004C668A   > |8B95 40FFFFFF mov   edx, dword ptr ss:
004C6690   . |8B02          mov   eax, dword ptr ds:
004C6692   . |8945 80       mov   dword ptr ss:, eax
004C6695   . |68 FC144900   push    004914FC                                                         ;文件批量重命名
004C669A   . |8B0D 14405200 mov   ecx, dword ptr ds:
004C66A0   . |51            push    ecx                                                                           ; /String => "4"
004C66A1   . |FF15 60104000 call    near dword ptr ds:[<&MSVBVM60.__>               ; \__vbaStrCat
004C66A7   . |8BD0          mov   edx, eax
004C66A9   . |8D4D C0       lea   ecx, dword ptr ss:
004C66AC   . |FF15 BC124000 call    near dword ptr ds:[<&MSVBVM60.__>               ;MSVBVM60.__vbaStrMove
004C66B2   . |50            push    eax
004C66B3   . |68 10154900   push    00491510                                                         ; /注册版
004C66B8   . |FF15 60104000 call    near dword ptr ds:[<&MSVBVM60.__>               ; \__vbaStrCat
004C66BE   . |8BD0          mov   edx, eax

004C6724   . /E9 E2000000   jmp   004C680B

004C6735   .66:C745 D0 00>mov   word ptr ss:, 0                                 ; 如果renamefile.txt不存在,就跳到这里了

004C679A   .68 201E4900   push    00491E20                                                      ; / 未注册版

004C687D      66:8B45 D0    mov   ax, word ptr ss:                                  ; 功能限制 全局变量

004C6891   .C3            retn                                                                                    ;返回到 004F3483


004F347E   .E8 BD2DFDFF   call    004C6240                                                         ; 这个call 就是上述 过程
004F3483   .66:A3 1040520>mov   word ptr ds:, ax                            ;功能限制 全局变量





注册时的验证流程:

004D07B0   .E8 FB69FFFF   call    004C71B0                                                             ;计算 机器码
004D07B5   .8BD0          mov   edx, eax                                                               ;机器码 eax=03CB4D8C, (UNICODE "0--0-")

004D083B   .68 683B4900   push    00493B68                                                         ;未注册   默认是未注册


004D0893   .E8 A858FFFF   call    004C6140                                                             ;查看 renamefile.txt 是否存在
004D0898   .0FBFC0      movsx   eax, ax                                                                ;ax -1 存在    0 不存在
004D089B   .85C0          test    eax, eax
004D089D   .0F84 71040000 je      004D0D14                                                      ;不存在则跳向 未注册 并且让你输入注册码。若存在则读取注册码


004D09E0   .E8 BB5EFFFF   call    004C68A0                                                             ;计算注册码
004D09E5   .8945 B4       mov   dword ptr ss:, eax
004D09E8   .C745 AC 08800>mov   dword ptr ss:, 8008
004D09EF   .8D4D BC       lea   ecx, dword ptr ss:
004D09F2   .51            push    ecx                                                                            ; /var18
004D09F3   .8D55 AC       lea   edx, dword ptr ss:   
004D09F6   .52            push    edx                                                                            ; |var28
004D09F7   .FF15 44114000 call    near dword ptr ds:[<&MSVBVM60.__>                ; \__vbaVarTstEq
004D09FD   .66:8945 80    mov   word ptr ss:, ax                                     ;注册窗口 注册码比对
004D0A01   .8D45 AC       lea   eax, dword ptr ss:
004D0A04   .50            push    eax
004D0A05   .8D4D BC       lea   ecx, dword ptr ss:
004D0A08   .51            push    ecx
004D0A09   .6A 02         push    2
004D0A0B   .FF15 3C104000 call    near dword ptr ds:[<&MSVBVM60.__>               ;MSVBVM60.__vbaFreeVarList
004D0A11   .83C4 0C       add   esp, 0C
004D0A14   .0FBF55 80   movsx   edx, word ptr ss:
004D0A18   .85D2          test    edx, edx
004D0A1A   .0F84 F4020000 je      004D0D14                                                         ;读取的注册码不正确就跳向 让你输入注册码
004D0A20   .C745 FC 0C000>mov   dword ptr ss:, 0C
004D0A27   .8B45 08       mov   eax, dword ptr ss:
004D0A2A   .8B08          mov   ecx, dword ptr ds:
004D0A2C   .8B55 08       mov   edx, dword ptr ss:
004D0A2F   .52            push    edx
004D0A30   .FF91 4C030000 call    near dword ptr ds:
004D0A36   .50            push    eax
004D0A37   .8D45 CC       lea   eax, dword ptr ss:
004D0A3A   .50            push    eax
004D0A3B   .FF15 BC104000 call    near dword ptr ds:[<&MSVBVM60.__>               ;MSVBVM60.__vbaObjSet
004D0A41   .8945 84       mov   dword ptr ss:, eax
004D0A44   .68 843B4900   push    00493B84                                                         ;已注册!


                        若renamefile.txt 不存在或者保存的注册不正确则会让你重新输入注册


004D0034   .E8 6768FFFF   call    004C68A0                                                             ;计算注册码
004D0039   .8945 88       mov   dword ptr ss:, eax
004D003C   .C745 80 08800>mov   dword ptr ss:, 8008
004D0043   .8D4D 90       lea   ecx, dword ptr ss:
004D0046   .51            push    ecx                                                                           ; /var18
004D0047   .8D55 80       lea   edx, dword ptr ss:                                     ; |
004D004A   .52            push    edx                                                                           ; |var28
004D004B   .FF15 44114000 call    near dword ptr ds:[<&MSVBVM60.__>               ; \__vbaVarTstEq比对你输入的和计算的注册
004D0051   .66:8985 1CFFF>mov   word ptr ss:, ax
004D0058   .8D45 80       lea   eax, dword ptr ss:
004D005B   .50            push    eax
004D005C   .8D4D 90       lea   ecx, dword ptr ss:
004D005F   .51            push    ecx
004D0060   .8D55 A0       lea   edx, dword ptr ss:
004D0063   .52            push    edx
004D0064   .6A 03         push    3
004D0066   .FF15 3C104000 call    near dword ptr ds:[<&MSVBVM60.__>                ;MSVBVM60.__vbaFreeVarList
004D006C   .83C4 10       add   esp, 10
004D006F   .0FBF85 1CFFFF>movsx   eax, word ptr ss:
004D0076   .85C0          test    eax, eax
004D0078      0F84 F2030000 je      004D0470                                                          ;输入的注册码不正确就跳注册码错误提示,若正确则将机器码、注册码保存到 renamefile.txt

004D036A   .68 7C3A4900   push    00493A7C                                                         ;文件批量重命名 注册版   (注册码正确标题也会改)





功能限制验证:

004EC95A   .0FBF05 104052>movsx   eax, word ptr ds:                           ;启动时赋值的全局变量 -1 注册,0 未注册
004EC961   .85C0          test    eax, eax
004EC963   .0F85 C3000000 jnz   004ECA2C
004EC969   .837D D4 03    cmp   dword ptr ss:, 3                                 ;如果是未注册,就判断是不是第三个文件
004EC96D   .0F8E B9000000 jle   004ECA2C
004EC973   .C745 FC 28000>mov   dword ptr ss:, 28
004EC97A   .C785 2CFFFFFF>mov   dword ptr ss:, 80020004
004EC984   .C785 24FFFFFF>mov   dword ptr ss:, 0A
004EC98E   .C785 3CFFFFFF>mov   dword ptr ss:, 80020004
004EC998   .C785 34FFFFFF>mov   dword ptr ss:, 0A
004EC9A2   .C785 4CFFFFFF>mov   dword ptr ss:, 80020004
004EC9AC   .C785 44FFFFFF>mov   dword ptr ss:, 0A
004EC9B6   .C785 ECFEFFFF>mov   dword ptr ss:, 00494BB0                ;未注册用户最多只有操作3个文件!

我的修改方法是:修改几行代码,让注册时把机器码和真码保存到renamefile.txt

DaShanRen 发表于 2014-7-1 08:52:59


004C6A4CXOR EDI,EDI                           ;i=0
004C6A4EMOV EAX,19
004C6A53CMP DI,AX                               ;i<=25
004C6A56JG 文件批量.004C6AF3
004C6A5CPUSH 文件批量.00491E48                      ;"A"
004C6A61CALL NEAR DWORD PTR DS:[<&MSVBVM60.#516>;取ASC码
004C6A67ADD AX,DI                               ;"A"+i
004C6A6ALEA ECX,DWORD PTR SS:
004C6A70JO 文件批量.004C71A3
004C6A76MOVSX EAX,AX
004C6A79PUSH EAX
004C6A7APUSH ECX
004C6A7BCALL NEAR DWORD PTR DS:[<&MSVBVM60.#608>;转化为字符
004C6A81MOV DX,DI
004C6A84ADD DX,1
004C6A88JO 文件批量.004C71A3
004C6A8EMOVSX EBX,DX
004C6A91DEC EBX
004C6A92CMP EBX,1A
004C6A95JB SHORT 文件批量.004C6A9D
004C6A97CALL NEAR DWORD PTR DS:[<&MSVBVM60.__vb>;MSVBVM60.__vbaGenerateBoundsError
004C6A9DLEA EAX,DWORD PTR SS:
004C6AA3PUSH EAX
004C6AA4CALL NEAR DWORD PTR DS:[<&MSVBVM60.__vb>;MSVBVM60.__vbaStrVarMove
004C6AAAMOV EDX,EAX
004C6AACLEA ECX,DWORD PTR SS:
004C6AB2CALL NEAR DWORD PTR DS:[<&MSVBVM60.__vb>;MSVBVM60.__vbaStrMove
004C6AB8MOV ECX,DWORD PTR SS:
004C6ABBMOV EDX,EAX
004C6ABDLEA ECX,DWORD PTR DS:
004C6AC0CALL NEAR DWORD PTR DS:[<&MSVBVM60.__vb>;存入字符表
004C6AC6LEA ECX,DWORD PTR SS:
004C6ACCCALL NEAR DWORD PTR DS:[<&MSVBVM60.__vb>;MSVBVM60.__vbaFreeStr
004C6AD2LEA ECX,DWORD PTR SS:
004C6AD8CALL NEAR DWORD PTR DS:[<&MSVBVM60.__vb>;MSVBVM60.__vbaFreeVar
004C6ADEMOV EAX,1
004C6AE3ADD AX,DI                               ;i++
004C6AE6JO 文件批量.004C71A3
004C6AECMOV EDI,EAX
004C6AEEJMP 文件批量.004C6A4E


这部分的作用是生成大写字符表(没有采用常量模式),最终结果是:
ABCDEFGHIJKLMNOPQRSTUVWXYZ

计算注册码:

004C6AF3MOV EBX,1                               ;j=1--外循环
004C6AF8MOV EAX,4
004C6AFDMOV DWORD PTR SS:,EBX
004C6B00CMP BX,AX                               ;j<=4?--机器码一共四段,分段计算
004C6B03MOV EDI,1                               ;i=1--内循环
004C6B08JG 文件批量.004C6E81
004C6B0EMOV DWORD PTR SS:,EDI
004C6B11MOV EAX,4
004C6B16CMP DI,AX                               ;i<=4?--注册码共四段,每段4位
004C6B19JG 文件批量.004C6E6C
……
省略浮云代码段
……
004C6BC3CALL NEAR DWORD PTR DS:[<&MSVBVM60.#632>;读取机器码一位--分段进行
……
省略浮云代码段
……
004C6C58CALL NEAR DWORD PTR DS:[<&MSVBVM60.#581>;转化为整数--按十进制模式
004C6C5EFSTP QWORD PTR SS:             ;结果
……
省略浮云代码段
……
004C6C72FILD DWORD PTR SS:             ;i
004C6C78FSTP QWORD PTR SS:
004C6C7EFLD QWORD PTR SS:
004C6C84FMUL QWORD PTR SS:             ;转化值*i
004C6C8AFSTSW AX
004C6C8CTEST AL,0D
004C6C8EJNZ 文件批量.004C719E
004C6C94CALL NEAR DWORD PTR DS:[<&MSVBVM60.__vb>;结果取整
004C6C9AMOV EDX,DWORD PTR SS:
004C6CA0LEA ECX,DWORD PTR DS:
004C6CA3CMP ESI,4
004C6CA6MOV WORD PTR DS:,AX          ;保存结果
……
省略浮云代码段
……
004C6CDCCMP WORD PTR DS:,1         ;结果与1比较
004C6CE1LEA ECX,DWORD PTR DS:
004C6CE4SETL DL                                 ;若小于1则设置为1
004C6CE7XOR EBX,EBX
004C6CE9CMP WORD PTR DS:,1A          ;结果与26比较
004C6CEELEA ECX,DWORD PTR DS:
004C6CF1SETG BL                                 ;若大于则设置为1
004C6CF4OR EDX,EBX                              ;判断值求 OR
004C6CF6NEG EDX
004C6CF8SBB EDX,EDX
004C6CFAXOR EBX,EBX
004C6CFCNEG EDX
004C6CFECMP WORD PTR DS:,0F          ;结果与15比较
004C6D03SETE BL                                 ;相等则设置为1
004C6D06OR EDX,EBX                              ;判断值求 OR
004C6D08JNZ SHORT 文件批量.004C6D6C             ;上述判断只要一个为真,则转入处理模式2
004C6D0ACMP ESI,4                               ;处理模式1
……
省略浮云代码段
……
004C6D29MOVSX EBX,WORD PTR DS:       ;计算结果
004C6D2DDEC EBX                                 ;计算索引值--字符表的索引
004C6D2ECMP EBX,1A                              ;实际是判断结果是否大于26,到这里已无必要了
004C6D31JB SHORT 文件批量.004C6D39
……
省略浮云代码段
……
004C6D61CALL NEAR DWORD PTR DS:[<&MSVBVM60.__vb>;从字符表中读取一位做注册码--查表
004C6D67JMP 文件批量.004C6E4E
004C6D6CMOV EBX,DWORD PTR DS:[<&MSVBVM60.__vbaG>;处理模式2
……
省略浮云代码段
……
004C6DC9CALL NEAR DWORD PTR DS:[<&MSVBVM60.#660>;计算结果转化为数字
004C6DCFLEA EDX,DWORD PTR SS:
004C6DD5PUSH 1
004C6DD7LEA EAX,DWORD PTR SS:
004C6DDDPUSH EDX
004C6DDEPUSH EAX
004C6DDFCALL NEAR DWORD PTR DS:[<&MSVBVM60.#619>;取结果的末尾做注册码对应位
……
省略浮云代码段
……
004C6E64MOV DWORD PTR SS:,EDI         ;i++
004C6E67JMP 文件批量.004C6B11                   ;内循环
004C6E6CMOV EAX,1
004C6E71ADD AX,BX
004C6E74JO 文件批量.004C71A3
004C6E7AMOV EBX,EAX                           ;j++
004C6E7CJMP 文件批量.004C6AF8                   ;外循环


机器码分为四段,每段长度1-4位不等,均用“-”分隔,且为十进制数字。
对每一段,依次读取一位转化为整数(非ASC码),并乘以对应的位置号(1-4)。
很显然,结果介于0-36,当结果为0、15、>26时,直接取末位做注册码对应位。
如果介于1-14、16-26,则从字符表中读取对应位做注册码对应位。至于计算结果-1,是索引调整问题。
很显然,注册码中含0不含O。

如机器码为:1326-6360-1288-5849时,注册码计算过程为:
字符表编号:
12345678910 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
ABCDEFGHIJKLMNOPQRSTUVWXYZ
1326--1*1=1,3*2=6,2*3=6,6*4=24,对应注册码为:AFFX
6360--6*1=6,3*2=6,6*3=18,0*4=0,对应注册码为:FFR0
1288--1*1=1,2*2=4,8*3=24,8*4=32,对应注册码为:ADX2
5849--5*1=5,8*2=16,4*3=12,9*4=36,对应注册码为:EPL6

所以注册码为:AFFX-FFR0-ADX2-EPL6

DaShanRen 发表于 2014-6-30 08:45:54

注册算法并不复杂。

mod5689 发表于 2014-6-30 08:57:56

DaShanRen 发表于 2014-6-30 08:45
注册算法并不复杂。

晚上再看看算法,万事开头难。

DaShanRen 发表于 2014-6-30 09:33:49

等你的算法分析:

醉月清风 发表于 2014-6-30 15:20:21

把他搞出来了啊,猛

mod5689 发表于 2014-6-30 23:50:11

DaShanRen 发表于 2014-6-30 08:45
注册算法并不复杂。

不复杂是什么程度,在VB里晕了。一点头绪也没。{:mad:}
只猜出来每段注册码第一个数对应的字母

DaShanRen 发表于 2014-7-1 07:34:58

{:titter:}等会给你算法分析。

mod5689 发表于 2014-7-1 09:22:59

DaShanRen 发表于 2014-7-1 08:52
这部分的作用是生成大写字符表(没有采用常量模式),最终结果是:
ABCDEFGHIJKLMNOPQRSTUVWXYZ



计算部分一看就明白了。过程还是不懂。过几天再回来分析算法。

mod5689 发表于 2016-5-24 02:11:11

DaShanRen 发表于 2014-6-30 08:45
注册算法并不复杂。


欠你一个回复。今天补上。

页: [1] 2
查看完整版本: 文件批量重命名 4.20 验证流程分析