Smart Install Maker 5.04算法分析
本帖最后由 crackvip 于 2015-5-8 16:28 编辑【文章标题】: Smart Install Maker 5.04算法分析
【文章作者】: Crackvip
【作者主页】: http://www.sminstall.com
【软件名称】: Smart Install Maker
【下载地址】: 自己搜索下载
【保护方式】: 无
【使用工具】: OD+XP
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
一开始是找关键点难,找到关键点了之后是很容易找到算法CALL的
首先看了下,无壳,直接打开相应目录下的语言文件,
直接C:\Program Files\Smart Install Maker\Language\Interface\English.lng
找到这一处
...
170=Thank you for registering!
这个就是注册成功的标志,我是怎么知道,呵呵,因为你输错注册码他不会提示你,所以那肯定是正确了才会提示你
================================
好,OD载入软件,直接搜索全部常量,输入0xAA----因为--->>>0xAA=170,所以搜索0xAA
参考位于 SIM:CODE 到常量 0xAA
地址 反汇编 注释
...
004EF44F MOV EDX, 0xAA 这里就是注册成功的提示
00505ACC MOV EDX, 0xAA
00505B03 MOV EDX, 0xAA
我们看到这三个比较可疑,一个个点进去,看然看上面有没有跳转
------------
第1处
004EF41B|.E8 CCC30100 CALL SIM.0050B7EC ;
004EF420|.84C0 TEST AL, AL
004EF422|.74 4B JE SHORT SIM.004EF46F ;这里有,直接下断
004EF424|.A1 341F5100 MOV EAX, DWORD PTR DS:
004EF429|.C600 01 MOV BYTE PTR DS:[EAX], 0x1
004EF42C|.A1 7C235100 MOV EAX, DWORD PTR DS:
004EF431|.8B55 FC MOV EDX, DWORD PTR SS:[EBP-0x4]
004EF434|.E8 F355F1FF CALL SIM.00404A2C
004EF439|.E8 32630000 CALL SIM.004F5770
004EF43E|.6A 40 PUSH 0x40
004EF440|.68 28F54E00 PUSH SIM.004EF528 ;Smart Install Maker
004EF445|.8D4D EC LEA ECX, DWORD PTR SS:[EBP-0x14]
004EF448|.A1 A41E5100 MOV EAX, DWORD PTR DS:
004EF44D|.8B00 MOV EAX, DWORD PTR DS:[EAX]
004EF44F|.BA AA000000 MOV EDX, 0xAA ;第1处
------------
第2,3处,相隔很近
00505ABC . /74 6D JE SHORT SIM.00505B2B ;这里有跳,F2下断
00505ABE . |B2 01 MOV DL, 0x1
00505AC0 . |A1 D8584200 MOV EAX, DWORD PTR DS: ;$YB
00505AC5 . |E8 2E67F2FF CALL SIM.0042C1F8
00505ACA . |8BF8 MOV EDI, EAX
00505ACC . |BA AA000000 MOV EDX, 0xAA ;第2处
00505AD1 . |8BC7 MOV EAX, EDI
...
00505AFE . |B9 3A000000 MOV ECX, 0x3A
00505B03 . |BA AA000000 MOV EDX, 0xAA ;第3处
好,我们F9运行,直接随便输入用户名和注册码,点注册
断下来了
断在第1处,,好由此可见,我们找到的第1处是关键
好,重新标注一下,这次,我们找到断首下断
004EF3B4/.55 PUSH EBP ;注册 验证开始
004EF3B5|.8BEC MOV EBP, ESP
004EF3B7|.33C9 XOR ECX, ECX
004EF3B9|.51 PUSH ECX
004EF3BA|.51 PUSH ECX
004EF3BB|.51 PUSH ECX
004EF3BC|.51 PUSH ECX
004EF3BD|.51 PUSH ECX
004EF3BE|.53 PUSH EBX
004EF3BF|.56 PUSH ESI
004EF3C0|.8BD8 MOV EBX, EAX
004EF3C2|.33C0 XOR EAX, EAX
004EF3C4|.55 PUSH EBP
004EF3C5|.68 1AF54E00 PUSH SIM.004EF51A
004EF3CA|.64:FF30 PUSH DWORD PTR FS:[EAX]
004EF3CD|.64:8920 MOV DWORD PTR FS:[EAX], ESP
004EF3D0|.8D55 F4 LEA EDX, DWORD PTR SS:[EBP-0xC]
004EF3D3|.8B83 F8020000 MOV EAX, DWORD PTR DS:[EBX+0x2F8]
004EF3D9|.E8 62FDF7FF CALL SIM.0046F140 ;取用户名
004EF3DE|.8B45 F4 MOV EAX, DWORD PTR SS:[EBP-0xC] ;用户名到EAX
004EF3E1|.8D55 FC LEA EDX, DWORD PTR SS:[EBP-0x4]
004EF3E4|.E8 6BFFFFFF CALL SIM.004EF354
004EF3E9|.8D55 F0 LEA EDX, DWORD PTR SS:[EBP-0x10]
004EF3EC|.8B83 FC020000 MOV EAX, DWORD PTR DS:[EBX+0x2FC]
004EF3F2|.E8 49FDF7FF CALL SIM.0046F140 ;取假码
004EF3F7|.8B45 F0 MOV EAX, DWORD PTR SS:[EBP-0x10]
004EF3FA|.8D55 F8 LEA EDX, DWORD PTR SS:[EBP-0x8]
004EF3FD|.E8 52FFFFFF CALL SIM.004EF354 ;应该是去首尾空格
004EF402|.837D FC 00 CMP DWORD PTR SS:[EBP-0x4], 0x0 ;判断是否输入了用用户名
004EF406|.74 67 JE SHORT SIM.004EF46F
004EF408|.8B45 F8 MOV EAX, DWORD PTR SS:[EBP-0x8]
004EF40B|.E8 A458F1FF CALL SIM.00404CB4 ;注册码长度
004EF410|.83F8 1D CMP EAX, 0x1D ;长度0x1D=29
004EF413|.75 5A JNZ SHORT SIM.004EF46F ;长度不等于则直接跳出来,这个是长度爆破点
004EF415|.8B55 F8 MOV EDX, DWORD PTR SS:[EBP-0x8]
004EF418|.8B45 FC MOV EAX, DWORD PTR SS:[EBP-0x4]
004EF41B|.E8 CCC30100 CALL SIM.0050B7EC ;算法CALL,这个算法CALL有两个地方调用了
004EF420|.84C0 TEST AL, AL
004EF422|.74 4B JE SHORT SIM.004EF46F ;等于0,则表示不成功,所以AL必须不等于0
004EF424|.A1 341F5100 MOV EAX, DWORD PTR DS:
004EF429|.C600 01 MOV BYTE PTR DS:[EAX], 0x1
004EF42C|.A1 7C235100 MOV EAX, DWORD PTR DS:
004EF431|.8B55 FC MOV EDX, DWORD PTR SS:[EBP-0x4]
004EF434|.E8 F355F1FF CALL SIM.00404A2C
004EF439|.E8 32630000 CALL SIM.004F5770
004EF43E|.6A 40 PUSH 0x40
004EF440|.68 28F54E00 PUSH SIM.004EF528 ;Smart Install Maker
004EF445|.8D4D EC LEA ECX, DWORD PTR SS:[EBP-0x14]
004EF448|.A1 A41E5100 MOV EAX, DWORD PTR DS:
004EF44D|.8B00 MOV EAX, DWORD PTR DS:[EAX]
004EF44F|.BA AA000000 MOV EDX, 0xAA ;这里就是注册成功的提示
004EF454|.8B30 MOV ESI, DWORD PTR DS:[EAX]
=================================
我们判断004EF41B|.E8 CCC30100 CALL SIM.0050B7EC 这处应该是算法CALL,所以,在此下断,F7跟进
0050B7EC/$55 PUSH EBP ;算法CALL
0050B7ED|.8BEC MOV EBP, ESP
0050B7EF|.83C4 C0 ADD ESP, -0x40
0050B7F2|.53 PUSH EBX
0050B7F3|.56 PUSH ESI
0050B7F4|.57 PUSH EDI
0050B7F5|.8955 F8 MOV DWORD PTR SS:[EBP-0x8], EDX
0050B7F8|.8945 FC MOV DWORD PTR SS:[EBP-0x4], EAX
0050B7FB|.8B45 FC MOV EAX, DWORD PTR SS:[EBP-0x4]
0050B7FE|.E8 A196EFFF CALL SIM.00404EA4
0050B803|.8B45 F8 MOV EAX, DWORD PTR SS:[EBP-0x8]
0050B806|.E8 9996EFFF CALL SIM.00404EA4
0050B80B|.33C0 XOR EAX, EAX
0050B80D|.55 PUSH EBP
0050B80E|.68 A4BA5000 PUSH SIM.0050BAA4
0050B813|.64:FF30 PUSH DWORD PTR FS:[EAX]
0050B816|.64:8920 MOV DWORD PTR FS:[EAX], ESP
0050B819|.BB 19000000 MOV EBX, 0x19
0050B81E|>8BC3 /MOV EAX, EBX
0050B820|.04 41 |ADD AL, 0x41
0050B822|.BA 19000000 |MOV EDX, 0x19
0050B827|.2BD3 |SUB EDX, EBX
0050B829|.884415 C0 |MOV BYTE PTR SS:[EBP+EDX-0x40], AL ;ZYX
0050B82D|.4B |DEC EBX
0050B82E|.83FB FF |CMP EBX, -0x1
0050B831|.^ 75 EB \JNZ SHORT SIM.0050B81E ; Z-A,动态生成字母表,Z-A
0050B833|.33DB XOR EBX, EBX
0050B835|.8D45 DA LEA EAX, DWORD PTR SS:[EBP-0x26]
0050B838|>8BD3 /MOV EDX, EBX
0050B83A|.80C2 30 |ADD DL, 0x30
0050B83D|.8810 |MOV BYTE PTR DS:[EAX], DL
0050B83F|.43 |INC EBX
0050B840|.40 |INC EAX
0050B841|.83FB 0A |CMP EBX, 0xA
0050B844|.^ 75 F2 \JNZ SHORT SIM.0050B838 ;动态生成数字表0-9
0050B846|.8B45 FC MOV EAX, DWORD PTR SS:[EBP-0x4] ;用户名到EAX
0050B849|.E8 6694EFFF CALL SIM.00404CB4 ;用户名长度
0050B84E|.8945 F4 MOV DWORD PTR SS:[EBP-0xC], EAX
0050B851|.33FF XOR EDI, EDI ;EDI清零了
0050B853|.33C0 XOR EAX, EAX
0050B855|.8945 EC MOV DWORD PTR SS:[EBP-0x14], EAX ;这里置0了
0050B858|.33C0 XOR EAX, EAX
0050B85A|.8945 E8 MOV DWORD PTR SS:[EBP-0x18], EAX
0050B85D|.C745 E4 01000000 MOV DWORD PTR SS:[EBP-0x1C], 0x1 ;= 0x1
0050B864|.BB 01000000 MOV EBX, 0x1 ;计数器置1
0050B869|>8BC3 /MOV EAX, EBX
0050B86B|.B9 06000000 |MOV ECX, 0x6
0050B870|.33D2 |XOR EDX, EDX
0050B872|.F7F1 |DIV ECX
0050B874|.85D2 |TEST EDX, EDX ;这里是MOD 6 之后的数,也就是说,是6的倍就,则跳过
0050B876|.0F84 8D000000 |JE SIM.0050B909
0050B87C|.47 |INC EDI ;这里将EDI加了1,也就是说,这个EDI最大可以到25,但这里在下面有个条件,如果你的这个数,大于用户名的长度,则又从0开始计算,因为6的倍数跳过,不累加
0050B87D|.8B45 FC |MOV EAX, DWORD PTR SS:[EBP-0x4] ;用户名到EAX
0050B880|.0FB67438 FF |MOVZX ESI, BYTE PTR DS:[EAX+EDI-0x1] ;逐字取ASCII,顺序取
0050B885|.0175 E8 |ADD DWORD PTR SS:[EBP-0x18], ESI ;相加
0050B888|.83FB 05 |CMP EBX, 0x5 ;这个EBX是,1-0x1E的循环,判断EBX是不是前5位
0050B88B|.76 65 |JBE SHORT SIM.0050B8F2 ;不高于5则跳
0050B88D|.83FB 19 |CMP EBX, 0x19 ;判断是不是高于0x19
0050B890|.73 60 |JNB SHORT SIM.0050B8F2 ;不低于则跳
0050B892|.8B45 F4 |MOV EAX, DWORD PTR SS:[EBP-0xC] ;前5位和0x19位后面的计算方法一样
0050B895|.8B55 F4 |MOV EDX, DWORD PTR SS:[EBP-0xC] ;用户名长度到EAX.EDX
0050B898|.2BD7 |SUB EDX, EDI ;这句和下面这句的意思联起来就是0-EDI
0050B89A|.2BD0 |SUB EDX, EAX ;上一行的这个EDI就是上面的累加的,非6的倍数的,下面又一个循环
0050B89C|.77 26 |JA SHORT SIM.0050B8C4 ;高于则跳,这是一个无符号的比较,我的理解是大于0,则跳,有符号的话就是负数
0050B89E|.4A |DEC EDX ;减1,这里相当于0-EDI-1
0050B89F|.92 |XCHG EAX, EDX ;交换位置
0050B8A0|.8955 F0 |MOV DWORD PTR SS:[EBP-0x10], EDX ;用户名 长度到
0050B8A3|>8B55 FC |/MOV EDX, DWORD PTR SS:[EBP-0x4] ;用户名到EDX
0050B8A6|.8B4D F0 ||MOV ECX, DWORD PTR SS:[EBP-0x10] ;在下面递减
0050B8A9|.0FB6540A FF ||MOVZX EDX, BYTE PTR DS:[EDX+ECX-0x1] ;逐位取,从后往前取ASCII
0050B8AE|.03D6 ||ADD EDX, ESI ;相加,加上上面计算得到的ASCII的数
0050B8B0|.8D4C1F 07 ||LEA ECX, DWORD PTR DS:[EDI+EBX+0x7]
0050B8B4|.03F1 ||ADD ESI, ECX ;又相加,ESI+EDI+EBX+7,这个EDI是除6倍数以外的1-0x1E循环的数,而EBX就是1-0x1E循环的数,ESI是上面循环得到的字母的ASC
0050B8B6|.0FAF75 F4 ||IMUL ESI, DWORD PTR SS:[EBP-0xC] ;上一行计算得到的数乘以长度
0050B8BA|.03D6 ||ADD EDX, ESI ;再与上面0050B8AE 处得到的EDX
0050B8BC|.8BF2 ||MOV ESI, EDX ;把EDX和ESI的数据复制成一样
0050B8BE|.FF4D F0 ||DEC DWORD PTR SS:[EBP-0x10] ;用户名长度-1
0050B8C1|.40 ||INC EAX ;这个EAx就是上面的0-EDI-1,直接+1,加到溢出为0,则跳出循环
0050B8C2|.^ 75 DF |\JNZ SHORT SIM.0050B8A3 ;这里又是一个循环,判断EAX是否为0
0050B8C4|>8BC6 |MOV EAX, ESI ;上面是补位不?逆向取
0050B8C6|.B9 23000000 |MOV ECX, 0x23 ;除数
0050B8CB|.33D2 |XOR EDX, EDX
0050B8CD|.F7F1 |DIV ECX ;DIV计算
0050B8CF|.8BF2 |MOV ESI, EDX ;余数到ESI
0050B8D1|.8D55 C0 |LEA EDX, DWORD PTR SS:[EBP-0x40] ;第一步计算出来的Z-A0-9的字串
0050B8D4|.8B45 F8 |MOV EAX, DWORD PTR SS:[EBP-0x8] ;假码到EAX
0050B8D7|.8A4418 FF |MOV AL, BYTE PTR DS:[EAX+EBX-0x1] ;假码第2部分第1位
0050B8DB|.B9 23000000 |MOV ECX, 0x23
0050B8E0|.E8 ABF4FFFF |CALL SIM.0050AD90 ;在串码里找相应的位置,取出相应的字母
0050B8E5|.3BF0 |CMP ESI, EAX ;是否为第6的位置的字母,这里是注册码的第2组到第4组
0050B8E7|.0F94C0 |SETE AL ;判断我们输入的假码是否有其相同,是则在下面累加个数
0050B8EA|.25 FF000000 |AND EAX, 0xFF ;and FF
0050B8EF|.0145 EC |ADD DWORD PTR SS:[EBP-0x14], EAX ;相加,这个相加很关键,因为这里判断有注册码有几位与算出来的是一样的,是则加1,不是则加0
0050B8F2|>83FE 01 |CMP ESI, 0x1 ;这个ESI就有两个意思了,如果是从顶上跳下来的,则为ASCII,如果是顺序下来的,则是
0050B8F5|.76 08 |JBE SHORT SIM.0050B8FF ;不高于 1则跳到下一位
0050B8F7|.4E |DEC ESI ;ESI-1
0050B8F8|.0FAF75 E4 |IMUL ESI, DWORD PTR SS:[EBP-0x1C] ;-1相乘
0050B8FC|.8975 E4 |MOV DWORD PTR SS:[EBP-0x1C], ESI
0050B8FF|>8B45 F4 |MOV EAX, DWORD PTR SS:[EBP-0xC] ;假码长度到EAX, 这个也很关键
0050B902|.48 |DEC EAX ;用户名长度-1
0050B903|.3BF8 |CMP EDI, EAX ;也就是说,当循环的EDI长度大于注册码长度时,则置0,从第1位开始取,这里的0代表第1位
0050B905|.72 02 |JB SHORT SIM.0050B909
0050B907|.33FF |XOR EDI, EDI ;清零
0050B909|>43 |INC EBX ;计数器加1
0050B90A|.83FB 1E |CMP EBX, 0x1E ;长度1E=30,循环,其中6的倍数去除
0050B90D|.^ 0F85 56FFFFFF \JNZ SIM.0050B869 ;1-30,6,12,18,24,30,共计5个是6的倍数,所以最多循环计算可得出25个数据
0050B913|.8B45 E4 MOV EAX, DWORD PTR SS:[EBP-0x1C] ;以下为计算第一组和第五组注册码,这里要用到三个数,即,算码出来的累加和,累积和,以及用户名的长度
0050B916|.03C7 ADD EAX, EDI ;这个为累积
0050B918|.83C0 02 ADD EAX, 0x2 ;加上上面的EDI,再+2,除0x23求余数,然后找字母
0050B91B|.B9 23000000 MOV ECX, 0x23 ;下面的基本上是一样的,关键是要算出上面的数,才可以计算后面的位置
0050B920|.33D2 XOR EDX, EDX
0050B922|.F7F1 DIV ECX ;余数
0050B924|.8A4415 C0 MOV AL, BYTE PTR SS:[EBP+EDX-0x40]
0050B928|.8B55 F8 MOV EDX, DWORD PTR SS:[EBP-0x8]
0050B92B|.3A02 CMP AL, BYTE PTR DS:[EDX] ;T
0050B92D|.0F94C0 SETE AL
0050B930|.83E0 7F AND EAX, 0x7F
0050B933|.0145 EC ADD DWORD PTR SS:[EBP-0x14], EAX
0050B936|.8B45 E4 MOV EAX, DWORD PTR SS:[EBP-0x1C]
0050B939|.8D0440 LEA EAX, DWORD PTR DS:[EAX+EAX*2]
0050B93C|.B9 23000000 MOV ECX, 0x23
0050B941|.33D2 XOR EDX, EDX
0050B943|.F7F1 DIV ECX
0050B945|.8A4415 C0 MOV AL, BYTE PTR SS:[EBP+EDX-0x40] ;Z
0050B949|.8B55 F8 MOV EDX, DWORD PTR SS:[EBP-0x8]
0050B94C|.3A42 01 CMP AL, BYTE PTR DS:[EDX+0x1]
0050B94F|.0F94C0 SETE AL
0050B952|.83E0 7F AND EAX, 0x7F
0050B955|.0145 EC ADD DWORD PTR SS:[EBP-0x14], EAX
0050B958|.8B45 E4 MOV EAX, DWORD PTR SS:[EBP-0x1C]
0050B95B|.F7EF IMUL EDI
0050B95D|.6BC0 0B IMUL EAX, EAX, 0xB
0050B960|.B9 23000000 MOV ECX, 0x23
0050B965|.33D2 XOR EDX, EDX
0050B967|.F7F1 DIV ECX
0050B969|.8A4415 C0 MOV AL, BYTE PTR SS:[EBP+EDX-0x40] ;这个地址是怎么来的呢?
0050B96D|.8B55 F8 MOV EDX, DWORD PTR SS:[EBP-0x8]
0050B970|.3A42 02 CMP AL, BYTE PTR DS:[EDX+0x2] ;Z
0050B973|.0F94C0 SETE AL
0050B976|.83E0 7F AND EAX, 0x7F
0050B979|.0145 EC ADD DWORD PTR SS:[EBP-0x14], EAX ;这里就11了
0050B97C|.8B45 E4 MOV EAX, DWORD PTR SS:[EBP-0x1C]
0050B97F|.F76D F4 IMUL DWORD PTR SS:[EBP-0xC]
0050B982|.83C0 0D ADD EAX, 0xD
0050B985|.B9 23000000 MOV ECX, 0x23
0050B98A|.33D2 XOR EDX, EDX
0050B98C|.F7F1 DIV ECX
0050B98E|.8A4415 C0 MOV AL, BYTE PTR SS:[EBP+EDX-0x40] ;M
0050B992|.8B55 F8 MOV EDX, DWORD PTR SS:[EBP-0x8]
0050B995|.3A42 03 CMP AL, BYTE PTR DS:[EDX+0x3]
0050B998|.0F94C0 SETE AL
0050B99B|.83E0 7F AND EAX, 0x7F
0050B99E|.0145 EC ADD DWORD PTR SS:[EBP-0x14], EAX
0050B9A1|.8B45 E4 MOV EAX, DWORD PTR SS:[EBP-0x1C]
0050B9A4|.03C0 ADD EAX, EAX
0050B9A6|.03C7 ADD EAX, EDI
0050B9A8|.83E8 03 SUB EAX, 0x3
0050B9AB|.B9 23000000 MOV ECX, 0x23
0050B9B0|.33D2 XOR EDX, EDX
0050B9B2|.F7F1 DIV ECX
0050B9B4|.8A4415 C0 MOV AL, BYTE PTR SS:[EBP+EDX-0x40] ;Y
0050B9B8|.8B55 F8 MOV EDX, DWORD PTR SS:[EBP-0x8]
0050B9BB|.3A42 04 CMP AL, BYTE PTR DS:[EDX+0x4]
0050B9BE|.0F94C0 SETE AL
0050B9C1|.83E0 7F AND EAX, 0x7F
0050B9C4|.0145 EC ADD DWORD PTR SS:[EBP-0x14], EAX
0050B9C7|.8B45 E8 MOV EAX, DWORD PTR SS:[EBP-0x18]
0050B9CA|.8D0440 LEA EAX, DWORD PTR DS:[EAX+EAX*2]
0050B9CD|.83C0 1B ADD EAX, 0x1B
0050B9D0|.B9 23000000 MOV ECX, 0x23
0050B9D5|.33D2 XOR EDX, EDX
0050B9D7|.F7F1 DIV ECX
0050B9D9|.8A4415 C0 MOV AL, BYTE PTR SS:[EBP+EDX-0x40] ;前面的为第一组注册码TZZMY
0050B9DD|.8B55 F8 MOV EDX, DWORD PTR SS:[EBP-0x8] ;C
0050B9E0|.3A42 18 CMP AL, BYTE PTR DS:[EDX+0x18] ;最后一组的第1位
0050B9E3|.0F94C0 SETE AL
0050B9E6|.83E0 7F AND EAX, 0x7F
0050B9E9|.0145 EC ADD DWORD PTR SS:[EBP-0x14], EAX
0050B9EC|.8B45 E8 MOV EAX, DWORD PTR SS:[EBP-0x18]
0050B9EF|.C1E0 03 SHL EAX, 0x3
0050B9F2|.83E8 02 SUB EAX, 0x2
0050B9F5|.B9 23000000 MOV ECX, 0x23
0050B9FA|.33D2 XOR EDX, EDX
0050B9FC|.F7F1 DIV ECX
0050B9FE|.8A4415 C0 MOV AL, BYTE PTR SS:[EBP+EDX-0x40]
0050BA02|.8B55 F8 MOV EDX, DWORD PTR SS:[EBP-0x8] ;8
0050BA05|.3A42 19 CMP AL, BYTE PTR DS:[EDX+0x19] ;最后一组第2位 8
0050BA08|.0F94C0 SETE AL
0050BA0B|.83E0 7F AND EAX, 0x7F
0050BA0E|.0145 EC ADD DWORD PTR SS:[EBP-0x14], EAX
0050BA11|.8B45 E8 MOV EAX, DWORD PTR SS:[EBP-0x18]
0050BA14|.F76D F4 IMUL DWORD PTR SS:[EBP-0xC]
0050BA17|.03C0 ADD EAX, EAX
0050BA19|.8D0440 LEA EAX, DWORD PTR DS:[EAX+EAX*2]
0050BA1C|.B9 23000000 MOV ECX, 0x23
0050BA21|.33D2 XOR EDX, EDX
0050BA23|.F7F1 DIV ECX
0050BA25|.8A4415 C0 MOV AL, BYTE PTR SS:[EBP+EDX-0x40] ;T
0050BA29|.8B55 F8 MOV EDX, DWORD PTR SS:[EBP-0x8]
0050BA2C|.3A42 1A CMP AL, BYTE PTR DS:[EDX+0x1A]
0050BA2F|.0F94C0 SETE AL
0050BA32|.83E0 7F AND EAX, 0x7F
0050BA35|.0145 EC ADD DWORD PTR SS:[EBP-0x14], EAX
0050BA38|.8B45 E8 MOV EAX, DWORD PTR SS:[EBP-0x18]
0050BA3B|.0345 F4 ADD EAX, DWORD PTR SS:[EBP-0xC]
0050BA3E|.83C0 04 ADD EAX, 0x4
0050BA41|.B9 23000000 MOV ECX, 0x23
0050BA46|.33D2 XOR EDX, EDX
0050BA48|.F7F1 DIV ECX
0050BA4A|.8A4415 C0 MOV AL, BYTE PTR SS:[EBP+EDX-0x40] ;8
0050BA4E|.8B55 F8 MOV EDX, DWORD PTR SS:[EBP-0x8]
0050BA51|.3A42 1B CMP AL, BYTE PTR DS:[EDX+0x1B]
0050BA54|.0F94C0 SETE AL
0050BA57|.83E0 7F AND EAX, 0x7F
0050BA5A|.0145 EC ADD DWORD PTR SS:[EBP-0x14], EAX ;最后一个数要算到0x18
0050BA5D|.8B45 E8 MOV EAX, DWORD PTR SS:[EBP-0x18]
0050BA60|.8D0440 LEA EAX, DWORD PTR DS:[EAX+EAX*2]
0050BA63|.83C0 13 ADD EAX, 0x13
0050BA66|.B9 23000000 MOV ECX, 0x23
0050BA6B|.33D2 XOR EDX, EDX
0050BA6D|.F7F1 DIV ECX
0050BA6F|.8A4415 C0 MOV AL, BYTE PTR SS:[EBP+EDX-0x40]
0050BA73|.8B55 F8 MOV EDX, DWORD PTR SS:[EBP-0x8]
0050BA76|.3A42 1C CMP AL, BYTE PTR DS:[EDX+0x1C] ;K
0050BA79|.0F94C0 SETE AL
0050BA7C|.83E0 7F AND EAX, 0x7F ;这里计算出来的数据要比较?
0050BA7F|.0145 EC ADD DWORD PTR SS:[EBP-0x14], EAX
0050BA82|.837D EC 19 CMP DWORD PTR SS:[EBP-0x14], 0x19 ;那就是这里的长度了,判断有几个字母与其是相同的,如果有0x19位相同,则表示成功,否则就不成功
0050BA86|.0F94C3 SETE BL ;那么,其实这就是一个爆破点,你只要把这里的94改95就可以爆破
0050BA89|.33C0 XOR EAX, EAX
0050BA8B|.5A POP EDX
0050BA8C|.59 POP ECX
0050BA8D|.59 POP ECX
0050BA8E|.64:8910 MOV DWORD PTR FS:[EAX], EDX
0050BA91|.68 ABBA5000 PUSH SIM.0050BAAB
0050BA96|>8D45 F8 LEA EAX, DWORD PTR SS:[EBP-0x8]
0050BA99|.BA 02000000 MOV EDX, 0x2
0050BA9E|.E8 598FEFFF CALL SIM.004049FC ;这个CALL基本上不用看
0050BAA3\.C3 RETN
0050BAA4 .^ E9 0B89EFFF JMP SIM.004043B4
0050BAA9 .^ EB EB JMP SHORT SIM.0050BA96
0050BAAB .8BC3 MOV EAX, EBX ;这里就是把上面是否注册成功的标志给了EAX,用EAX来判断是否成功,当然你在这里爆破也是一样的,只要将它置0就可以
0050BAAD .5F POP EDI
0050BAAE .5E POP ESI
0050BAAF .5B POP EBX
0050BAB0 .8BE5 MOV ESP, EBP
0050BAB2 .5D POP EBP
0050BAB3 .C3 RETN
--------------------------------------------------------------------------------
【经验总结】
总结嘛,其实是有点晕的,因为里面有很多个循环,这里我上传我写的算法工具,在把计算过程输出来,供你一起研究
--------------------------------------------------------------------------------
【版权声明】: 本文原创于Crackvip, 转载请注明作者并保持文章的完整, 谢谢!
2015年05月07日 23:44:05
**** Hidden Message *****
沙发是我的。。GGLHY你别抢 永远坐在你腿上!我是来学习的!
感谢分享,慢慢学习 感谢分享,慢慢学习 我现在越来越喜欢你了,哈哈 支持来啦 学习了,谢谢分享 看上去好复杂的算法{:soso_e134:} crackvip 发表于 2015-5-8 16:14
沙发是我的。。GGLHY你别抢
我不抢你的沙发,我只抢妹子{:soso_e120:}
真心赞一个了!