首页
社区
课程
招聘
[原创]Allok Video Splitter 分析附注册机
发表于: 2013-6-11 04:09 8291

[原创]Allok Video Splitter 分析附注册机

2013-6-11 04:09
8291

【文章标题】Allok Video Splitter 分析
【联系作者】zhong_sf@sina.com
【软件名称】Allok Video Splitter
【附件下载】http://www.onlinedown.net/soft/46878.htm
【注册机源码下载】 keygen to allok video splitter.rar

记得之前有分析过Ultra Video Joiner 这款软件 ,Allok Video Splitter与它长得很相似,不知道不是出自同一作者, 前者是用于视频合成 ,后者用于视频分割. 注册算法都是基于大整数的RSA算法的变形, 但二者还是有差异. 由于之前不懂RSA为何物, 不会脱壳 ,所以之前的分析基本都是在还原大数运算库的算法 ,还没有脱壳 ,这些天碰巧了解到了RSA算法 ....好吧, 不多说了 ,开始吧!

1.还是先脱壳吧,带壳分析总感觉很别扭,加的是MoleBox壳,

1.1.找OEP: 直接esp定律就到了.不多说了.

1.2.IAT修复: MoleBox壳除了绑定了部分dll文件外(这里只绑定了aveData.dll一个),似乎没有对IAT进行加密,至少在这软件中没有. 现在要做得就是提取绑定的dll,  用一种比较通用的方法吧,

1.2.1.  bp GetSystemTimeAsFileTime ,中断2数次返回到用户代码 ,如下

00491181   .  50             push eax                               ; /pFileTime
00491182   .  FF15 C0174A00  call dword ptr ds:[0x4A17C0]           ; \GetSystemTimeAsFileTime
00491188   .  8B45 C4        mov eax,dword ptr ss:[ebp-0x3C]        ;  这里eax就是dll的pe文件头指针
0049118B   >  8B4D F0        mov ecx,dword ptr ss:[ebp-0x10]
0049118E   .  64:890D 000000>mov dword ptr fs:[0],ecx
00491195   .  5F             pop edi
00491196   .  5E             pop esi
00491197   .  5B             pop ebx
00491198   .  C9             leave
00491199   .  C2 0800        retn 0x8

在数据窗口中查看并复制pe头,0x400字节就够了 ,保存备用,

1.2.2.接着 bp CreateFileA 中断数次直到堆栈窗口出现捆绑的dll文件名 ,如下:

0018F7F8   741CC4A4  /CALL 到 CreateFileA 来自 AcLayers.741CC4A1
0018F7FC   003094C8  |FileName = "C:\USERS\ZHONG_SF\APPDATA\LOCAL\TEMP\MBX@940@2F1C38.###"
0018F800   40000000  |Access = GENERIC_WRITE
0018F804   00000000  |ShareMode = 0
0018F808   00000000  |pSecurity = NULL
0018F80C   00000002  |Mode = CREATE_ALWAYS
0018F810   00000000  |Attributes = 0
0018F814   00000000  \hTemplateFile = NULL
0018F818   00000000

在数据窗口中查看文件名,并将其改个名字 ,接着 bp GetModuleHandleA ,中断一次即可,此时打开Lordpe 将被捆绑的dll  dump下来,

1.2.3.修复dll ,将之前转存的pe头数据在16进制编辑器覆盖上一步dump的dll的pe头 ,并将ImageBase字段改为当前基址,以防重定位失败.

至此 ,脱壳就算是完成了.这种方法是参照CCDebuger总结出来的 ,最关键的就是dump的时间点,在非正确的时间dump出来的dll是数据不正确. 如果没有跟踪过外壳代码是很难知道为什么得在这两处dump才行,至少我就是(跟踪过,跟晕了),我之前有试过在很多地方dump,但都不可行,我一直觉得在外壳填写对应的IAT时dump,此时的数据应该是正确的,但就是不行,我就无语了 ,后来才发现如上述的CCDebuger的方法.

2.注册分析:

有很多种方法可以定位到程序注册加密的代码处,就不详细说了,直接来到下面的代码处:

10001B20 >  6A FF               push -0x1
10001B22    68 8AAF0010         push aveData.1000AF8A
10001B27    64:A1 00000000      mov eax,dword ptr fs:[0]
10001B2D    50                  push eax
10001B2E    64:8925 00000000    mov dword ptr fs:[0],esp
10001B35    81EC B8020000       sub esp,0x2B8
10001B3B    6A 00               push 0x0
10001B3D    8D4C24 04           lea ecx,dword ptr ss:[esp+0x4]             ; --------
10001B41    C74424 5C 716A6EAE  mov dword ptr ss:[esp+0x5C],0xAE6E6A71
10001B49    C74424 60 98C87CE3  mov dword ptr ss:[esp+0x60],0xE37CC898
10001B51    C74424 64 5CC46F44  mov dword ptr ss:[esp+0x64],0x446FC45C
10001B59    C74424 68 E64B6F64  mov dword ptr ss:[esp+0x68],0x646F4BE6
10001B61    C74424 6C 61CE7550  mov dword ptr ss:[esp+0x6C],0x5075CE61
10001B69    C74424 70 4DB38FB5  mov dword ptr ss:[esp+0x70],0xB58FB34D     ; 这些常数就是RSA算法的 p ,q ,d
10001B71    C74424 74 AFBABA53  mov dword ptr ss:[esp+0x74],0x53BABAAF     ; 每个都是大整数
10001B79    C74424 78 78E74BE6  mov dword ptr ss:[esp+0x78],0xE64BE778
10001B81    C74424 7C D14222E7  mov dword ptr ss:[esp+0x7C],0xE72242D1
10001B89    C78424 80000000 ED1>mov dword ptr ss:[esp+0x80],0x5BF1EED
10001B94    C78424 84000000 0A9>mov dword ptr ss:[esp+0x84],0xC13A930A
10001B9F    C78424 88000000 1B0>mov dword ptr ss:[esp+0x88],0xE1F6051B
10001BAA    C78424 8C000000 5BA>mov dword ptr ss:[esp+0x8C],0x4E63A75B
10001BB5    C78424 90000000 C6D>mov dword ptr ss:[esp+0x90],0x841FD5C6
10001BC0    C78424 94000000 912>mov dword ptr ss:[esp+0x94],0xC0742A91
10001BCB    C78424 98000000 9BC>mov dword ptr ss:[esp+0x98],0x5A59C59B     ; --------
10001BD6    E8 E5120000         call aveData.10002EC0                      ; 类构造函数
10001BDB    6A 00               push 0x0
10001BDD    8D4C24 0C           lea ecx,dword ptr ss:[esp+0xC]
10001BE1    C78424 C4020000 000>mov dword ptr ss:[esp+0x2C4],0x0
10001BEC    E8 CF120000         call aveData.10002EC0
10001BF1    8B8424 C8020000     mov eax,dword ptr ss:[esp+0x2C8]
10001BF8    8D9424 B8000000     lea edx,dword ptr ss:[esp+0xB8]
10001BFF    C68424 C0020000 01  mov byte ptr ss:[esp+0x2C0],0x1            ; ----
10001C07    2BD0                sub edx,eax
10001C09    8A08                mov cl,byte ptr ds:[eax]
10001C0B    880C02              mov byte ptr ds:[edx+eax],cl               ; szUserName转存
10001C0E    40                  inc eax
10001C0F    84C9                test cl,cl
10001C11  ^ 75 F6               jnz XaveData.10001C09                      ; ----
10001C13    53                  push ebx
10001C14    55                  push ebp
10001C15    56                  push esi
10001C16    57                  push edi                                   ; -----
10001C17    8DBC24 C8000000     lea edi,dword ptr ss:[esp+0xC8]
10001C1E    83C9 FF             or ecx,0xFFFFFFFF
10001C21    33C0                xor eax,eax
10001C23    33D2                xor edx,edx
10001C25    F2:AE               repne scas byte ptr es:[edi]
10001C27    F7D1                not ecx
10001C29    49                  dec ecx
10001C2A    74 28               je XaveData.10001C54
10001C2C    80BC14 C8000000 27  cmp byte ptr ss:[esp+edx+0xC8],0x27        ; 将szUserName中的空格换成 ' ,如果有的话
10001C34    75 08               jnz XaveData.10001C3E
10001C36    C68414 C8000000 20  mov byte ptr ss:[esp+edx+0xC8],0x20
10001C3E    8DBC24 C8000000     lea edi,dword ptr ss:[esp+0xC8]
10001C45    83C9 FF             or ecx,0xFFFFFFFF
10001C48    33C0                xor eax,eax
10001C4A    42                  inc edx
10001C4B    F2:AE               repne scas byte ptr es:[edi]
10001C4D    F7D1                not ecx
10001C4F    49                  dec ecx
10001C50    3BD1                cmp edx,ecx
10001C52  ^ 72 D8               jb XaveData.10001C2C                       ; ------
10001C54    6A 00               push 0x0
10001C56    8D4C24 2C           lea ecx,dword ptr ss:[esp+0x2C]
10001C5A    E8 61120000         call aveData.10002EC0
10001C5F    6A 00               push 0x0
10001C61    8D4C24 34           lea ecx,dword ptr ss:[esp+0x34]
10001C65    C68424 D4020000 02  mov byte ptr ss:[esp+0x2D4],0x2
10001C6D    E8 4E120000         call aveData.10002EC0
10001C72    6A 00               push 0x0
10001C74    8D4C24 3C           lea ecx,dword ptr ss:[esp+0x3C]
10001C78    C68424 D4020000 03  mov byte ptr ss:[esp+0x2D4],0x3
10001C80    E8 3B120000         call aveData.10002EC0
10001C85    6A 00               push 0x0
10001C87    8D4C24 44           lea ecx,dword ptr ss:[esp+0x44]
10001C8B    C68424 D4020000 04  mov byte ptr ss:[esp+0x2D4],0x4
10001C93    E8 28120000         call aveData.10002EC0
10001C98    8D4424 68           lea eax,dword ptr ss:[esp+0x68]
10001C9C    B3 05               mov bl,0x5
10001C9E    6A 04               push 0x4
10001CA0    50                  push eax
10001CA1    8D4C24 40           lea ecx,dword ptr ss:[esp+0x40]
10001CA5    889C24 D8020000     mov byte ptr ss:[esp+0x2D8],bl
10001CAC    E8 DF100000         call aveData.10002D90                      ; 类输入函数 ,这里初化p
10001CB1    8D4C24 78           lea ecx,dword ptr ss:[esp+0x78]
10001CB5    6A 04               push 0x4
10001CB7    51                  push ecx
10001CB8    8D4C24 48           lea ecx,dword ptr ss:[esp+0x48]
10001CBC    E8 CF100000         call aveData.10002D90                      ; 类输入函数 ,这里初化q
10001CC1    68 01000100         push 0x10001
10001CC6    8D4C24 24           lea ecx,dword ptr ss:[esp+0x24]
10001CCA    E8 F1110000         call aveData.10002EC0                      ; 类构造函数,这里初始化 e=0x10001
10001CCF    8D5424 20           lea edx,dword ptr ss:[esp+0x20]
10001CD3    8D4C24 30           lea ecx,dword ptr ss:[esp+0x30]
10001CD7    52                  push edx
10001CD8    C68424 D4020000 06  mov byte ptr ss:[esp+0x2D4],0x6
10001CE0    E8 3B120000         call aveData.10002F20                      ; Lgint copy
10001CE5    8D4C24 20           lea ecx,dword ptr ss:[esp+0x20]
10001CE9    889C24 D0020000     mov byte ptr ss:[esp+0x2D0],bl
10001CF0    E8 7B120000         call aveData.10002F70                      ; 类析造函数
10001CF5    8D8424 88000000     lea eax,dword ptr ss:[esp+0x88]
10001CFC    6A 08               push 0x8
10001CFE    50                  push eax
10001CFF    8D4C24 30           lea ecx,dword ptr ss:[esp+0x30]
10001D03    E8 88100000         call aveData.10002D90                      ; 类输入函数 ,这里初始化 n
10001D08    B9 08000000         mov ecx,0x8
10001D0D    33C0                xor eax,eax                                ; ---------
10001D0F    8DBC24 A8000000     lea edi,dword ptr ss:[esp+0xA8]
10001D16    33D2                xor edx,edx
10001D18    F3:AB               rep stos dword ptr es:[edi]
10001D1A    8DBC24 C8000000     lea edi,dword ptr ss:[esp+0xC8]
10001D21    83C9 FF             or ecx,0xFFFFFFFF
10001D24    F2:AE               repne scas byte ptr es:[edi]
10001D26    F7D1                not ecx
10001D28    49                  dec ecx
10001D29    74 24               je XaveData.10001D4F
10001D2B    8A8C14 C8000000     mov cl,byte ptr ss:[esp+edx+0xC8]
10001D32    8DBC24 C8000000     lea edi,dword ptr ss:[esp+0xC8]
10001D39    888C14 A8000000     mov byte ptr ss:[esp+edx+0xA8],cl
10001D40    83C9 FF             or ecx,0xFFFFFFFF
10001D43    33C0                xor eax,eax                                ; 这里将输入的 szUserName
10001D45    42                  inc edx                                    ; 格式化以作为大整数输入
10001D46    F2:AE               repne scas byte ptr es:[edi]
10001D48    F7D1                not ecx                                    ; 具体是将每4个字节通过移位使其逆序,
10001D4A    49                  dec ecx                                    ; 各个4字节的顺序不变
10001D4B    3BD1                cmp edx,ecx
10001D4D  ^ 72 DC               jb XaveData.10001D2B
10001D4F    B9 08000000         mov ecx,0x8
10001D54    33C0                xor eax,eax
10001D56    8D7C24 48           lea edi,dword ptr ss:[esp+0x48]
10001D5A    F3:AB               rep stos dword ptr es:[edi]
10001D5C    33D2                xor edx,edx
10001D5E    33C9                xor ecx,ecx
10001D60    8A9404 A8000000     mov dl,byte ptr ss:[esp+eax+0xA8]
10001D67    8A8C04 A9000000     mov cl,byte ptr ss:[esp+eax+0xA9]
10001D6E    C1E2 08             shl edx,0x8
10001D71    03D1                add edx,ecx
10001D73    33C9                xor ecx,ecx
10001D75    8A8C04 AA000000     mov cl,byte ptr ss:[esp+eax+0xAA]
10001D7C    83C0 04             add eax,0x4
10001D7F    C1E2 08             shl edx,0x8
10001D82    03D1                add edx,ecx
10001D84    33C9                xor ecx,ecx
10001D86    8A8C04 A7000000     mov cl,byte ptr ss:[esp+eax+0xA7]
10001D8D    C1E2 08             shl edx,0x8
10001D90    03D1                add edx,ecx
10001D92    83F8 20             cmp eax,0x20
10001D95    895404 44           mov dword ptr ss:[esp+eax+0x44],edx
10001D99  ^ 7C C1               jl XaveData.10001D5C                       ; --------
10001D9B    8D5424 48           lea edx,dword ptr ss:[esp+0x48]
10001D9F    6A 08               push 0x8
10001DA1    52                  push edx
10001DA2    8D4C24 18           lea ecx,dword ptr ss:[esp+0x18]
10001DA6    E8 E50F0000         call aveData.10002D90                      ; 初始化username为大整数
10001DAB    8D4424 10           lea eax,dword ptr ss:[esp+0x10]
10001DAF    8D4C24 20           lea ecx,dword ptr ss:[esp+0x20]
10001DB3    50                  push eax
10001DB4    51                  push ecx
10001DB5    8D4C24 30           lea ecx,dword ptr ss:[esp+0x30]
10001DB9    E8 C2030000         call aveData.10002180                      ; F7跟进,这里是主要的加密在地方
10001DBE    50                  push eax                                   ; eax为计算结果对象指针
10001DBF    8D4C24 1C           lea ecx,dword ptr ss:[esp+0x1C]
10001DC3    C68424 D4020000 07  mov byte ptr ss:[esp+0x2D4],0x7
10001DCB    E8 50110000         call aveData.10002F20                      ; LgInt Copy()
10001DD0    8D4C24 20           lea ecx,dword ptr ss:[esp+0x20]
10001DD4    889C24 D0020000     mov byte ptr ss:[esp+0x2D0],bl
10001DDB    E8 90110000         call aveData.10002F70
10001DE0    8D5424 48           lea edx,dword ptr ss:[esp+0x48]
10001DE4    6A 08               push 0x8
10001DE6    52                  push edx
10001DE7    8D4C24 20           lea ecx,dword ptr ss:[esp+0x20]
10001DEB    E8 E00F0000         call aveData.10002DD0                      ; 类输入函数,将大整数复制到参数缓冲区a
10001DF0    8B5424 58           mov edx,dword ptr ss:[esp+0x58]            ; edx=a[4]
10001DF4    8B4C24 54           mov ecx,dword ptr ss:[esp+0x54]            ; ecx=a[3]
10001DF8    8B7424 50           mov esi,dword ptr ss:[esp+0x50]            ; esi=a[2]
10001DFC    8B7C24 4C           mov edi,dword ptr ss:[esp+0x4C]            ; edi=a[1]
10001E00    8B6C24 64           mov ebp,dword ptr ss:[esp+0x64]            ; ebp=a[7]
10001E04    8B5C24 48           mov ebx,dword ptr ss:[esp+0x48]            ; ebx=a[0]
10001E08    8D040A              lea eax,dword ptr ds:[edx+ecx]
10001E0B    0FAFCE              imul ecx,esi
10001E0E    03C6                add eax,esi
10001E10    03C7                add eax,edi
10001E12    33E8                xor ebp,eax                                ; ebp=a[7] xor (a[4]+a[3]+a[2]+a[1])
10001E14    8B4424 5C           mov eax,dword ptr ss:[esp+0x5C]
10001E18    03D8                add ebx,eax
10001E1A    8B4424 60           mov eax,dword ptr ss:[esp+0x60]
10001E1E    33C3                xor eax,ebx                                ; eax=(a[5]+a[0]) xor a[6]
10001E20    896C24 64           mov dword ptr ss:[esp+0x64],ebp
10001E24    894424 60           mov dword ptr ss:[esp+0x60],eax
10001E28    0FAFC5              imul eax,ebp
10001E2B    8B6C24 48           mov ebp,dword ptr ss:[esp+0x48]
10001E2F    2BC1                sub eax,ecx
10001E31    8B4C24 5C           mov ecx,dword ptr ss:[esp+0x5C]
10001E35    2BC1                sub eax,ecx
10001E37    8D8C24 C8010000     lea ecx,dword ptr ss:[esp+0x1C8]
10001E3E    03C5                add eax,ebp
10001E40    03C2                add eax,edx
10001E42    03C7                add eax,edi                                ; eax=eax*ebp-a[3]*a[2]-a[5]+a[4]+a[1]+a[0]
10001E44    50                  push eax
10001E45    68 8CE40010         push aveData.1000E48C                      ; ASCII "%08lX"
10001E4A    51                  push ecx
10001E4B    E8 58240000         call aveData.100042A8                      ; wsprintf( szSerial ,"%08lX" ,eax)
10001E50    8B8424 E8020000     mov eax,dword ptr ss:[esp+0x2E8]
10001E57    8D9424 D4010000     lea edx,dword ptr ss:[esp+0x1D4]
10001E5E    6A 08               push 0x8
10001E60    52                  push edx
10001E61    50                  push eax
10001E62    E8 09240000         call aveData.10004270                      ; memcmp(szPasswod  ,szSerial ,8)
10001E67    83C4 18             add esp,0x18
10001E6A    85C0                test eax,eax
10001E6C    5F                  pop edi
10001E6D    5E                  pop esi
10001E6E    5D                  pop ebp
10001E6F    5B                  pop ebx
10001E70    0F85 83000000       jnz aveData.10001EF9                       ; ------------
10001E76    8D4C24 30           lea ecx,dword ptr ss:[esp+0x30]
10001E7A    C68424 C0020000 09  mov byte ptr ss:[esp+0x2C0],0x9
10001E82    E8 E9100000         call aveData.10002F70
10001E87    8D4C24 28           lea ecx,dword ptr ss:[esp+0x28]
10001E8B    C68424 C0020000 08  mov byte ptr ss:[esp+0x2C0],0x8
10001E93    E8 D8100000         call aveData.10002F70
10001E98    8D4C24 20           lea ecx,dword ptr ss:[esp+0x20]
10001E9C    C68424 C0020000 0A  mov byte ptr ss:[esp+0x2C0],0xA
10001EA4    E8 C7100000         call aveData.10002F70
10001EA9    8D4C24 18           lea ecx,dword ptr ss:[esp+0x18]
10001EAD    C68424 C0020000 01  mov byte ptr ss:[esp+0x2C0],0x1
10001EB5    E8 B6100000         call aveData.10002F70
10001EBA    8D4C24 08           lea ecx,dword ptr ss:[esp+0x8]
10001EBE    C68424 C0020000 00  mov byte ptr ss:[esp+0x2C0],0x0
10001EC6    E8 A5100000         call aveData.10002F70
10001ECB    8D4C24 00           lea ecx,dword ptr ss:[esp]
10001ECF    C78424 C0020000 FFF>mov dword ptr ss:[esp+0x2C0],-0x1          ; 类析造函数 ,对象的析造
10001EDA    E8 91100000         call aveData.10002F70
10001EDF    B8 01000000         mov eax,0x1
10001EE4    8B8C24 B8020000     mov ecx,dword ptr ss:[esp+0x2B8]
10001EEB    64:890D 00000000    mov dword ptr fs:[0],ecx
10001EF2    81C4 C4020000       add esp,0x2C4
10001EF8    C3                  retn
10001EF9    8D4C24 30           lea ecx,dword ptr ss:[esp+0x30]
10001EFD    C68424 C0020000 0C  mov byte ptr ss:[esp+0x2C0],0xC
10001F05    E8 66100000         call aveData.10002F70
10001F0A    8D4C24 28           lea ecx,dword ptr ss:[esp+0x28]
10001F0E    C68424 C0020000 0B  mov byte ptr ss:[esp+0x2C0],0xB
10001F16    E8 55100000         call aveData.10002F70
10001F1B    8D4C24 20           lea ecx,dword ptr ss:[esp+0x20]
10001F1F    C68424 C0020000 0D  mov byte ptr ss:[esp+0x2C0],0xD
10001F27    E8 44100000         call aveData.10002F70
10001F2C    8D4C24 18           lea ecx,dword ptr ss:[esp+0x18]
10001F30    C68424 C0020000 01  mov byte ptr ss:[esp+0x2C0],0x1
10001F38    E8 33100000         call aveData.10002F70
10001F3D    8D4C24 08           lea ecx,dword ptr ss:[esp+0x8]
10001F41    C68424 C0020000 00  mov byte ptr ss:[esp+0x2C0],0x0
10001F49    E8 22100000         call aveData.10002F70
10001F4E    8D4C24 00           lea ecx,dword ptr ss:[esp]
10001F52    C78424 C0020000 FFF>mov dword ptr ss:[esp+0x2C0],-0x1
10001F5D    E8 0E100000         call aveData.10002F70
10001F62    8B8C24 B8020000     mov ecx,dword ptr ss:[esp+0x2B8]
10001F69    33C0                xor eax,eax
10001F6B    64:890D 00000000    mov dword ptr fs:[0],ecx
10001F72    81C4 C4020000       add esp,0x2C4                              ; ------------
10001F78    C3                  retn

上面这段主要是初始化RSA算法的一些变量,为之后加密使用,可以看到 初始化了  p ,q ,e ,n及 szUserName 输入 . 这里可以

下面跟 call 10002180 这句,主要的加密过程都在这个函数里 :


10002180    6A FF                 push -0x1
10002182    68 A7B00010           push aveData.1000B0A7
10002187    64:A1 00000000        mov eax,dword ptr fs:[0]
1000218D    50                    push eax
1000218E    64:8925 00000000      mov dword ptr fs:[0],esp
10002195    81EC AC000000         sub esp,0xAC
1000219B    53                    push ebx
1000219C    55                    push ebp
1000219D    56                    push esi
1000219E    57                    push edi
1000219F    8BE9                  mov ebp,ecx
100021A1    6A 01                 push 0x1
100021A3    8D4C24 58             lea ecx,dword ptr ss:[esp+0x58]
100021A7    C74424 24 00000000    mov dword ptr ss:[esp+0x24],0x0
100021AF    E8 0C0D0000           call aveData.10002EC0                   ; 构造函数
100021B4    6A 01                 push 0x1
100021B6    8D4C24 60             lea ecx,dword ptr ss:[esp+0x60]
100021BA    C78424 C8000000 01000>mov dword ptr ss:[esp+0xC8],0x1
100021C5    E8 F60C0000           call aveData.10002EC0
100021CA    8D4424 54             lea eax,dword ptr ss:[esp+0x54]
100021CE    8D75 18               lea esi,dword ptr ss:[ebp+0x18]
100021D1    50                    push eax
100021D2    8D4C24 68             lea ecx,dword ptr ss:[esp+0x68]
100021D6    56                    push esi
100021D7    51                    push ecx
100021D8    C68424 D0000000 02    mov byte ptr ss:[esp+0xD0],0x2
100021E0    E8 AB0F0000           call aveData.10003190                   ; 大整数减法运算   q-1
100021E5    8BD8                  mov ebx,eax
100021E7    8D5424 68             lea edx,dword ptr ss:[esp+0x68]
100021EB    8D7D 10               lea edi,dword ptr ss:[ebp+0x10]
100021EE    52                    push edx
100021EF    8D8424 BC000000       lea eax,dword ptr ss:[esp+0xBC]
100021F6    57                    push edi
100021F7    50                    push eax
100021F8    C68424 DC000000 03    mov byte ptr ss:[esp+0xDC],0x3
10002200    E8 8B0F0000           call aveData.10003190                   ; 大整数减法运算   p-1
10002205    53                    push ebx
10002206    8D8C24 98000000       lea ecx,dword ptr ss:[esp+0x98]         ; 大整数乘法运算   fn=(p-1)*(q-1)
1000220D    50                    push eax
1000220E    51                    push ecx
1000220F    C68424 E8000000 04    mov byte ptr ss:[esp+0xE8],0x4
10002217    E8 F40F0000           call aveData.10003210
1000221C    83C5 08               add ebp,0x8
1000221F    50                    push eax
10002220    8D5424 4C             lea edx,dword ptr ss:[esp+0x4C]         ; 计算  d:   d*fn%e=1
10002224    55                    push ebp
10002225    52                    push edx
10002226    C68424 F4000000 05    mov byte ptr ss:[esp+0xF4],0x5
1000222E    E8 ED110000           call aveData.10003420                   ; 这里是大整数的 扩展欧几里德算法求逆元过程
10002233    83C4 30               add esp,0x30                            ; 感兴趣的可以F7跟进分析下
10002236    8D4C24 7C             lea ecx,dword ptr ss:[esp+0x7C]
1000223A    C68424 C4000000 0B    mov byte ptr ss:[esp+0xC4],0xB
10002242    E8 290D0000           call aveData.10002F70
10002247    8D8C24 AC000000       lea ecx,dword ptr ss:[esp+0xAC]
1000224E    C68424 C4000000 0A    mov byte ptr ss:[esp+0xC4],0xA
10002256    E8 150D0000           call aveData.10002F70
1000225B    8D4C24 64             lea ecx,dword ptr ss:[esp+0x64]
1000225F    C68424 C4000000 09    mov byte ptr ss:[esp+0xC4],0x9
10002267    E8 040D0000           call aveData.10002F70
1000226C    8D4C24 5C             lea ecx,dword ptr ss:[esp+0x5C]
10002270    C68424 C4000000 08    mov byte ptr ss:[esp+0xC4],0x8
10002278    E8 F30C0000           call aveData.10002F70
1000227D    8D4C24 54             lea ecx,dword ptr ss:[esp+0x54]
10002281    C68424 C4000000 07    mov byte ptr ss:[esp+0xC4],0x7
10002289    E8 E20C0000           call aveData.10002F70
1000228E    56                    push esi
1000228F    8D4424 30             lea eax,dword ptr ss:[esp+0x30]         ; 计算  pqd:  pqd*p%q=1
10002293    57                    push edi
10002294    50                    push eax
10002295    E8 86110000           call aveData.10003420                   ; 同上
1000229A    83C4 0C               add esp,0xC
1000229D    6A 01                 push 0x1
1000229F    8D4C24 48             lea ecx,dword ptr ss:[esp+0x48]
100022A3    C68424 C8000000 0C    mov byte ptr ss:[esp+0xC8],0xC
100022AB    E8 100C0000           call aveData.10002EC0
100022B0    8D4C24 44             lea ecx,dword ptr ss:[esp+0x44]
100022B4    8D9424 9C000000       lea edx,dword ptr ss:[esp+0x9C]
100022BB    51                    push ecx
100022BC    57                    push edi
100022BD    52                    push edx
100022BE    C68424 D0000000 0D    mov byte ptr ss:[esp+0xD0],0xD
100022C6    E8 C50E0000           call aveData.10003190
100022CB    50                    push eax
100022CC    8D4424 34             lea eax,dword ptr ss:[esp+0x34]
100022D0    8D4C24 5C             lea ecx,dword ptr ss:[esp+0x5C]
100022D4    50                    push eax
100022D5    51                    push ecx                                ; 计算  d % p-1
100022D6    C68424 DC000000 0E    mov byte ptr ss:[esp+0xDC],0xE
100022DE    E8 8D100000           call aveData.10003370                   ; 这里是大整数的 取模运算 ,有兴趣可以跟进
100022E3    83C4 18               add esp,0x18
100022E6    8D8C24 9C000000       lea ecx,dword ptr ss:[esp+0x9C]
100022ED    C68424 C4000000 11    mov byte ptr ss:[esp+0xC4],0x11
100022F5    E8 760C0000           call aveData.10002F70
100022FA    8D4C24 44             lea ecx,dword ptr ss:[esp+0x44]
100022FE    C68424 C4000000 10    mov byte ptr ss:[esp+0xC4],0x10
10002306    E8 650C0000           call aveData.10002F70
1000230B    6A 01                 push 0x1
1000230D    8D4C24 38             lea ecx,dword ptr ss:[esp+0x38]
10002311    E8 AA0B0000           call aveData.10002EC0
10002316    8D5424 34             lea edx,dword ptr ss:[esp+0x34]
1000231A    8D8424 8C000000       lea eax,dword ptr ss:[esp+0x8C]
10002321    52                    push edx
10002322    56                    push esi
10002323    50                    push eax
10002324    C68424 D0000000 12    mov byte ptr ss:[esp+0xD0],0x12
1000232C    E8 5F0E0000           call aveData.10003190
10002331    8D4C24 30             lea ecx,dword ptr ss:[esp+0x30]
10002335    50                    push eax
10002336    8D5424 4C             lea edx,dword ptr ss:[esp+0x4C]
1000233A    51                    push ecx                                ; 计算   d % q-1
1000233B    52                    push edx
1000233C    C68424 DC000000 13    mov byte ptr ss:[esp+0xDC],0x13
10002344    E8 27100000           call aveData.10003370                   ; 同上
10002349    83C4 18               add esp,0x18
1000234C    8D8C24 8C000000       lea ecx,dword ptr ss:[esp+0x8C]
10002353    C68424 C4000000 16    mov byte ptr ss:[esp+0xC4],0x16
1000235B    E8 100C0000           call aveData.10002F70
10002360    8D4C24 34             lea ecx,dword ptr ss:[esp+0x34]
10002364    C68424 C4000000 15    mov byte ptr ss:[esp+0xC4],0x15
1000236C    E8 FF0B0000           call aveData.10002F70
10002371    8BAC24 D0000000       mov ebp,dword ptr ss:[esp+0xD0]
10002378    57                    push edi
10002379    8D4424 70             lea eax,dword ptr ss:[esp+0x70]
1000237D    55                    push ebp
1000237E    50                    push eax
1000237F    E8 EC0F0000           call aveData.10003370                   ; 计算  LgInput % p
10002384    8D4C24 58             lea ecx,dword ptr ss:[esp+0x58]         ; LgInput为输入的username整数变形
10002388    57                    push edi
10002389    51                    push ecx
1000238A    8D5424 2C             lea edx,dword ptr ss:[esp+0x2C]
1000238E    50                    push eax
1000238F    52                    push edx                                ; 计算 tp = ((LgInput % p)^(d % p-1)) % (p)
10002390    C68424 E0000000 17    mov byte ptr ss:[esp+0xE0],0x17
10002398    E8 63170000           call aveData.10003B00                   ; 这里是大数幂模运算,有兴趣可以跟进
1000239D    83C4 1C               add esp,0x1C
100023A0    8D4C24 6C             lea ecx,dword ptr ss:[esp+0x6C]
100023A4    C68424 C4000000 19    mov byte ptr ss:[esp+0xC4],0x19
100023AC    E8 BF0B0000           call aveData.10002F70
100023B1    56                    push esi
100023B2    8D4424 78             lea eax,dword ptr ss:[esp+0x78]
100023B6    55                    push ebp
100023B7    50                    push eax
100023B8    E8 B30F0000           call aveData.10003370                   ; LgInput % q
100023BD    8D4C24 48             lea ecx,dword ptr ss:[esp+0x48]
100023C1    56                    push esi
100023C2    51                    push ecx
100023C3    8D5424 24             lea edx,dword ptr ss:[esp+0x24]
100023C7    50                    push eax
100023C8    52                    push edx                                ; 计算 tq = (LgInput % q)^(d % q-1) % (q)
100023C9    C68424 E0000000 1A    mov byte ptr ss:[esp+0xE0],0x1A
100023D1    E8 2A170000           call aveData.10003B00                   ; 同上
100023D6    83C4 1C               add esp,0x1C
100023D9    8D4C24 74             lea ecx,dword ptr ss:[esp+0x74]
100023DD    C68424 C4000000 1C    mov byte ptr ss:[esp+0xC4],0x1C
100023E5    E8 860B0000           call aveData.10002F70
100023EA    8D4424 18             lea eax,dword ptr ss:[esp+0x18]
100023EE    8D4C24 10             lea ecx,dword ptr ss:[esp+0x10]
100023F2    50                    push eax
100023F3    51                    push ecx
100023F4    E8 77090000           call aveData.10002D70                   ; if Compare(tq ,tp)<  0    大数比较函数
100023F9    83C4 08               add esp,0x8                             ;      tq+=q
100023FC    85C0                  test eax,eax
100023FE    74 0A                 je XaveData.1000240A
10002400    56                    push esi
10002401    8D4C24 14             lea ecx,dword ptr ss:[esp+0x14]
10002405    E8 960B0000           call aveData.10002FA0                   ; 大整数加法运算
1000240A    8D5424 18             lea edx,dword ptr ss:[esp+0x18]
1000240E    8D4424 10             lea eax,dword ptr ss:[esp+0x10]
10002412    52                    push edx
10002413    8D8C24 B8000000       lea ecx,dword ptr ss:[esp+0xB8]
1000241A    50                    push eax
1000241B    51                    push ecx
1000241C    E8 6F0D0000           call aveData.10003190                   ; 计算  tq-tp
10002421    8D5424 38             lea edx,dword ptr ss:[esp+0x38]
10002425    C68424 D0000000 1D    mov byte ptr ss:[esp+0xD0],0x1D
1000242D    52                    push edx
1000242E    50                    push eax
1000242F    8D8424 B8000000       lea eax,dword ptr ss:[esp+0xB8]
10002436    50                    push eax
10002437    E8 D40D0000           call aveData.10003210                   ; 计算   (tq-tp)*pqd
1000243C    56                    push esi
1000243D    8D8C24 B0000000       lea ecx,dword ptr ss:[esp+0xB0]
10002444    50                    push eax
10002445    51                    push ecx
10002446    C68424 E8000000 1E    mov byte ptr ss:[esp+0xE8],0x1E
1000244E    E8 1D0F0000           call aveData.10003370                   ; 计算   (tq-tp)*pqd % q
10002453    50                    push eax
10002454    8D9424 AC000000       lea edx,dword ptr ss:[esp+0xAC]
1000245B    B3 1F                 mov bl,0x1F
1000245D    57                    push edi
1000245E    52                    push edx
1000245F    889C24 F4000000       mov byte ptr ss:[esp+0xF4],bl
10002466    E8 A50D0000           call aveData.10003210                   ; 计算   ((tq-tp)*pqd % q)*p
1000246B    8BB424 FC000000       mov esi,dword ptr ss:[esp+0xFC]
10002472    50                    push eax
10002473    8D4424 4C             lea eax,dword ptr ss:[esp+0x4C]
10002477    C68424 F8000000 20    mov byte ptr ss:[esp+0xF8],0x20
1000247F    50                    push eax
10002480    56                    push esi
10002481    E8 8A0C0000           call aveData.10003110                   ; 计算   ((tq-tp)*pqd % q)*p + tp
10002486    83C4 3C               add esp,0x3C
10002489    C74424 20 01000000    mov dword ptr ss:[esp+0x20],0x1
10002491    8D8C24 84000000       lea ecx,dword ptr ss:[esp+0x84]         ; --------
10002498    889C24 C4000000       mov byte ptr ss:[esp+0xC4],bl
1000249F    E8 CC0A0000           call aveData.10002F70
100024A4    8D8C24 94000000       lea ecx,dword ptr ss:[esp+0x94]
100024AB    C68424 C4000000 1E    mov byte ptr ss:[esp+0xC4],0x1E
100024B3    E8 B80A0000           call aveData.10002F70
100024B8    8D8C24 A4000000       lea ecx,dword ptr ss:[esp+0xA4]
100024BF    C68424 C4000000 1D    mov byte ptr ss:[esp+0xC4],0x1D
100024C7    E8 A40A0000           call aveData.10002F70
100024CC    8D8C24 B4000000       lea ecx,dword ptr ss:[esp+0xB4]
100024D3    C68424 C4000000 1C    mov byte ptr ss:[esp+0xC4],0x1C
100024DB    E8 900A0000           call aveData.10002F70
100024E0    8D4C24 10             lea ecx,dword ptr ss:[esp+0x10]
100024E4    C68424 C4000000 19    mov byte ptr ss:[esp+0xC4],0x19
100024EC    E8 7F0A0000           call aveData.10002F70
100024F1    8D4C24 18             lea ecx,dword ptr ss:[esp+0x18]         ; 构造函数 ,对象的析造
100024F5    C68424 C4000000 15    mov byte ptr ss:[esp+0xC4],0x15
100024FD    E8 6E0A0000           call aveData.10002F70
10002502    8D4C24 3C             lea ecx,dword ptr ss:[esp+0x3C]
10002506    C68424 C4000000 10    mov byte ptr ss:[esp+0xC4],0x10
1000250E    E8 5D0A0000           call aveData.10002F70
10002513    8D4C24 4C             lea ecx,dword ptr ss:[esp+0x4C]
10002517    C68424 C4000000 0C    mov byte ptr ss:[esp+0xC4],0xC
1000251F    E8 4C0A0000           call aveData.10002F70
10002524    8D4C24 2C             lea ecx,dword ptr ss:[esp+0x2C]
10002528    C68424 C4000000 07    mov byte ptr ss:[esp+0xC4],0x7
10002530    E8 3B0A0000           call aveData.10002F70
10002535    8D4C24 24             lea ecx,dword ptr ss:[esp+0x24]
10002539    C68424 C4000000 00    mov byte ptr ss:[esp+0xC4],0x0
10002541    E8 2A0A0000           call aveData.10002F70
10002546    8B8C24 BC000000       mov ecx,dword ptr ss:[esp+0xBC]
1000254D    8BC6                  mov eax,esi                             ; ---------
1000254F    5F                    pop edi
10002550    5E                    pop esi
10002551    5D                    pop ebp
10002552    5B                    pop ebx
10002553    64:890D 00000000      mov dword ptr fs:[0],ecx
1000255A    81C4 B8000000         add esp,0xB8
10002560    C2 0800               retn 0x8

可以看到 ,上面进行了一系列的复杂在运算,这些运算都是基于大整数的, 这里省去这些运算细节  ,就不分析了,有兴趣的朋友可以跟进去研究,

综合一下上面的运算:
result={ [ ((LgInput%q)^(d%(q-1))%q)-(LgInput%p)^(d%(q-1))%q ]*pqd%q }*p
其中 pqd 是  x:  p*x%q=1 的 解;

得到这个结果后,就是如上一段代码所示, 将结果的大整数 各个字段进行运算 ,最后将结果格式化为字符串并 与 假码进行比较 ,整个注册过程就是这样了.

写了这么久,看来是好久没发帖了, 要睡觉了 ,晚安,看雪的朋友们!!



【注册机源码下载】 keygen to allok video splitter.rar


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 5
支持
分享
最新回复 (1)
雪    币: 82
活跃值: (306)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
厉害。。。。。
2013-6-11 10:23
0
游客
登录 | 注册 方可回帖
返回
//