新手破解练习Crackme160之090 - The mask

  1. 手动脱壳
    程序有Petite 1.2 -> (c)1998 Ian Luck (h) *壳, 使用PEiD的通用脱壳器脱壳失败, 转用OD手动脱壳,
    OD载入程序看到了熟悉的pushad, Ctrl+F查找popad, 定位到00406622, 下个断点, F9运行程序, F8单步运行跳转到00401000, 右键选择"用OllayDump脱壳调试进程, 需要选择方式2才能成功, 另存为 "The mask_脱壳.exe"
     

  2. 修复异常
    (后记:这步是最后才发现的, 为了后面程序能正常破解, 先将这步提前), 验证mask.exe文件时, 发现始终无法读取到文件内容, mask.key可以正常读取(说明: 注册码验证成功后还需要再验证两个密钥文件mask.key和mask.exe), 对比一下, 不同之处是00401284 与 00401229, 将00401284改成00401229, 即push dword ptr ds:[0x402297] 改为 push dword ptr ds:[0x402293], 读取文件成功了~ 另存为"The mask_修复.exe"
     

  3. 暴力破解
    OD重新载入修复后的程序, 搜索Sorry bad serial(最后一行), 定位到00401503, 向上找到第一个关键跳0040132F, 改为jmp 004014D2跳转到成功弹框分支, 再把004014E5处改为jmp 004013AB 直接跳转到最终成功分支, 另存为 "The mask_暴破.exe", 运行测试暴破成功~
     

  4. 正常破解
    1). 由上一步可知, 00401327处是check事件中的读取注册码的位置, 我们就在这里下个断点当成按钮入口~, 先判断长度是否为0, 再判断是否是0xC(12)位, 所以我们要输入12位的注册码才能继续, 输入abc123456789, 点验证F8一步步跟踪下去~ 到了00401482处为一个循环, 看着应该是到算法部分了, 我们认真分析这部分算法:

	00401482   > /B8 58204000 	    mov eax,The_mask.00402058  ;  ASCII "abc123456789"
	00401487   . |32DB              xor bl,bl
	00401489   . |8AD8          	mov bl,al                  ; bl = eax的地址[00402058]的al[58]
	0040148B   . |FEC3          	inc bl                     ; bl = 0x59
	0040148D   . |80C3 21       	add bl,0x21                ; bl += 0x21
	00401490   . |80F3 2D       	xor bl,0x2D                ; lb ^= 0x2D
	00401493   . |0BD2          	or edx,edx
	00401495   . |4A            	dec edx                    ; edx -= 1 (edx是注册码长度, 在0040133F处赋值的)
	00401496   . |81FA 87560000 	cmp edx,0x5687             ; edx ?= 0x5687
	0040149C   .^|0F84 BCFEFFFF 	je The_mask.0040135E
	004014A2   . |B8 58204000   	mov eax,The_mask.00402058  ;  ASCII "abc123456789"
	004014A7   . |8A10          	mov dl,byte ptr ds:[eax]   ; dl = eax第一位(a)
	004014A9   . |80C2 38       	add dl,0x38                ; dl += 0x38
	004014AC   . |FEC2         	    inc dl                     ; dl += 1
	004014AE   . |49            	dec ecx                    ; ecx -= 1 这个也是注册码长度
	004014AF   . |83F9 00       	cmp ecx,0x0
	004014B2   .^|0F84 A6FEFFFF 	je The_mask.0040135E
	004014B8   .^\EB C8         	jmp short The_mask.00401482; 循环

由上面算法可知, edx要等于0x5687才会跳转, 也就是注册码第一位+0x38+1 = 0x5687, 也就是第一位得是0x564E, 没有这样的字符, 所以不可能达成这个条件, 也就说明这段代码完全没用, 好吧, 白忙活了,
 
2). 我们继续往下, 00401386处发现一个关键对比, 注册码是否等于固定串"MaskWinner", 这个是不是就是注册码, 激动的心颤抖的手, 果断的马上输入验证, 将验证码码换成这个固定串, 重新运行到此处, 可是怎么试, 条件就是不会成功, 看着字符串完成一样的, 难道这句cmp ebx,ecx对比的不是值而是地址? 汇编不是很懂, 大佬们知道的可以告知小弟是不是我想的那样, 此处对比的是地址, 并不是对应的字符串, 如果是地址的话, 确实是不可能会相等的~ 看来这里又是作者的一个幌子~
 
3). 我们又继续往下跟踪, 运行到004013A6处, F8后程序就直接弹框结束了, 所以这里肯定是算法关键方法了, 我们在此处下个断点, 重新验证来到此处, 按F7进入方法, 再F8继续, 在这里我们又看到了循环, 看来又是一段算法了, 需要认真分析:

	004013D6   .  33C9          	xor ecx,ecx
	004013D8   >  8A040B        	mov al,byte ptr ds:[ebx+ecx]         ; al = 取注册码第ecx位
	004013DB   .  8A91 FB224000     mov dl,byte ptr ds:[ecx+0x4022FB]    ; dl = 取0x4022FB第ecx位
	004013E1   .  32C2          	xor al,dl                            ; al = al ^ dl
	004013E3   .  3A81 EF224000 	cmp al,byte ptr ds:[ecx+0x4022EF]    ; al 与 0x4022EF的第ecx位比较
	004013E9   .  0F85 FB000000	    jnz The_mask.004014EA
	004013EF   .  41            	inc ecx
	004013F0   .  83F9 0C       	cmp ecx,0xC
	004013F3   .^ 75 E3         	jnz short The_mask.004013D8          ; 循环
	004013F5   .  EB 15         	jmp short The_mask.0040140C

上面的代码很明了, 就是注册码与内存固定串异或, 是否等于另一串, 那反过来就可以得到注册码了, 如下:

	004022EF  20 76 C8 1E B4 90 C3 7D AD 2C CA 72               v?磹脈?蕆u?婣
	004022FB  75 3F 8B 41 D2 FF B1 18 DB 49 B8 52              u?婣??跧窻Good
	两个异或得: U  I  C  _  f  o  r  e  v  e  r  空		  (UIC_forever )

注册码便是: UIC_forever (注意, 最后是一个空格), 输入验证, 完成正确~ 成功看到了成功提示框, 但你关掉提示框, 程序并没有结束, 你要是够仔细的话, 可以看到窗体标题变成了 "Still UnRegistered - - by Quequero", 也就是提示你虽然注册码对了, 但还没有真正完成注册~ 让我们还需要继续努力 ~
 
4). 好吧, 我们继续努力 ~, 关闭提示框后, 程序跳转到了00401203处, 需要打开一个mask.key的文件, 我们先不往执行, 而是先直接往下看程序, 如果文件打开失败(就是文件不存在)就跳转到注册未成功分支, 如果文件存在则读取文件, 在读取文件的下面几行又看到了打开文件mask.exe, 说明还需要继续验证文件, 我们先不管, , 读取mask.key文件后跳转到0040144E, 又是一个循环对比串, 与注册码的验证方式一致, 串如下:

	00402239   3F 3F D7 ED 67 34 F3 9E 97 81 34 0F 86 55 AC 9C 38 C6 30 5F 63 42 12 9C 37
	00402252   65 4A B5 89 12 58 9F FF FB ED 55 21 A8 7B CE E5 18 97 45 3A 12 37 77 EE 58
	两个异或得:  Z  u  b  d  u  l  l  a  l  l  a  .  .  .  b  y  空 Q  u  e  q  u  e  r  o

结果是: Zubdullalla...by Quequero, 我们把这串写入mask.key文件, 刚才没有继续执行程序, 现在文件创建完了可以继续了, 刚好可以验证我们创建的文件是不是正确的, 单步验证完全正确, 果然来到了另一个文件mask.exe的打开处,
 
5). 同理, 我们先不往执行, 还是继续看代码, 发现还是一样的套路, 也是内容串与固定串异或对比, 如下:

	0040227F  6F 45 4B 8C 9A 21 18 46 1A 69 97 4A 5F 2D 3C 8A 9B 54 6D 12
	0040226B  28 2A 24 E8 BA 6D 6D 25 71 49 D4 38 3E 4E 57 EF E9 75 4C 33
	两个异或得: 47 6F 6F 64 20 4C 75 63 6B 20 43 72 61 63 6B 65 72 21 21 21

结果是: 乱码, 直接看16进制, 由于不是正常字符, 所以得用UE写入16进制数或是自己程序写入byte值, 文件保存后, 我们还是继续执行程序验证文件的正确性, 不出问题的话就成功了, 偏偏就是出问题了, 如果不是第2步的修复, 这里程序死活无法读取文件, 不知道是不是我win10系统的兼容问题还是什么问题, 然后按第2步修复后, 能成功读取文件内容了, 验证也完全正确~ 到此, 破解完成~

 
 
 
这是160个软件part1
这是160个软件part2

1~160每个破解过程,在吾爱破解论坛都有高手破解过了,也有整理好现成的, 我这边主要就是自己动手操作的过程,与他们的不太一样
附上高手们的连接: 点击前往查看
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载

新人入门教程"玩玩破解,写给新人看" 点击前往查看
我就是从这里开始的,对我这样的小白感觉超级友好~

下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~
OD界面布局

posted @ 2024-07-03 09:59  hankerstudio  阅读(26)  评论(0)    收藏  举报