-
-
[原创]算法分析入门之--告别爆破[crackme]
-
发表于: 2005-1-29 11:49 5455
-
不要以为你一次就可以搞明白 就是搞十次 二十次 你一定要彻底搞明白才能有大收获! 切记!
附件下载:http://yjtv.900y.com/crackme1.rar
课后练习:http://yjtv.900y.com/Key-Crackme2.rar
当你仔细 用心 耐心 的看完此文 之后 并按照注释做 你就可以入门算法了 (不会吧 看完此文就能入门算法 ^_^ 那不是很吓人) 就是就是 太危险了 看来过两天我可能会删除此贴 *&^%%$$#$ !
建议动态分析算法 动态跟踪分析看教程 也不负我熬夜写的这篇文章 希望你看此文之后有进步 步入算法圣殿 步入高手行列 回头再回个贴 那我可就傻笑了!(他们说的 呵呵 ^_^ 高级算法再慢慢进步吧 先进门了再说) 文章我会继续写 大家共同进步!
要想分析循环 不但要能看懂汇编代码 能看懂汇编代码分析不了算法的人大有人在 关键要在于 知道它的操作数(就是操作对象)的值是从哪来的 有的直接你输入的用户名、注册码或用户名注册码位数 当然还有常数分析是否是常数最直接的方法就是改变用户名和注册码
00401139 $ 6A 32 PUSH 32 ; /Count = 32 (50.)
0040113B . 68 F3204000 PUSH Crackme1.004020F3 ; |Buffer = Crackme1.004020F3
00401140 . 68 C8000000 PUSH 0C8 ; |ControlID = C8 (200.)
00401145 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
00401148 . E8 DE000000 CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
0040114D . 83F8 00 CMP EAX,0 ;
00401150 . 0F84 99000000 JE Crackme1.004011EF ; 是否输入注册码 上面有一个eax 看一下是7 与0比较 也就是你注册名的位数与0比较 也就是是否输入了用户名呵呵 你不会不记得你输入了几位吧! 你输入的注册码位数可一定要每次都记得! 一看都要知道 的养成习惯!
00401156 . 83F8 04 CMP EAX,4 ; 是否大于4
00401159 . 0F82 90000000 JB Crackme1.004011EF ; 和上面的跳转地址一样 你不会不知道 它是让你回老家的吧! ^_^
0040115F . 33C9 XOR ECX,ECX ; ECX 清零 xor 后面跟两个相同的操作数 以后这样的指令都是这样的功能! 要记得
00401161 . 33DB XOR EBX,EBX ; 同上
00401163 . 33F6 XOR ESI,ESI ; 同上 像这样清零一般是高级语言的变量赋初始 在汇编中是这样实现 下面就开始要到用这三个变量(呵呵我猜的^_^)
00401165 . 8945 FC MOV DWORD PTR SS:[EBP-4],EAX ; 还记得 eax 是多少吗 不是吧 不记得了! 狂晕 麻烦你再看一下寄存器 要么看上面我的说明! 顺便告诉你 现在往下看汇编代码 找找EBP-4 好象有几个吧 从现在可要记得注册码位数 已经给ebp-4了 它一出现EBP-4 你的脑海就出现你输入的位数 比如我的 7
00401168 > 0FBE81 F32040>MOVSX EAX,BYTE PTR DS:[ECX+4020F3] ; 像这样 DS:[ECX+4020F3] 的式子 一定要知道大都是取一位用户名、注册码或密码表(密码表是什么? 狂晕 我表达能力欠佳 说了你也不一定明白 你问表达能力好点的) 想知道它到底取什么吗? 呵呵教你一种方法 用 d 4020f3 看看 为什么不d ecx 呢 当然我也d 了 可
它是 00000000呀 有用吗?当然有用 好了 d 4020f3之后 看到什么? 看到你输入的注册名了吧 !知道这句是干什么的了吗?还不知道 那你看看OD下面的提示吧 是不是有你输入用户名的第一位呀!
0040116F . 83F8 20 CMP EAX,20 ;
00401172 . 74 07 JE SHORT Crackme1.0040117B ; 上面一个比较20 也就是用户名大于20的话 20位后就不参加运算了
00401174 . 6BC0 04 IMUL EAX,EAX,4 ; EAX的值是在40116f处赋值的 可以看到是依次取的用户名的ASC码 像这样的句子破解过程中可能会经常用到 要多分析两遍 彻底搞明白 这里把上面取的ASC码*4 给EAX
00401177 . 03D8 ADD EBX,EAX ; 累加到ebx 这个小循环你一步一步来 你会明白的 如不明白 多跟两遍 你自己明白比我说你听明白收获的更多
00401179 . 8BF3 MOV ESI,EBX ; 把上面的值给ESI 不过这个循环之后 可要注意程序如何处理ESI
0040117B > 41 INC ECX ; ECX是循环次数 把它加一 给下面是否跳出循环做依据
0040117C . 3B4D FC CMP ECX,DWORD PTR SS:[EBP-4] ; 比较是否取完
0040117F .^ 75 E7 JNZ SHORT Crackme1.00401168 ; 取完就不循环了
00401181 . 83FE 00 CMP ESI,0 ; 这个ESI 的值是从哪来的 往上找 看到了吧 它不会是0的!
00401184 . 74 69 JE SHORT Crackme1.004011EF ; 上面不是0 这里就不会跳 也就不会会老家
00401186 . BB 89476500 MOV EBX,654789 ; 把654789的值 给ebx 这就像VB里的b=654789 当然这里是ASC码 654789
0040118B > 0FBE81 F22040>MOVSX EAX,BYTE PTR DS:[ECX+4020F2] ; 倒取用户名ASC码 因为这里ecx 为你输入的用户名位数 而4020f2 是什么我在上面已经说过
00401192 . 4B DEC EBX ; 654789减取次数 下次这个循环好取倒数第二个
00401193 . 6BC3 02 IMUL EAX,EBX,2 ; 654789减取次数(是在上一句 当然654789是初值 这要明白)*倒取的用户名ASC码再*2
00401196 . 03D8 ADD EBX,EAX ; 把上一句所产生的eax的值 + 654789减取次数(次数可以理解为循环次数 因为下一句为-1操作 当然是循环一次减一一次)
00401198 . 4B DEC EBX ; 把上面ebx的值减一
00401199 . 49 DEC ECX ; ECX减一 减一干什么? 在这个循环第一句 要用 可以看OD提示 比较每次循环的不同 来分析它的功能!
0040119A .^ 75 EF JNZ SHORT Crackme1.0040118B ; 看循环结束没 也就是看 ecx 是否为0 ecx是注册名位数 循环之前是7(我的注册名位数)循环一次减一一次 为零了 如果它为零了 也就是说名取完了!
0040119C . 56 PUSH ESI ; /<%lu>
0040119D . 53 PUSH EBX ; |<%lX>
0040119E . 68 C7204000 PUSH Crackme1.004020C7 ; |Format = "BS-%lX-%lu" format 是格式化 这里是把上面取的值按这个格式重组%lu BS- + %lu是把前面的esi转换为十进制(从40119c后面的注释) + -%lX 是把前面的ebx转换为16进制(从40119d后面的注释) 这是正确注册码的格式
004011A3 . 68 BB214000 PUSH Crackme1.004021BB ; |s = Crackme1.004021BB
004011A8 . E8 6C000000 CALL <JMP.&USER32.wsprintfA> ; \wsprintfA
004011AD . 58 POP EAX ; 40119c 处的push esi 呵呵 看看 esi 是多少? 肯定有鬼 快再看看上面esi的值从哪来的! 哦 找到了 401179 前面还说呢 自己倒先忘了 ^_^ 到这可就出真码了 看od 提示信息
004011AE . 58 POP EAX ; 401199 处的push ebx 呵呵不会不知道ebx 从哪来的吧? 它离这可不不太远呀!
004011AF . 58 POP EAX ; 到这我可就不用分析了 呵呵 我太累了 也没办法谁叫我的答应飘云破解兄弟的呢 我可答应他如果他懂汇编 我就一定叫他会会算法! 哎 值夜班加写教程 好晕! 凌晨了哟!
004011B0 . 58 POP EAX
004011B1 . E8 01000000 CALL Crackme1.004011B7
004011B6 . C3 RETN
004011B7 $ 33C9 XOR ECX,ECX
004011B9 . 6A 32 PUSH 32 ; /Count = 32 (50.)
004011BB . 68 57214000 PUSH Crackme1.00402157 ; |Buffer = Crackme1.00402157
004011C0 . 68 C9000000 PUSH 0C9 ; |ControlID = C9 (201.)
004011C5 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
004011C8 . E8 5E000000 CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA 这个像是取输入注册码的吧 我没跟到这
004011CD . 83F8 00 CMP EAX,0
004011D0 . 74 1D JE SHORT Crackme1.004011EF
004011D2 . 33C9 XOR ECX,ECX
004011D4 > 0FBE81 572140>MOVSX EAX,BYTE PTR DS:[ECX+402157]
004011DB . 0FBE99 BB2140>MOVSX EBX,BYTE PTR DS:[ECX+4021BB]
004011E2 . 3BC3 CMP EAX,EBX
004011E4 . 75 09 JNZ SHORT Crackme1.004011EF
004011E6 . 83F8 00 CMP EAX,0
004011E9 . 74 19 JE SHORT Crackme1.00401204
004011EB . 41 INC ECX
004011EC .^ EB E6 JMP SHORT Crackme1.004011D4
004011EE . C3 RETN
004011EF > 6A 10 PUSH 10 ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
004011F1 . 68 E4204000 PUSH Crackme1.004020E4 ; |Title = "Nope"
004011F6 . 68 E9204000 PUSH Crackme1.004020E9 ; |Text = "Try again"
004011FB . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
004011FE . E8 34000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA 错误了
00401203 . C3 RETN
00401204 > 6A 40 PUSH 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00401206 . 68 D2204000 PUSH Crackme1.004020D2 ; |Title = "Solved"
0040120B . 68 D9204000 PUSH Crackme1.004020D9 ; |Text = "Well done."
00401210 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
00401213 . E8 1F000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA 正确了
到这我可就不用分析了 呵呵 我太累了 也没办法谁叫我的答应飘云破解兄弟的呢 我可答应他如果他懂汇编 我就一定叫他会会算法! 哎 值夜班加写教程 好晕! 凌晨了哟!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)