文件批量重命名 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
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
注册算法并不复杂。
晚上再看看算法,万事开头难。
等你的算法分析:
把他搞出来了啊,猛 DaShanRen 发表于 2014-6-30 08:45
注册算法并不复杂。
不复杂是什么程度,在VB里晕了。一点头绪也没。{:mad:}
只猜出来每段注册码第一个数对应的字母
{:titter:}等会给你算法分析。 DaShanRen 发表于 2014-7-1 08:52
这部分的作用是生成大写字符表(没有采用常量模式),最终结果是:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
计算部分一看就明白了。过程还是不懂。过几天再回来分析算法。
DaShanRen 发表于 2014-6-30 08:45
注册算法并不复杂。
欠你一个回复。今天补上。
页:
[1]
2