| 
注册时间2007-2-2
阅读权限20
最后登录1970-1-1UID26814 以武会友  
 
 TA的每日心情|  | 开心 2020-11-19 11:04
 | 
|---|
 签到天数: 1 天 [LV.1]初来乍到 | 
 
| 版主已经写出算法了,我也没想再来一下,只是发现新东西,特拿出来玩玩。 
 
 注册算法中有一个根据注册码字符查找其所在的位置号的问题,版主的分析只是一笔带过。若果你要是想分析一下,进入之后,估计会令你脑袋发晕,吃不准算法啥意思。
 其实,其实,……其实这个软件的验证流程使用了C语言中的重要对象--链表,而链表这东西鲜见于注册验证流程中。下面先看看对应代码:
 
 004110A0  PUSH EBX004110A1  PUSH ESI
 004110A2  MOV ESI,DWORD PTR DS:[ECX+8]            ;  表1的地址
 表1中只有三个非0数据,这三个数据分别对应着数字、字母A-O和字母P-Z。因为数字的ASCII高位是3,A-O的高位是4,而P-Z的高位是5。链表是按高位分类的。
 这三个非0数据的设置是为了按类别搜索,缩短搜索时间,完全可以顺序搜索。
 链表的地址是动态产生的,但结构是固定不变的。
 
 004110A5  TEST ESI,ESI004110A7  JE SHORT 004110CA
 004110A9  MOV BL,BYTE PTR SS:[ESP+C]
 004110AD  XOR EDX,EDX
 004110AF  MOVSX EAX,BL
 004110B2  SHR EAX,4                               ;  结果 /16,取得高位
 004110B5  DIV DWORD PTR DS:[ECX+C]                ;  结果 mod 17
 004110B8  MOV EDX,DWORD PTR DS:[ESI+EDX*4]        ;  结果查表1得搜索链表的节点首地址
 004110BB  TEST EDX,EDX                            ;  如果首地址为0则跳过报错
 004110BD  JE SHORT 004110CA                       ;  为0跳过
 除了三个非0数据,其余预示着字符不满足条件,报错。
 
 004110BF  /CMP BYTE PTR DS:[EDX+8],BL             ;  与链表节点中的数据(字符)比较004110C2  |JE SHORT 004110E1                      ;  相等则表示找到,跳出
 004110C4  |MOV EDX,DWORD PTR DS:[EDX]             ;  否则读取下一节点的地址
 004110C6  |TEST EDX,EDX                           ; 如果值为0,则表示链表查完也没找到,报错
 004110C8  \JNZ SHORT 004110BF
 004110CA  MOV AL,BYTE PTR SS:[ESP+C]              ;  2
 004110CE  LEA ECX,DWORD PTR SS:[ESP+C]
 004110D2  PUSH 00421120
 004110D7  PUSH ECX
 004110D8  MOV BYTE PTR SS:[ESP+14],AL
 004110DC  CALL <JMP.&MSVCRT._CxxThrowException>
 004110E1  TEST EDX,EDX
 004110E3  JE SHORT 004110CA                       ; 未找到时报错
 004110E5  MOV EAX,DWORD PTR DS:[EDX+C]            ; 找到时读取链表中的数据--位置号
 004110E8  POP ESI
 004110E9  POP EBX
 004110EA  RETN 4
 
 
 表1的内容:
 
 003881C0  00 00 00 00 00 00 00 00 00 00 00 00 54 A9 38 00  ............T?.003881D0  D4 A9 38 00 C4 A9 38 00 00 00 00 00 00 00 00 00  冤8.末8.........
 &H00000000, &H00000000, &H00000000, &H0038A954, &H0038A9D4, &H0038A9C4, &H00000000, &H00000000, _
 &H00000000, &H00000000, &H00000000, &H00000000, &H00000000, &H00000000, &H00000000, &H00000000
 链表:
 
 节点地址 下一节点地址 字符类别    字符        字符位置号0038A744  &H00000000, &H00000004, &HXXXXXX4F, &H00000000 O
 0038A754  &H0038A744, &H00000004, &HXXXXXX4D, &H00000001 M
 0038A764  &H0038A754, &H00000004, &HXXXXXX42, &H00000002 B
 0038A774  &H0038A764, &H00000004, &HXXXXXX48, &H00000003 H
 0038A784  &H0038A774, &H00000004, &HXXXXXX47, &H00000004 G
 0038A794  &H00000000, &H00000005, &HXXXXXX58, &H00000005 X
 0038A7A4  &H00000000, &H00000003, &HXXXXXX32, &H00000006 2
 0038A7B4  &H0038A7A4, &H00000003, &HXXXXXX35, &H00000007 5
 0038A7C4  &H0038A794, &H00000005, &HXXXXXX56, &H00000008 V
 0038A7D4  &H0038A7B4, &H00000003, &HXXXXXX39, &H00000009 9
 0038A804  &H0038A784, &H00000004, &HXXXXXX45, &H0000000A E
 0038A814  &H0038A804, &H00000004, &HXXXXXX41, &H0000000B A
 0038A824  &H0038A7C4, &H00000005, &HXXXXXX53, &H0000000C S
 0038A834  &H0038A814, &H00000004, &HXXXXXX49, &H0000000D I
 0038A844  &H0038A824, &H00000005, &HXXXXXX55, &H0000000E U
 0038A854  &H0038A834, &H00000004, &HXXXXXX4C, &H0000000F L
 0038A864  &H0038A844, &H00000005, &HXXXXXX52, &H00000010 R
 0038A874  &H0038A7D4, &H00000003, &HXXXXXX33, &H00000011 3
 0038A884  &H0038A864, &H00000005, &HXXXXXX5A, &H00000012 Z
 0038A894  &H0038A874, &H00000003, &HXXXXXX34, &H00000013 4
 0038A8C4  &H0038A894, &H00000003, &HXXXXXX31, &H00000014 1
 0038A8D4  &H0038A884, &H00000005, &HXXXXXX59, &H00000015 Y
 0038A8E4  &H0038A8C4, &H00000003, &HXXXXXX37, &H00000016 7
 0038A8F4  &H0038A854, &H00000004, &HXXXXXX4A, &H00000017 J
 0038A904  &H0038A8F4, &H00000004, &HXXXXXX4B, &H00000018 K
 0038A914  &H0038A904, &H00000004, &HXXXXXX44, &H00000019 D
 0038A924  &H0038A8E4, &H00000003, &HXXXXXX30, &H0000001A 0
 0038A934  &H0038A914, &H00000004, &HXXXXXX43, &H0000001B C
 0038A944  &H0038A924, &H00000003, &HXXXXXX38, &H0000001C 8
 0038A954  &H0038A944, &H00000003, &HXXXXXX36, &H0000001D 6--0--9的开始查找位置
 0038A984  &H0038A8D4, &H00000005, &HXXXXXX54, &H0000001E T
 0038A994  &H0038A984, &H00000005, &HXXXXXX57, &H0000001F W
 0038A9A4  &H0038A994, &H00000005, &HXXXXXX50, &H00000020 P
 0038A9B4  &H0038A934, &H00000004, &HXXXXXX4E, &H00000021 N
 0038A9C4  &H0038A9A4, &H00000005, &HXXXXXX51, &H00000022 Q--P--Z的开始查找位置
 0038A9D4  &H0038A9B4, &H00000004, &HXXXXXX46, &H00000023 F--A--O的开始查找位置
 
 
 
 我使用了VB结构的数据展示,如何玩转链表,那就不是我的事了,你自己看着办!
 
 
 | 
 评分
查看全部评分
 |