【文章标题】: 学习破解中的一些疑惑
【文章作者】: 天高飞扬
【软件名称】: 精装友情通讯录 V2005 build 11.20
【软件大小】: 1722 KB
【下载地址】: http://www.skycn.com/soft/10355.html
【保护方式】: 注册码
【加壳方式】: 无壳
【编写语言】: Borland Delphi
【使用工具】: OD PEID
【操作平台】: Windows XP2
【作者声明】: 只是通过破解学习汇编语言和算法分析,没有其他目的。失误之处敬请诸位大侠赐教!
----------------------------------------------------------------------
【前言】
我是个新手,一个月前才开始接触破解知识,先前的基础就只有C语言和简单编程的一些知识,对于汇编、解密知识一无所知。一个月前一个偶然的机会在网上搜索到了看雪论坛,进入论坛,就被这里的技术氛围和良好的学习氛围所吸引,这是我见到的最好的一个论坛。于是下定决心向破解挑战,虽然我很笨(但我爱动手实践),引用看雪老师的一句话“计算机水平不高怎么办?没关系,我也不是学计算机的,我自己的专业与电脑不沾边。只要努力学习就能成功。”
接下来就是下载学习教程,设置调试环境,照着教程一边学,一边恶补汇编知识。对于学习教程,我的感觉是不在于多,而在于精,要一个个的学透,肯定就会有收获的。这里我重点只看三个教程:1、crack tutorial 2001 ,2、飘云阁论坛07版破解基础教程.chm,3、OllyDBG入门教程_CaoCong.CHM。以上三个教程在本论坛都有下载。
在学习过程中,我主要是解决入门问题:熟悉OD,了解下断方法(现在只学会了以找字符串参考下断),通过学习破解教程学汇编指令(不懂汇编查资料现学,这样更有针对性),分析验证代码段整体结构,找到算法Call和关键跳。通过一段时间的学习,有了些收获,但是也有很多疑惑(见文章最后,请诸位大侠赐教!)。以下通过自己学习的一个实例来说明。
----------------------------------------------------------------------
【详细过程】
在学习过程中,找到本论坛里有一个“飘云阁论坛07版破解基础教程.chm”教程,在教程调试工具的实例分析中是关于本软件的暴破方法,其中涉及到算法分析部分作者注明不做分析,我就拿来通过破解学习汇编语言和算法分析。
由于刚刚学习加密解密不久,本想好好研究透彻发出来让老大给个精华,但是在分析过程中还有很多不太清楚的地方(虽然算法知道了),而且也产生了不少疑惑,只好来请诸位大侠赐教!
具体分析如下:
1、用PEiD检查是否加壳,确定无壳,且开发环境是Dephi 6.0-7.0
2、运行程序,按下“软件注册”按钮,弹出软件注册对话框,上面显示的是要求输入“定单号”和“注册码”(本软件只与定单号有关),随便输入定单号:123,注册码:tgfy,然后点击“确认注册”按钮,弹出“注册失败,请重新注册!”对话框;什么都不输入,则弹出“注册信息没有填写齐全”对话框。好了,信息收集差不多了,退出软件。
3、用OD载入可执行程序,用“超级字串参考+”查找ASCII,输入“注册”查找相关字串,结果找到了“注册信息没有填写齐全”、“注册失败,请重新注册!”、“注册码正确,感谢你的注册!”等相关内容,我在“注册失败,请重新注册!”双击一下,程序进入了这里:
00515448 |> \B8 B4555100 MOV EAX,jzyq.005155B4 ; 注册失败,请重新注册!
0051544D |. E8 4E69F2FF CALL jzyq.0043BDA0 ; 注册失败,请重新注册!
00515452 |. 33D2 XOR EDX,EDX
00515454 |. 8B83 10030000 MOV EAX,DWORD PTR DS:[EBX+310]
0051545A |. E8 7DD7F2FF CALL jzyq.00442BDC
0051545F |. 33D2 XOR EDX,EDX
00515461 |. 8B83 1C030000 MOV EAX,DWORD PTR DS:[EBX+31C]
00515467 |. E8 70D7F2FF CALL jzyq.00442BDC
0051546C |> 33C0 XOR EAX,EAX
(以下省略)
有一红线箭头指向以上代码第一行,往上下翻翻,外面黑粗线包括的代码段应该就是该软件的注册部分,于是往上翻到黑线的开始部分,在00515264处下断,按F9,运行程序,按下“软件注册”按钮,弹出软件注册对话框,输入定单号:123,注册码:tgfy,程序就断在这里:
00515264 /. 55 PUSH EBP ; 在这里下断,F9运行程序,输入注册后程序断在这里
00515265 |. 8BEC MOV EBP,ESP
00515267 |. B9 17000000 MOV ECX,17 ; ECX=17(十六进制数,相当于十进制数23)
0051526C |> 6A 00 /PUSH 0
0051526E |. 6A 00 |PUSH 0
00515270 |. 49 |DEC ECX ; 目的操作数(ECX)减1
00515271 |.^ 75 F9 \JNZ SHORT jzyq.0051526C ; 在此循环23次
00515273 |. 53 PUSH EBX
00515274 |. 56 PUSH ESI
00515275 |. 8BD8 MOV EBX,EAX
00515277 |. 33C0 XOR EAX,EAX ; EAX清0
00515279 |. 55 PUSH EBP
0051527A |. 68 E9545100 PUSH jzyq.005154E9
0051527F |. 64:FF30 PUSH DWORD PTR FS:[EAX]
00515282 |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
00515285 |. 68 80000000 PUSH 80 ; /BufSize = 80 (128.)
0051528A |. 8D85 7BFFFFFF LEA EAX,DWORD PTR SS:[EBP-85] ; |
00515290 |. 50 PUSH EAX ; |Buffer
00515291 |. E8 B220EFFF CALL <JMP.&kernel32.GetSystemDirectoryA> ; \GetSystemDirectoryA
00515296 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
00515299 |. 8D95 7BFFFFFF LEA EDX,DWORD PTR SS:[EBP-85] ; 系统路径C:\WINDOWS\system32送EDX
0051529F |. B9 81000000 MOV ECX,81
005152A4 |. E8 DBF9EEFF CALL jzyq.00404C84
005152A9 |. 8D95 74FFFFFF LEA EDX,DWORD PTR SS:[EBP-8C]
005152AF |. 8B83 1C030000 MOV EAX,DWORD PTR DS:[EBX+31C]
005152B5 |. E8 F2D8F2FF CALL jzyq.00442BAC ; 取输入注册码(tgfy)长度放EAX中(EAX=4)
005152BA |. 83BD 74FFFFFF>CMP DWORD PTR SS:[EBP-8C],0 ; 注册码长度和0比较
005152C1 |. 74 1A JE SHORT jzyq.005152DD ; 和0相等则跳向注册信息没有填写齐全
005152C3 |. 8D95 70FFFFFF LEA EDX,DWORD PTR SS:[EBP-90]
005152C9 |. 8B83 10030000 MOV EAX,DWORD PTR DS:[EBX+310]
005152CF |. E8 D8D8F2FF CALL jzyq.00442BAC ; 取定单号(123)长度放EAX中(EAX=3)
005152D4 |. 83BD 70FFFFFF>CMP DWORD PTR SS:[EBP-90],0 ; 定单号长度和0比较
005152DB |. 75 0F JNZ SHORT jzyq.005152EC ; 不相等则跳(只要注册信息一项没填则指向以下)
005152DD |> B8 00555100 MOV EAX,jzyq.00515500 ; 注册信息没有填写齐全
005152E2 |. E8 B96AF2FF CALL jzyq.0043BDA0 ; 弹出注册信息没有填写齐全对话框
005152E7 |. E9 80010000 JMP jzyq.0051546C
005152EC |> 8D95 6CFFFFFF LEA EDX,DWORD PTR SS:[EBP-94]
005152F2 |. 8B83 1C030000 MOV EAX,DWORD PTR DS:[EBX+31C]
005152F8 |. E8 AFD8F2FF CALL jzyq.00442BAC ; 注册码长度送EAX
005152FD |. 8B85 6CFFFFFF MOV EAX,DWORD PTR SS:[EBP-94]
00515303 |. 50 PUSH EAX
00515304 |. 8D95 60FFFFFF LEA EDX,DWORD PTR SS:[EBP-A0]
0051530A |. 8B83 10030000 MOV EAX,DWORD PTR DS:[EBX+310]
00515310 |. E8 97D8F2FF CALL jzyq.00442BAC ; 定单号长度送EAX
00515315 |. 8B85 60FFFFFF MOV EAX,DWORD PTR SS:[EBP-A0]
0051531B |. E8 9042EFFF CALL jzyq.004095B0 ; 定单号十进制(123)转换成十六进制(7B)送EAX
00515320 |. B9 40080000 MOV ECX,840
00515325 |. 99 CDQ
00515326 |. F7F9 IDIV ECX
00515328 |. 8BC2 MOV EAX,EDX
0051532A |. 8D95 64FFFFFF LEA EDX,DWORD PTR SS:[EBP-9C]
00515330 |. E8 1742EFFF CALL jzyq.0040954C
00515335 |. FFB5 64FFFFFF PUSH DWORD PTR SS:[EBP-9C]
0051533B |. 8D95 54FFFFFF LEA EDX,DWORD PTR SS:[EBP-AC]
00515341 |. 8B83 10030000 MOV EAX,DWORD PTR DS:[EBX+310]
00515347 |. E8 60D8F2FF CALL jzyq.00442BAC
0051534C |. 8B85 54FFFFFF MOV EAX,DWORD PTR SS:[EBP-AC]
00515352 |. E8 5942EFFF CALL jzyq.004095B0 ; 定单号十进制(123)转换成十六进制(7B)送EAX
00515357 |. 8D95 58FFFFFF LEA EDX,DWORD PTR SS:[EBP-A8]
0051535D |. E8 C6FCFFFF CALL jzyq.00515028 ; 算法一:通过帐单号算出一个数值(F7跟进)
00515362 |. 8B85 58FFFFFF MOV EAX,DWORD PTR SS:[EBP-A8] ; 73050654
00515368 |. E8 4342EFFF CALL jzyq.004095B0
0051536D |. 8D95 5CFFFFFF LEA EDX,DWORD PTR SS:[EBP-A4]
00515373 |. E8 90FDFFFF CALL jzyq.00515108 ; 算法二:将算法一处结果再算出另一个数值(F7跟进)
00515378 |. FFB5 5CFFFFFF PUSH DWORD PTR SS:[EBP-A4] ; 36k5w126~f3641送EDX
0051537E |. 68 20555100 PUSH jzyq.00515520 ; 1
00515383 |. 8D85 68FFFFFF LEA EAX,DWORD PTR SS:[EBP-98]
00515389 |. BA 03000000 MOV EDX,3
0051538E |. E8 01FAEEFF CALL jzyq.00404D94 ; 算法三:注册码=输入定单号+算法二结果+1(F7跟进)
00515393 |. 8B95 68FFFFFF MOV EDX,DWORD PTR SS:[EBP-98] ; 注册码12336k5w126~f36411送EDX
00515399 |. 58 POP EAX ; 弹出试验注册码(tgfy)
0051539A |. E8 79FAEEFF CALL jzyq.00404E18 ; 比较真假注册码
0051539F |. 0F85 A3000000 JNZ jzyq.00515448 ; 这里跳走则完蛋
005153A5 |. B8 2C555100 MOV EAX,jzyq.0051552C ; 注册码正确,感谢你的注册!
005153AA |. E8 F169F2FF CALL jzyq.0043BDA0
005153AF |. A1 109C5300 MOV EAX,DWORD PTR DS:[539C10]
005153B4 |. 8B00 MOV EAX,DWORD PTR DS:[EAX] >>以下部分不作分析了
005153B6 |. 8B80 C8040000 MOV EAX,DWORD PTR DS:[EAX+4C8]
005153BC |. 8B80 08020000 MOV EAX,DWORD PTR DS:[EAX+208]
005153C2 |. 33D2 XOR EDX,EDX
005153C4 |. E8 A79BF5FF CALL jzyq.0046EF70
005153C9 |. BA 50555100 MOV EDX,jzyq.00515550 ; 精装友情-软件已注册
005153CE |. E8 F99AF5FF CALL jzyq.0046EECC
005153D3 |. 8D85 50FFFFFF LEA EAX,DWORD PTR SS:[EBP-B0]
005153D9 |. B9 6C555100 MOV ECX,jzyq.0051556C ; \hdwl21.dll
005153DE |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
005153E1 |. E8 3AF9EEFF CALL jzyq.00404D20
005153E6 |. 8B8D 50FFFFFF MOV ECX,DWORD PTR SS:[EBP-B0]
005153EC |. B2 01 MOV DL,1
005153EE |. A1 8C424600 MOV EAX,DWORD PTR DS:[46428C]
005153F3 |. E8 44EFF4FF CALL jzyq.0046433C
005153F8 |. 8BF0 MOV ESI,EAX
005153FA |. 8D95 4CFFFFFF LEA EDX,DWORD PTR SS:[EBP-B4]
00515400 |. 8B83 10030000 MOV EAX,DWORD PTR DS:[EBX+310]
00515406 |. E8 A1D7F2FF CALL jzyq.00442BAC
0051540B |. 8B85 4CFFFFFF MOV EAX,DWORD PTR SS:[EBP-B4]
00515411 |. 50 PUSH EAX
00515412 |. B9 80555100 MOV ECX,jzyq.00515580 ; setet567
00515417 |. BA 94555100 MOV EDX,jzyq.00515594 ; sym
0051541C |. 8BC6 MOV EAX,ESI
0051541E |. 8B18 MOV EBX,DWORD PTR DS:[EAX]
00515420 |. FF53 04 CALL DWORD PTR DS:[EBX+4]
00515423 |. 8D85 48FFFFFF LEA EAX,DWORD PTR SS:[EBP-B8]
00515429 |. B9 A0555100 MOV ECX,jzyq.005155A0 ; \hdw121.dll
0051542E |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
00515431 |. E8 EAF8EEFF CALL jzyq.00404D20
00515436 |. 8B85 48FFFFFF MOV EAX,DWORD PTR SS:[EBP-B8]
0051543C |. BA 02000000 MOV EDX,2
00515441 |. E8 9644EFFF CALL jzyq.004098DC
00515446 |. EB 24 JMP SHORT jzyq.0051546C
00515448 |> B8 B4555100 MOV EAX,jzyq.005155B4 ; 注册失败,请重新注册!
0051544D |. E8 4E69F2FF CALL jzyq.0043BDA0 ; 注册失败,请重新注册!
00515452 |. 33D2 XOR EDX,EDX
00515454 |. 8B83 10030000 MOV EAX,DWORD PTR DS:[EBX+310]
0051545A |. E8 7DD7F2FF CALL jzyq.00442BDC
0051545F |. 33D2 XOR EDX,EDX
00515461 |. 8B83 1C030000 MOV EAX,DWORD PTR DS:[EBX+31C]
00515467 |. E8 70D7F2FF CALL jzyq.00442BDC
0051546C |> 33C0 XOR EAX,EAX
0051546E |. 5A POP EDX
0051546F |. 59 POP ECX
00515470 |. 59 POP ECX
00515471 |. 64:8910 MOV DWORD PTR FS:[EAX],EDX
00515474 |. 68 F0545100 PUSH jzyq.005154F0
00515479 |> 8D85 48FFFFFF LEA EAX,DWORD PTR SS:[EBP-B8]
0051547F |. E8 98F5EEFF CALL jzyq.00404A1C
00515484 |. 8D85 4CFFFFFF LEA EAX,DWORD PTR SS:[EBP-B4]
0051548A |. E8 8DF5EEFF CALL jzyq.00404A1C
0051548F |. 8D85 50FFFFFF LEA EAX,DWORD PTR SS:[EBP-B0]
00515495 |. E8 82F5EEFF CALL jzyq.00404A1C
0051549A |. 8D85 54FFFFFF LEA EAX,DWORD PTR SS:[EBP-AC]
005154A0 |. E8 77F5EEFF CALL jzyq.00404A1C
005154A5 |. 8D85 58FFFFFF LEA EAX,DWORD PTR SS:[EBP-A8]
005154AB |. BA 02000000 MOV EDX,2
005154B0 |. E8 8BF5EEFF CALL jzyq.00404A40
005154B5 |. 8D85 60FFFFFF LEA EAX,DWORD PTR SS:[EBP-A0]
005154BB |. E8 5CF5EEFF CALL jzyq.00404A1C
005154C0 |. 8D85 64FFFFFF LEA EAX,DWORD PTR SS:[EBP-9C]
005154C6 |. BA 02000000 MOV EDX,2
005154CB |. E8 70F5EEFF CALL jzyq.00404A40
005154D0 |. 8D85 6CFFFFFF LEA EAX,DWORD PTR SS:[EBP-94]
005154D6 |. BA 03000000 MOV EDX,3
005154DB |> E8 60F5EEFF CALL jzyq.00404A40
005154E0 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
005154E3 |. E8 34F5EEFF CALL jzyq.00404A1C
005154E8 \. C3 RET
算法一处Call:
00515028 /$ 55 PUSH EBP ; 通过帐单号算出一个数值开始
00515029 |. 8BEC MOV EBP,ESP
0051502B |. 33C9 XOR ECX,ECX ; 清0
0051502D |. 51 PUSH ECX
0051502E |. 51 PUSH ECX
0051502F |. 51 PUSH ECX
00515030 |. 51 PUSH ECX
00515031 |. 53 PUSH EBX
00515032 |. 56 PUSH ESI
00515033 |. 8BF2 MOV ESI,EDX
00515035 |. 8BD8 MOV EBX,EAX
00515037 |. 33C0 XOR EAX,EAX
00515039 |. 55 PUSH EBP
0051503A |. 68 F8505100 PUSH jzyq.005150F8
0051503F |. 64:FF30 PUSH DWORD PTR FS:[EAX]
00515042 |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
00515045 |. 81F3 F1250B00 XOR EBX,0B25F1 ; 123的十六进制数7B与B25f1异或
0051504B |. 8BC3 MOV EAX,EBX ; 异或结果存入EAX=B258A(十进制数为730506)
0051504D |. 33D2 XOR EDX,EDX
0051504F |. 52 PUSH EDX ; /Arg2 => 00000000
00515050 |. 50 PUSH EAX ; |Arg1
00515051 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4] ; |
00515054 |. E8 2345EFFF CALL jzyq.0040957C ; \将异或的十六进制数转换成十进制数
00515059 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 将730506存入EAX
0051505C |. 0FB600 MOVZX EAX,BYTE PTR DS:[EAX] ; 取第一位7(ASCII为37)
0051505F |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
00515062 |. 0FB652 01 MOVZX EDX,BYTE PTR DS:[EDX+1] ; 取第二位3(ASCII为33)
00515066 |. 03C2 ADD EAX,EDX ; 第一位+第二位的ASCII相加存入EAX(6A)
00515068 |. B9 05000000 MOV ECX,5
0051506D |. 99 CDQ ; 双字节转换成四字节(该指令的隐含操作数为EDX和EAX,指令的功能是用EAX的符号位填充EDX)
0051506E |. F7F9 IDIV ECX ; 1、2位相加除5取模送DL(显式操作数ECX去除隐含操作数EAX)
00515070 |. 80C2 34 ADD DL,34 ; 以上EAX(6A)除ECX(5)商15送EAX,余1送EDX
00515073 |. 8855 F8 MOV BYTE PTR SS:[EBP-8],DL ; DL=1+34=35('5')
00515076 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00515079 |. 0FB640 02 MOVZX EAX,BYTE PTR DS:[EAX+2] ; 取第三位0(ASCII为30)
0051507D |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
00515080 |. 0FB652 03 MOVZX EDX,BYTE PTR DS:[EDX+3] ; 取第四位5(ASCII为35)
00515084 |. 03C2 ADD EAX,EDX ; 第三位+第四位的ASCII相加存入EAX(65)
00515086 |. B9 05000000 MOV ECX,5
0051508B |. 99 CDQ
0051508C |. F7F9 IDIV ECX
0051508E |. 8BDA MOV EBX,EDX ; EDX=1送EBX(具体同上分析)
00515090 |. 80C3 33 ADD BL,33
00515093 |. 885D F9 MOV BYTE PTR SS:[EBP-7],BL ; BL=1+33=34('4')
00515096 |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
00515099 |. 8A55 F8 MOV DL,BYTE PTR SS:[EBP-8]
0051509C |. E8 5BFBEEFF CALL jzyq.00404BFC
005150A1 |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
005150A4 |. 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]
005150A7 |. B9 1B000000 MOV ECX,1B
005150AC |. E8 03FFEEFF CALL jzyq.00404FB4
005150B1 |. 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
005150B4 |. 8BD3 MOV EDX,EBX
005150B6 |. E8 41FBEEFF CALL jzyq.00404BFC
005150BB |. 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
005150BE |. 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]
005150C1 |. B9 19000000 MOV ECX,19
005150C6 |. E8 E9FEEEFF CALL jzyq.00404FB4
005150CB |. 8BC6 MOV EAX,ESI
005150CD |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4] ; 73050654(730506与54相连得)
005150D0 |. E8 9BF9EEFF CALL jzyq.00404A70
005150D5 |. 33C0 XOR EAX,EAX
005150D7 |. 5A POP EDX
005150D8 |. 59 POP ECX
005150D9 |. 59 POP ECX
005150DA |. 64:8910 MOV DWORD PTR FS:[EAX],EDX
005150DD |. 68 FF505100 PUSH jzyq.005150FF
005150E2 |> 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
005150E5 |. BA 02000000 MOV EDX,2
005150EA |. E8 51F9EEFF CALL jzyq.00404A40
005150EF |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
005150F2 |. E8 25F9EEFF CALL jzyq.00404A1C
005150F7 \. C3 RET
算法二处Call:
00515108 /$ 55 PUSH EBP ; 算法二处开始
00515109 |. 8BEC MOV EBP,ESP
0051510B |. 33C9 XOR ECX,ECX
0051510D |. 51 PUSH ECX
0051510E |. 51 PUSH ECX
0051510F |. 51 PUSH ECX
00515110 |. 51 PUSH ECX
00515111 |. 51 PUSH ECX
00515112 |. 51 PUSH ECX
00515113 |. 53 PUSH EBX
00515114 |. 56 PUSH ESI
00515115 |. 8BF2 MOV ESI,EDX
00515117 |. 8BD8 MOV EBX,EAX
00515119 |. 33C0 XOR EAX,EAX
0051511B |. 55 PUSH EBP
0051511C |. 68 54525100 PUSH jzyq.00515254
00515121 |. 64:FF30 PUSH DWORD PTR FS:[EAX]
00515124 |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
00515127 |. 81F3 8776FBDD XOR EBX,DDFB7687 ; 算法一处值45AAA1E(73050654)与DDFB7687(3724244600)异或
0051512D |. 8BC3 MOV EAX,EBX ; D9A1DC99(3651263641)送EAX
0051512F |. 33D2 XOR EDX,EDX
00515131 |. 52 PUSH EDX ; /Arg2 => 00000000
00515132 |. 50 PUSH EAX ; |Arg1
00515133 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4] ; |
00515136 |. E8 4144EFFF CALL jzyq.0040957C ; \将上述异或值进行十进制转换
0051513B |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 转换后值3651263641送EAX
0051513E |. 0FB600 MOVZX EAX,BYTE PTR DS:[EAX] ; 取第一位3(ASCII码33)
00515141 |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
00515144 |. 0FB652 01 MOVZX EDX,BYTE PTR DS:[EDX+1] ; 取第二位6(ASCII码36)
00515148 |. 03C2 ADD EAX,EDX ; 69
0051514A |. B9 05000000 MOV ECX,5
0051514F |. 99 CDQ
00515150 |. F7F9 IDIV ECX ; 69/5 余数送DL=0(十六进制)
00515152 |. 80C2 66 ADD DL,66 ; 0+66=66送DL
00515155 |. 8855 F8 MOV BYTE PTR SS:[EBP-8],DL ; DL=66('f')
00515158 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0051515B |. 0FB640 02 MOVZX EAX,BYTE PTR DS:[EAX+2] ; 取第三位5(ASCII码35)
0051515F |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
00515162 |. 0FB652 03 MOVZX EDX,BYTE PTR DS:[EDX+3] ; 取第四位1(ASCII码31)
00515166 |. 03C2 ADD EAX,EDX ; 66
00515168 |. B9 05000000 MOV ECX,5
0051516D |. 99 CDQ
0051516E |. F7F9 IDIV ECX ; 66/5 余数送DL=2(十六进制)
00515170 |. 80C2 75 ADD DL,75 ; 2+75
00515173 |. 8855 F9 MOV BYTE PTR SS:[EBP-7],DL ; w
00515176 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00515179 |. 0FB640 04 MOVZX EAX,BYTE PTR DS:[EAX+4] ; 取第五位2(ASCII码32)
0051517D |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
00515180 |. 0FB652 05 MOVZX EDX,BYTE PTR DS:[EDX+5] ; 取第六位6(ASCII码36)
00515184 |. 03C2 ADD EAX,EDX ; 68
00515186 |. B9 05000000 MOV ECX,5
0051518B |. 99 CDQ
0051518C |. F7F9 IDIV ECX ; 68/5 余数送DL=4(十六进制)
0051518E |. 80C2 7A ADD DL,7A ; 4+7A
00515191 |. 8855 FA MOV BYTE PTR SS:[EBP-6],DL ; ~
00515194 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00515197 |. 0FB640 06 MOVZX EAX,BYTE PTR DS:[EAX+6] ; 取第七位3(ASCII码33)
0051519B |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
0051519E |. 0FB652 07 MOVZX EDX,BYTE PTR DS:[EDX+7] ; 取第八位6(ASCII码36)
005151A2 |. 03C2 ADD EAX,EDX ; EAX=69
005151A4 |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
005151A7 |. 0FB652 08 MOVZX EDX,BYTE PTR DS:[EDX+8] ; 取第九位4(ASCII码34)
005151AB |. 03C2 ADD EAX,EDX ; EAX=69+34
005151AD |. B9 05000000 MOV ECX,5
005151B2 |. 99 CDQ
005151B3 |. F7F9 IDIV ECX ; 9D/5 余数送DL=2(十六进制)
005151B5 |. 80C2 69 ADD DL,69 ; 2+69
005151B8 |. 8855 FB MOV BYTE PTR SS:[EBP-5],DL ; k
005151BB |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
005151BE |. 8A55 F8 MOV DL,BYTE PTR SS:[EBP-8] f
005151C1 |. E8 36FAEEFF CALL jzyq.00404BFC
005151C6 |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
005151C9 |. 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]
005151CC |. B9 07000000 MOV ECX,7 7
005151D1 |. E8 DEFDEEFF CALL jzyq.00404FB4 ; f3641
005151D6 |. 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
005151D9 |. 8A55 FB MOV DL,BYTE PTR SS:[EBP-5] ; k
005151DC |. E8 1BFAEEFF CALL jzyq.00404BFC
005151E1 |. 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
005151E4 |. 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]
005151E7 |. B9 03000000 MOV ECX,3 3
005151EC |. E8 C3FDEEFF CALL jzyq.00404FB4 ; k5126f3641
005151F1 |. 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14]
005151F4 |. 8A55 F9 MOV DL,BYTE PTR SS:[EBP-7] ; w
005151F7 |. E8 00FAEEFF CALL jzyq.00404BFC
005151FC |. 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14]
005151FF |. 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]
00515202 |. B9 05000000 MOV ECX,5 5
00515207 |. E8 A8FDEEFF CALL jzyq.00404FB4 ; w126f3641
0051520C |. 8D45 E8 LEA EAX,DWORD PTR SS:[EBP-18]
0051520F |. 8A55 FA MOV DL,BYTE PTR SS:[EBP-6] ; ~
00515212 |. E8 E5F9EEFF CALL jzyq.00404BFC
00515217 |. 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
0051521A |. 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]
0051521D |. B9 09000000 MOV ECX,9 9
00515222 |. E8 8DFDEEFF CALL jzyq.00404FB4 ; ~f3641
00515227 |. 8BC6 MOV EAX,ESI
00515229 |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4] ; 36k5w126~f3641
0051522C |. E8 3FF8EEFF CALL jzyq.00404A70
00515231 |. 33C0 XOR EAX,EAX
00515233 |. 5A POP EDX
00515234 |. 59 POP ECX
00515235 |. 59 POP ECX
00515236 |. 64:8910 MOV DWORD PTR FS:[EAX],EDX
00515239 |. 68 5B525100 PUSH jzyq.0051525B
0051523E |> 8D45 E8 LEA EAX,DWORD PTR SS:[EBP-18]
00515241 |. BA 04000000 MOV EDX,4
00515246 |. E8 F5F7EEFF CALL jzyq.00404A40
0051524B |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
0051524E |. E8 C9F7EEFF CALL jzyq.00404A1C
00515253 \. C3 RET
00515254 .^ E9 67F0EEFF JMP jzyq.004042C0
00515259 .^ EB E3 JMP SHORT jzyq.0051523E
0051525B . 5E POP ESI
0051525C . 5B POP EBX
0051525D . 8BE5 MOV ESP,EBP
0051525F . 5D POP EBP
00515260 . C3 RET
算法三处Call:
00404D94 $ 53 PUSH EBX ; 输入定单号+算法二结果+1
00404D95 . 56 PUSH ESI
00404D96 . 57 PUSH EDI
00404D97 . 52 PUSH EDX
00404D98 . 50 PUSH EAX
00404D99 . 89D3 MOV EBX,EDX
00404D9B . 31FF XOR EDI,EDI
00404D9D . 8B4C94 14 MOV ECX,DWORD PTR SS:[ESP+EDX*4+14] ;
00404DA1 . 85C9 TEST ECX,ECX
00404DA3 . 74 06 JE SHORT jzyq.00404DAB
00404DA5 . 3908 CMP DWORD PTR DS:[EAX],ECX
00404DA7 . 75 02 JNZ SHORT jzyq.00404DAB
00404DA9 . 89C7 MOV EDI,EAX
00404DAB > 31C0 XOR EAX,EAX
00404DAD > 8B4C94 14 MOV ECX,DWORD PTR SS:[ESP+EDX*4+14] ;
00404DB1 . 85C9 TEST ECX,ECX
00404DB3 . 74 09 JE SHORT jzyq.00404DBE
00404DB5 . 0341 FC ADD EAX,DWORD PTR DS:[ECX-4] ;
00404DB8 . 39CF CMP EDI,ECX
00404DBA . 75 02 JNZ SHORT jzyq.00404DBE
00404DBC . 31FF XOR EDI,EDI
00404DBE > 4A DEC EDX
00404DBF .^ 75 EC JNZ SHORT jzyq.00404DAD
00404DC1 . 85FF TEST EDI,EDI
00404DC3 . 74 14 JE SHORT jzyq.00404DD9
00404DC5 . 89C2 MOV EDX,EAX
00404DC7 . 89F8 MOV EAX,EDI
00404DC9 . 8B37 MOV ESI,DWORD PTR DS:[EDI]
00404DCB . 8B76 FC MOV ESI,DWORD PTR DS:[ESI-4]
00404DCE . E8 85020000 CALL jzyq.00405058
00404DD3 . 57 PUSH EDI
00404DD4 . 0337 ADD ESI,DWORD PTR DS:[EDI]
00404DD6 . 4B DEC EBX
00404DD7 . EB 08 JMP SHORT jzyq.00404DE1
00404DD9 > E8 02FDFFFF CALL jzyq.00404AE0
00404DDE . 50 PUSH EAX
00404DDF . 89C6 MOV ESI,EAX
00404DE1 > 8B449C 18 MOV EAX,DWORD PTR SS:[ESP+EBX*4+18]
00404DE5 . 89F2 MOV EDX,ESI
00404DE7 . 85C0 TEST EAX,EAX
00404DE9 . 74 0A JE SHORT jzyq.00404DF5
00404DEB . 8B48 FC MOV ECX,DWORD PTR DS:[EAX-4]
00404DEE . 01CE ADD ESI,ECX
00404DF0 . E8 0FDCFFFF CALL jzyq.00402A04
00404DF5 > 4B DEC EBX
00404DF6 .^ 75 E9 JNZ SHORT jzyq.00404DE1
00404DF8 . 5A POP EDX
00404DF9 . 58 POP EAX
00404DFA . 85FF TEST EDI,EDI
00404DFC . 75 0C JNZ SHORT jzyq.00404E0A
00404DFE . 85D2 TEST EDX,EDX
00404E00 . 74 03 JE SHORT jzyq.00404E05
00404E02 . FF4A F8 DEC DWORD PTR DS:[EDX-8]
00404E05 > E8 66FCFFFF CALL jzyq.00404A70
00404E0A > 5A POP EDX
00404E0B . 5F POP EDI
00404E0C . 5E POP ESI
00404E0D . 5B POP EBX
00404E0E . 58 POP EAX
00404E0F . 8D2494 LEA ESP,DWORD PTR SS:[ESP+EDX*4]
00404E12 . FFE0 JMP EAX
00404E14 . C3 RET
--------------------------------------------------------------------------------
【小结】
在准备发贴过程中,无意见看见本文算法竟然与千里之外的“【原创】超级百科知识算法分析”(如有雷同,纯属巧合这句话却应验到我这里了,汗)十分一样,呵呵,有缘啊:)
我输入的定单码:123 ,注册码:tgfy
算法一:1、将定单码123的十六进制数7B与固定值B25f1异或,转化为十进制数为730506。
2、取它的第1和2位字符的ASIIC相加除5,模加34 转化为字符‘5’;
3、取它的第3和4位字符的ASIIC相加除5,模加33 转化为字符‘4’;
4、730506与54相连得73050654。
算法二:1、算法一处值45AAA1E(73050654)与固定值DDFB7687异或D9A1DC99,转化为十进制数3651263641。
2、取它的第1和2位字符的ASIIC相加除5,模加66 转化为字符‘f’;
3、取它的第3和4位字符的ASIIC相加除5,模加75 转化为字符‘w’;
4、取它的第1和2位字符的ASIIC相加除5,模加7a 转化为字符‘~’;
5、取它的第3和4位字符的ASIIC相加除5,模加69 转化为字符‘k’;
6、从十进制数365126 3641第7位开始取后面所有数,将字符‘f’加入前面得f3641并与前面6位数连接成365126f3641;
7、从十进制数36 5126f3641第3位开始取后面所有数,将字符‘k’加入前面得k5126f3641并与前面2位数连接成36k5126f3641;
8、从十进制数36k5 126f3641第5位开始取后面所有数,将字符‘w’加入前面得w126f3641并与前面4位数连接成36k5w126f3641;
9、从十进制数36k5w126 f3641第9位开始取后面所有数,将字符‘~’加入前面得~f3641并与前面8位数连接成36k5w126~f3641;
10、字符串36k5w126~f3641即为算法二的结果。
算法三:真正注册码=输入定单号+算法二结果+1(即123+36k5w126~f3641+1=12336k5w126~f36411)
算法三处的代码没有搞清楚,只知道上面的公式。另外,如果定单号输入的0是多于1个,最终只取一个。
----------------------------------------------------------------------
【疑惑】
1、关于Call的问题:
根据C语言中编写调用函数知识,一般每个调用函数都应有相应的功能,而在汇编调试程序中,Call过程调用太多,真正有用的Call不是太多,那么为什么会有很多无用的Call,怎样判断无用的Call(对于新手来说,太多的Call来Call去的,有时把头都搞昏了)。
2、关于代码段中频繁出现的一些重复调用:
有时可以看见很多输入的用户名、试验码重复地出现在寄存器或信息窗口,这种情况不知有什么用处?
3、关于OD各窗口的问题
在调试时,是否应该根据指令和寄存器或信息窗口来综合分析指令的功能和作用,对于寄存器中的内容变换有无必要画个类似汇编教程所讲内存读取示意图,我现在对MOV ECX,DWORD PTR SS:[ESP+EDX*4+14] 、MOV ESI,DWORD PTR DS:[ESI-4]等类似指令很头痛,不知道它到底是取地址还是取字符。
以上是我的真实感受,如让高手见笑,还请多多指教!先谢了
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!