沉默的小光 发表于 2016-4-17 15:48

crackMe之160第11题研究

最近一直在学习反汇编,想通过自己的学习,达到比较高的水平。用crackMe160系列来作为练习。crackMe160题下载地址: http://pan.baidu.com/s/1xUWOY%20%E5%AF%86%E7%A0%81:%20jbnq] 密码: jbnq,感谢前辈44018723提供地址
刚开始几题对自己的要求都是能爆破就行,现在我对自己的要求是要能找到注册码才行
这周一直在研究VB5的反汇编,直到昨天才基本入门,然后突然感觉有了读汇编代码的能力有了不少提升,连续破了crackMe中第9到11题
这几题都来自于同一个作者,我想难度设置上应该也是由浅入深的,今天结大家讲一讲我研究第11题的心得,过程全部由自己摸索而得,希望可以和大家一起讨论一下
首先打开第11题的程序:

是这样的一个类似密码盘的界面,经过简单的尝试发现,要输入的话电脑键盘是已经被屏蔽了的,只能通过鼠标点击来输入
成功之后界面会有所变化,但是在这之前没有任何反应
打开OD,附加到这个进程上,然后点Alt+E,选中程序的Andrena模块,右键,跟随入口

进入模块之后,因为是VB5程序,这次有经验了,直接查找UNICODE字符串
右键,中文搜索引擎,搜索UNICODE

发现并没有我们想找的一看就知道是提示信息的字串
返回刚才的界面,右键-》分析-》分析代码之后,把程序往下拉,找到一个
__vbaVarTstEq(总共有很多个,所以轻松一找就到了),经验告诉我们这里就是要做判断输入是否正确的地方了
0040C5F8   > \8D45 CC       lea eax,dword ptr ss:
0040C5FB   .8D8D 4CFFFFFF lea ecx,dword ptr ss:
0040C601   .50            push eax                                 ; /var18 = NULL
0040C602   .51            push ecx                                 ; |var28 = 2CC20000
0040C603   .C785 54FFFFFF>mov dword ptr ss:,Andréna.0040>; |0817E747D7AFF7C7F82836D74RR7A7F7E7B7C7D826D8KKE7B7C
0040C60D   .C785 4CFFFFFF>mov dword ptr ss:,0x8008       ; |
0040C617   .FF15 5C104000 call dword ptr ds:[<&MSVBVM60.__vbaVarTs>; \__vbaVarTstEq
0040C61D   .66:85C0       test ax,ax
0040C620   .74 4C         je short Andréna.0040C66E
0040C622   .8B45 08       mov eax,dword ptr ss:
0040C625   .50            push eax
0040C626   .8B10          mov edx,dword ptr ds:
0040C628   .FF92 38030000 call dword ptr ds:
0040C62E   .50            push eax
0040C62F   .8D45 AC       lea eax,dword ptr ss:
0040C632   .50            push eax
0040C633   .FF15 3C104000 call dword ptr ds:[<&MSVBVM60.__vbaObjSe>;msvbvm60.__vbaObjSet
0040C639   .8B08          mov ecx,dword ptr ds:
0040C63B   .68 BC1E4000   push Andréna.00401EBC                  ;REGISTRIERT
0040C640   .50            push eax
0040C641   .8985 30FFFFFF mov dword ptr ss:,eax
0040C647   .FF51 54       call dword ptr ds:
这个JE跳转非常可疑,尝试下个断点,点运行让程序跑起来,果然马上就被断下了
把这个JE用NOP填充一下(选中那一行,右键,二进制,用NOP填充),强制不跳转
禁用断点,再点执行,看界面已经变成了这样

表明刚才那里正是我们要找的地方。
重新执行程序之后,再找到刚才的位置
往回看,这下突然发现好多个和刚才结构完全一样的代码,尝试下断点之后能发现也会被断下
于是我干脆直接往上找到这个函数初始化的地方去
0040B145   .33F6          xor esi,esi
0040B147   .57            push edi
0040B148   .8975 DC       mov dword ptr ss:,esi
0040B14B   .8975 CC       mov dword ptr ss:,esi
0040B14E   .8975 BC       mov dword ptr ss:,esi
0040B151   .8975 B8       mov dword ptr ss:,esi
0040B154   .8975 B4       mov dword ptr ss:,esi
0040B157   .8975 B0       mov dword ptr ss:,esi
0040B15A   .8975 AC       mov dword ptr ss:,esi
0040B15D   .8975 9C       mov dword ptr ss:,esi
0040B160   .8975 8C       mov dword ptr ss:,esi
0040B163   .89B5 7CFFFFFF mov dword ptr ss:,esi
0040B169   .89B5 6CFFFFFF mov dword ptr ss:,esi
0040B16F   .89B5 5CFFFFFF mov dword ptr ss:,esi
0040B175   .89B5 4CFFFFFF mov dword ptr ss:,esi
0040B17B   .89B5 3CFFFFFF mov dword ptr ss:,esi
0040B181   .89B5 18FFFFFF mov dword ptr ss:,esi
0040B187   .89B5 08FFFFFF mov dword ptr ss:,esi
0040B18D   .89B5 F8FEFFFF mov dword ptr ss:,esi
0040B193   .89B5 E8FEFFFF mov dword ptr ss:,esi
0040B199   .89B5 D8FEFFFF mov dword ptr ss:,esi
0040B19F   .89B5 C8FEFFFF mov dword ptr ss:,esi
0040B1A5   .89B5 B8FEFFFF mov dword ptr ss:,esi
0040B1AB   .89B5 A8FEFFFF mov dword ptr ss:,esi
0040B1B1   .89B5 98FEFFFF mov dword ptr ss:,esi
0040B1B7   .89B5 88FEFFFF mov dword ptr ss:,esi
0040B1BD   .89B5 78FEFFFF mov dword ptr ss:,esi
0040B1C3   .89B5 68FEFFFF mov dword ptr ss:,esi
0040B1C9   .89B5 58FEFFFF mov dword ptr ss:,esi
0040B1CF   .89B5 48FEFFFF mov dword ptr ss:,esi
0040B1D5   .89B5 38FEFFFF mov dword ptr ss:,esi
0040B1DB   .89B5 28FEFFFF mov dword ptr ss:,esi
0040B1E1   .89B5 18FEFFFF mov dword ptr ss:,esi
0040B1E7   .89B5 08FEFFFF mov dword ptr ss:,esi
0040B1ED   .89B5 F8FDFFFF mov dword ptr ss:,esi
0040B1F3   .89B5 E8FDFFFF mov dword ptr ss:,esi
0040B1F9   .89B5 D8FDFFFF mov dword ptr ss:,esi
0040B1FF   .89B5 C8FDFFFF mov dword ptr ss:,esi
0040B205   .89B5 B8FDFFFF mov dword ptr ss:,esi
0040B20B   .89B5 A8FDFFFF mov dword ptr ss:,esi
0040B211   .89B5 98FDFFFF mov dword ptr ss:,esi
0040B217   .89B5 88FDFFFF mov dword ptr ss:,esi
0040B21D   .89B5 78FDFFFF mov dword ptr ss:,esi
0040B223   .89B5 68FDFFFF mov dword ptr ss:,esi
0040B229   .89B5 58FDFFFF mov dword ptr ss:,esi
0040B22F   .89B5 48FDFFFF mov dword ptr ss:,esi
从这一堆置为0的代码里我们可以看到,这就是函数初始化的地方了,后面有很多很多个一模一样的结构在重复地执行,但并不知道它们之间有什么关联
下了断点一句一句往下看
到了
0040B26D   > \8B45 B8       mov eax,dword ptr ss:          ;输入的key的值
这一句的时候发现,OD提示我们这是一个字符串,正是我们输入的key值
顺带提一下,之前浪费好多时间来研究VB5是因为不熟悉它是怎么工作的,我把我的一点小经验告诉大家
VB在进行变量传值的时候通常不会传具体值,它会把变量的地址加载到寄存器里再把寄存器的值压到栈里,以这样的形式传值
像这样

为什么要这样呢,这是因为在VB5中,变量不是单纯的一个数值而已,它的存储包含两部分,前8个字节放变量的数据类型,后8个字节开始才放变量的值(大部分变量)
所以,我们想看一个变量的值的话通常需要这样的命令:
db ebp-54+8,db (针对字符型的)
一个变量的首地址+8才是它的值所在地址
明白这些之后,慢慢地读程序我们会发现
这个程序是把输入的值的前两位转化成一个两位的十进制数字(0到100),再加到每一个输入的字符上去,得到一个新的ASCII码,再把这个ASCII以两个字节的十六进制数的字符形式表示出来
具体过程:
00408F90   .FF90 A0000000 call dword ptr ds:             ;取key的值到ebp-48+8
00408F96   .3BC6          cmp eax,esi                              ;msvbvm60.__vbaStrVarVal
00408F98   .DBE2          fclex
00408F9A   .7D 12         jge short Andréna.00408FAE
00408F9C   .68 A0000000   push 0xA0
00408FA1   .68 B81D4000   push Andréna.00401DB8
00408FA6   .57            push edi                                 ;msvbvm60.__vbaVarMove
00408FA7   .50            push eax
00408FA8   .FF15 2C104000 call dword ptr ds:[<&MSVBVM60.__vbaHresu>;msvbvm60.__vbaHresultCheckObj
00408FAE   >8B45 B8       mov eax,dword ptr ss:
00408FB1   .8B3D 08104000 mov edi,dword ptr ds:[<&MSVBVM60.__vbaVa>;msvbvm60.__vbaVarMove
00408FB7   .8D55 9C       lea edx,dword ptr ss:
00408FBA   .8D4D BC       lea ecx,dword ptr ss:
00408FBD   .8975 B8       mov dword ptr ss:,esi          ;msvbvm60.__vbaStrVarVal
00408FC0   .8945 A4       mov dword ptr ss:,eax
00408FC3   .C745 9C 08000>mov dword ptr ss:,0x8
00408FCA   .FFD7          call edi                                 ;msvbvm60.__vbaVarMove; <&MSVBVM60.__vbaVarMove>
00408FCC   .8D4D AC       lea ecx,dword ptr ss:          ;挪到ebp-64+8
00408FCF   .FF15 D4104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeO>;msvbvm60.__vbaFreeObj
00408FD5   .89B5 54FFFFFF mov dword ptr ss:,esi          ;msvbvm60.__vbaStrVarVal
00408FDB   .BE 02000000   mov esi,0x2
00408FE0   .8D95 4CFFFFFF lea edx,dword ptr ss:
00408FE6   .8D4D CC       lea ecx,dword ptr ss:
00408FE9   .89B5 4CFFFFFF mov dword ptr ss:,esi          ;INTEGER型
00408FEF   .FFD7          call edi                                 ;msvbvm60.__vbaVarMove
00408FF1   .B8 01000000   mov eax,0x1                              ;ebp-34置"0"
00408FF6   .8D95 4CFFFFFF lea edx,dword ptr ss:
00408FFC   .8985 54FFFFFF mov dword ptr ss:,eax          ;NULL型
00409002   .8985 44FFFFFF mov dword ptr ss:,eax
00409008   .8D45 BC       lea eax,dword ptr ss:          ;key的值
0040900B   .52            push edx                                 ; /Step8 = 0018FAFC
0040900C   .8D4D 9C       lea ecx,dword ptr ss:          ; |
0040900F   .50            push eax                                 ; |/var18 = 0018FA7C
00409010   .51            push ecx                                 ; ||retBuffer8 = 00000002
00409011   .89B5 4CFFFFFF mov dword ptr ss:,esi          ; ||msvbvm60.__vbaStrVarVal
00409017   .89B5 3CFFFFFF mov dword ptr ss:,esi          ; ||msvbvm60.__vbaStrVarVal
0040901D   .FF15 30104000 call dword ptr ds:[<&MSVBVM60.__vbaLenVa>; |\__vbaLenVar
00409023   .50            push eax                                 ; |End8 = 0018FA7C
00409024   .8D95 3CFFFFFF lea edx,dword ptr ss:          ; |ebp-64+8为输入的KEY长度
0040902A   .8D85 08FFFFFF lea eax,dword ptr ss:          ; |
00409030   .52            push edx                                 ; |Start8 = 0018FAFC
00409031   .8D8D 18FFFFFF lea ecx,dword ptr ss:          ; |
00409037   .50            push eax                                 ; |TMPend8 = 0018FA7C
00409038   .8D55 DC       lea edx,dword ptr ss:          ; |
0040903B   .51            push ecx                                 ; |TMPstep8 = 00000002
0040903C   .52            push edx                                 ; |Counter8 = 0018FAFC
0040903D   .FF15 38104000 call dword ptr ds:[<&MSVBVM60.__vbaVarFo>; \__vbaVarForInit
00409043   .8B35 80104000 mov esi,dword ptr ds:[<&MSVBVM60.__vbaSt>;msvbvm60.__vbaStrVarVal
00409049   .8B1D B4104000 mov ebx,dword ptr ds:[<&MSVBVM60.#617>];msvbvm60.rtcLeftCharVar
0040904F   >85C0          test eax,eax
00409051   .0F84 29010000 je Andréna.00409180
00409057   .8D45 BC       lea eax,dword ptr ss:          ;key的值
0040905A   .6A 01         push 0x1
0040905C   .8D4D 8C       lea ecx,dword ptr ss:
0040905F   .50            push eax
00409060   .51            push ecx
00409061   .FFD3          call ebx                                 ;msvbvm60.rtcLeftCharVar
00409063   .8D55 8C       lea edx,dword ptr ss:
00409066   .8D45 B0       lea eax,dword ptr ss:
00409069   .52            push edx
0040906A   .50            push eax
0040906B   .FFD6          call esi                                 ;msvbvm60.__vbaStrVarVal
0040906D   .50            push eax
0040906E   .FF15 D8104000 call dword ptr ds:[<&MSVBVM60.#581>]   ;msvbvm60.rtcR8ValFromBstr
00409074   .DD9D 34FFFFFF fstp qword ptr ss:             ;转成64位浮点
0040907A   .8D4D 9C       lea ecx,dword ptr ss:
0040907D   .8D55 DC       lea edx,dword ptr ss:
00409080   .51            push ecx
00409081   .52            push edx
00409082   .C745 A4 01000>mov dword ptr ss:,0x1
00409089   .C745 9C 02000>mov dword ptr ss:,0x2
00409090   .FF15 AC104000 call dword ptr ds:[<&MSVBVM60.__vbaI4Var>;msvbvm60.__vbaI4Var
00409096   .50            push eax                                 ;INTEGER型
00409097   .8D45 BC       lea eax,dword ptr ss:
0040909A   .8D4D B8       lea ecx,dword ptr ss:
0040909D   .50            push eax
0040909E   .51            push ecx
0040909F   .FFD6          call esi                                 ;msvbvm60.__vbaStrVarVal
004090A1   .50            push eax                                 ;取ascii码值
004090A2   .FF15 4C104000 call dword ptr ds:[<&MSVBVM60.#631>]   ;msvbvm60.rtcMidCharBstr
004090A8   .8BD0          mov edx,eax
004090AA   .8D4D B4       lea ecx,dword ptr ss:
004090AD   .FF15 BC104000 call dword ptr ds:[<&MSVBVM60.__vbaStrMo>;msvbvm60.__vbaStrMove
004090B3   .50            push eax                                 ; /String = "?"
004090B4   .FF15 20104000 call dword ptr ds:[<&MSVBVM60.#516>]   ; \rtcAnsiValueBstr
004090BA   .0FBFD0      movsx edx,ax                           ;取ASCII码值
004090BD   .8995 FCFCFFFF mov dword ptr ss:,edx
004090C3   .C785 7CFFFFFF>mov dword ptr ss:,0x5
004090CD   .DB85 FCFCFFFF fild dword ptr ss:            ;转双精度浮点压栈
004090D3   .DD9D F4FCFFFF fstp qword ptr ss:
004090D9   .DD85 F4FCFFFF fld qword ptr ss:             ;64位浮点
004090DF   .DC85 34FFFFFF fadd qword ptr ss:
004090E5   .DD5D 84       fstp qword ptr ss:             ;和到ebp-7c
004090E8   .DFE0          fstsw ax
004090EA   .A8 0D         test al,0xD
004090EC   .0F85 FA1F0000 jnz Andréna.0040B0EC
004090F2   .8D85 7CFFFFFF lea eax,dword ptr ss:          ;5
004090F8   .50            push eax
004090F9   .FF15 94104000 call dword ptr ds:[<&MSVBVM60.#572>]   ;msvbvm60.rtcHexBstrFromVar
004090FF   .8D4D CC       lea ecx,dword ptr ss:          ;和转成String
00409102   .8985 74FFFFFF mov dword ptr ss:,eax          ;存到ebp-94+8
00409108   .8D95 6CFFFFFF lea edx,dword ptr ss:
0040910E   .51            push ecx
0040910F   .8D85 5CFFFFFF lea eax,dword ptr ss:
00409115   .52            push edx
00409116   .50            push eax
00409117   .C785 6CFFFFFF>mov dword ptr ss:,0x8
00409121   .FF15 84104000 call dword ptr ds:[<&MSVBVM60.__vbaVarCa>;msvbvm60.__vbaVarCat
00409127   .8BD0          mov edx,eax
00409129   .8D4D CC       lea ecx,dword ptr ss:
0040912C   .FFD7          call edi                                 ;msvbvm60.__vbaVarMove
0040912E   .8D4D B0       lea ecx,dword ptr ss:
00409131   .8D55 B4       lea edx,dword ptr ss:
00409134   .51            push ecx
00409135   .8D45 B8       lea eax,dword ptr ss:
00409138   .52            push edx
00409139   .50            push eax
0040913A   .6A 03         push 0x3
0040913C   .FF15 9C104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeS>;msvbvm60.__vbaFreeStrList
00409142   .8D8D 6CFFFFFF lea ecx,dword ptr ss:
00409148   .8D95 7CFFFFFF lea edx,dword ptr ss:
0040914E   .51            push ecx
0040914F   .8D45 8C       lea eax,dword ptr ss:
00409152   .52            push edx
00409153   .8D4D 9C       lea ecx,dword ptr ss:
00409156   .50            push eax
00409157   .51            push ecx
00409158   .6A 04         push 0x4
0040915A   .FF15 14104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeV>;msvbvm60.__vbaFreeVarList
00409160   .83C4 24       add esp,0x24
00409163   .8D95 08FFFFFF lea edx,dword ptr ss:
00409169   .52            push edx                                 ; /TMPend8 = 0018FAFC
0040916A   .8D85 18FFFFFF lea eax,dword ptr ss:          ; |
00409170   .8D4D DC       lea ecx,dword ptr ss:          ; |
00409173   .50            push eax                                 ; |TMPstep8 = 0018FA7C
00409174   .51            push ecx                                 ; |Counter8 = 00000002
00409175   .FF15 C8104000 call dword ptr ds:[<&MSVBVM60.__vbaVarFo>; \__vbaVarForNext
0040917B   .^ E9 CFFEFFFF   jmp Andréna.0040904F
00409180   >8D55 CC       lea edx,dword ptr ss:
00409183   .8D85 4CFFFFFF lea eax,dword ptr ss:
00409189   .52            push edx                                 ; /var18 = 0018FAFC
0040918A   .50            push eax                                 ; |var28 = 0018FA7C
0040918B   .C785 54FFFFFF>mov dword ptr ss:,Andréna.0040>; |0817E747D7AFF7C7F82836D74RR7A7F7E7B7C7D826D81KE7B7C
00409195   .C785 4CFFFFFF>mov dword ptr ss:,0x8008       ; |
0040919F   .FF15 5C104000 call dword ptr ds:[<&MSVBVM60.__vbaVarTs>; \__vbaVarTstEq
拿这一段来说,首先取出来的key放在ebp-48这个变量里,再通过__vbaVarMove把它挪到变量ebp-64里去
接着把变量ebp-34置为"0",也就是单独的一个字符0
后面通过__vbaStrVarVal开始一个循环
在循环里拿出变量的前两个字符转成浮点类存在ebp-cc里面
再取第x个字符(x是循环变量counter)ASCII码值,转成64位浮点数,与ebp-cc相加,再转成ASCII码,再把这个ASCII码十六进制数以两个字符表示存在ebp-94里
再通过__vbaVarCat把ebp-94里的字符连接到ebp-34上去。
循环结束后得到一串字符ebp-34与ebp-b4通过__vbaVarTstEq进行字串比较,成功就显示我们刚才成功爆破的那个界面
但是要准备开始计算时我傻眼了,发现这个字串里居然带有"R",这是十六进制数里不可能含有的东西
我顿时明白了这么多的相同的结构是什么用途了
右键,中文搜索引擎,搜索UNICODE,能看到一堆这样的码,仔细一看,里面不是含有G,就是含有K,H,或是R
找了好久终于发现一个正常一点的

看来这一个才是真正的码,其余的都是起干扰作用的
跟进去下断点一看果然之前代码功能完全相同
现在就是要找到这样一个字符串了
通过计算发现当前两位为74时,正好符合81 7E开头的密码
于是利用C语言计算源码:
void main()
{
        int i;
        char key={0},str;
        int num;
        strcpy(key,"81 7E 74 7D 7A 7D 7C 7F 82 83 6D 74 74 7A 7F 7E 7B 7C 7D 82 6D 81 7E 7B 7C ");
        for(i=0;i<strlen(key)/3;i++)
        {
                sscanf(key+i*3,"%x ",num+i);
                num -= 74;
                printf("%c",num);
        }
        printf("\n");
}
结果如下

填到crackMe中果然可行

至此破解工作结束

CRoot 发表于 2016-6-30 17:23

00408FE6   .8D4D CC       lea ecx,dword ptr ss:
00408FE9   .89B5 4CFFFFFF mov dword ptr ss:,esi          ;INTEGER型
00408FEF   .FFD7          call edi                                 ;msvbvm60.__vbaVarMove
00408FF1   .B8 01000000   mov eax,0x1                              ;ebp-34置"0"
00408FF6   .8D95 4CFFFFFF lea edx,dword ptr ss:
00408FFC   .8985 54FFFFFF mov dword ptr ss:,eax          ;NULL型
00409002   .8985 44FFFFFF mov dword ptr ss:,eax
00409008   .8D45 BC       lea eax,dword ptr ss:          ;key的值
此处置零何解? ebp-34 和eax没有关系吧 何况还是置的1

CRoot 发表于 2016-7-1 13:34

本帖最后由 CRoot 于 2016-7-1 17:29 编辑

沉默的小光 发表于 2016-6-30 18:48
上一行的注释写到这一行来了
哦哦 谢谢 请教 在循环里拿出变量的前两个字符转成浮点类存在ebp-cc里面 是在哪里取的前两个字符 我调试的时候 发现好像只取了一位啊?.text:00406CC7               lea   eax,
.text:00406CCA               push    1
.text:00406CCC               lea   ecx,
.text:00406CCF               push    eax
.text:00406CD0               push    ecx
.text:00406CD1               call    ebx ; rtcLeftCharVar

CRoot 发表于 2016-6-27 14:14

两位的十进制数字(0到100) 是0到99 吧?

菜鸟也想飞 发表于 2016-6-28 12:43

学习了,后面再仔细看,谢谢!

沉默的小光 发表于 2016-6-30 18:48

CRoot 发表于 2016-6-30 17:23
00408FE6   .8D4D CC       lea ecx,dword ptr ss:
00408FE9   .89B ...

上一行的注释写到这一行来了

沉默的小光 发表于 2016-7-1 17:56

CRoot 发表于 2016-7-1 13:34
哦哦 谢谢 请教 在循环里拿出变量的前两个字符转成浮点类存在ebp-cc里面 是在哪里取的前两个字符 我调试 ...

0040906B   .FFD6          call esi                                 ;msvbvm60.__vbaStrVarVal
从这个函数出来的结果是取的两个字符,除掉第1个0之外每两个字符组成一个浮点数

CRoot 发表于 2016-7-1 19:17

沉默的小光 发表于 2016-7-1 17:56
0040906B   .FFD6          call esi                                 ;msvbvm60.__vbaStrVarVal
...

我输入的是1234567890*# 然后调用那个函数 第一次循环 eax返回的是1 并没有其他值啊

沉默的小光 发表于 2016-7-4 10:13

CRoot 发表于 2016-7-1 19:17
我输入的是1234567890*# 然后调用那个函数 第一次循环 eax返回的是1 并没有其他值啊

我指的是破解程序内部的字符
81 7E 74 7D 7A 7D 7C 7F 82 83 6D 74 74 7A 7F 7E 7B 7C 7D 82 6D 81 7E 7B 7C

CRoot 发表于 2016-7-4 21:39

本帖最后由 CRoot 于 2016-7-4 21:41 编辑

沉默的小光 发表于 2016-7-4 10:13
我指的是破解程序内部的字符
81 7E 74 7D 7A 7D 7C 7F 82 83 6D 74 74 7A 7F 7E 7B 7C 7D 82 6D 81 7E 7 ...
嗯,是我大意了,存在两套算法,不光存在多个假码,真是套路!
真码才是push的2
我写的注册机
mKey =
iKey = ''
first2 = 0
for i in range(0,99):
      first2 = str(i)
      temp = ord(first2[:1]) + i
      if temp == int(0x81):
                #print first2
                break
for element in mKey:
      iKey = iKey + chr(element - int(first2))
print iKey
页: [1] 2
查看完整版本: crackMe之160第11题研究