新手破解练习Crackme160之089 - Phrek crackme
- 暴力破解
程序在win10下无法运行, 复制到xp虚拟机中可运行, 随便输入后验证, 提示"Naah! Wrong!"
IDA工具载入, 搜索文本: Naah, 定位到如下代码处:
......
cseg01:01D2 dd tiTForm
cseg01:01D6 db 38h ; 8
cseg01:01D7 db 0
cseg01:01D8 db 4
cseg01:01D9 db 4Dh ; M
cseg01:01DA db 61h ; a
cseg01:01DB db 69h ; i
cseg01:01DC db 6Eh ; n
cseg01:01DD db 0
cseg01:01DE db 0
cseg01:01DF aG3df db 4,'g3df' ; DATA XREF: cseg01:021Do
cseg01:01E4 aH9cf8 db 5,'h9cf8' ; DATA XREF: cseg01:0260o
cseg01:01EA aNaahWrong db 12,'Naah! Wrong!' ; DATA XREF: cseg01:0297o
cseg01:01EA ; cseg01:loc_2FBo
cseg01:01F7 aYeahGoodWork db 16,'YEAH! Good work!' ; DATA XREF: cseg01:02E5o
cseg01:0208 ; ---------------------------------------------------------------------------
cseg01:0208
cseg01:0208 loc_208: ; DATA XREF: cseg01:010Eo
cseg01:0208 push bp
cseg01:0209 mov bp, sp
cseg01:020B mov ax, 500h
cseg01:020E call @__StackCheck$q4Word ; __StackCheck(Word)
cseg01:0213 sub sp, 500h
cseg01:0217 lea di, [bp-400h]
cseg01:021B push ss
cseg01:021C push di
cseg01:021D mov di, offset aG3df ; "g3df" // di = "g3df"
cseg01:0220 push cs
cseg01:0221 push di
cseg01:0222 call @$basg$qm6Stringt1 ; operator=(String &,String &)
cseg01:0227 lea di, [bp-300h]
cseg01:022B push ss
cseg01:022C push di
cseg01:022D les di, [bp+6]
cseg01:0230 les di, es:[di+18Ch]
cseg01:0235 push es
cseg01:0236 push di
cseg01:0237 call @TControl@GetText$qv ; TControl::GetText(void) //es = 取出用户名
cseg01:023C call @Concat$qm6Stringt1 ; Concat(String &,String &) //st1 = g3df + es
cseg01:0241 lea di, [bp-100h]
cseg01:0245 push ss
cseg01:0246 push di
cseg01:0247 push 0FFh
cseg01:024A call @$basg$qm6Stringt14Byte ; operator=(String &,String &,Byte) //这里应该是通过byte方式复制字符串吧, 没看太明白
cseg01:024F lea di, [bp-300h]
cseg01:0253 push ss
cseg01:0254 push di
cseg01:0255 lea di, [bp-100h]
cseg01:0259 push ss
cseg01:025A push di
cseg01:025B call @$basg$qm6Stringt1 ; operator=(String &,String &)
cseg01:0260 mov di, offset aH9cf8 ; "h9cf8" //di = "h9cf8"
cseg01:0263 push cs
cseg01:0264 push di
cseg01:0265 call @Concat$qm6Stringt1 ; Concat(String &,String &) //str = str1 + di
cseg01:026A lea di, [bp-200h]
cseg01:026E push ss
cseg01:026F push di
cseg01:0270 push 0FFh
cseg01:0273 call @$basg$qm6Stringt14Byte ; operator=(String &,String &,Byte)
cseg01:0278 lea di, [bp-300h]
cseg01:027C push ss
cseg01:027D push di
cseg01:027E les di, [bp+6]
cseg01:0281 les di, es:[di+18Ch]
cseg01:0286 push es
cseg01:0287 push di
cseg01:0288 call @TControl@GetText$qv ; TControl::GetText(void) //取密码串
cseg01:028D add sp, 4
cseg01:0290 cmp byte ptr [bp-300h], 0 //对比, 如果长度为0则报错
cseg01:0295 jnz short loc_2AD
cseg01:0297 mov di, offset aNaahWrong ; "Naah! Wrong!"
cseg01:029A push cs
cseg01:029B push di
cseg01:029C les di, [bp+6]
cseg01:029F les di, es:[di+184h]
cseg01:02A4 push es
cseg01:02A5 push di
cseg01:02A6 call @TControl@SetText$q8TCaption ; TControl::SetText(TCaption)
cseg01:02AB jmp short locret_30F
cseg01:02AD ; ---------------------------------------------------------------------------
cseg01:02AD
cseg01:02AD loc_2AD: ; CODE XREF: cseg01:0295j
cseg01:02AD lea di, [bp-400h]
cseg01:02B1 push ss
cseg01:02B2 push di
cseg01:02B3 les di, [bp+6]
cseg01:02B6 les di, es:[di+17Ch]
cseg01:02BB push es
cseg01:02BC push di
cseg01:02BD call @TControl@GetText$qv ; TControl::GetText(void) // 这里又取了一次文本框的值, 应该还是取密码框的值
cseg01:02C2 lea di, [bp-500h]
cseg01:02C6 push ss
cseg01:02C7 push di
cseg01:02C8 lea di, [bp-100h]
cseg01:02CC push ss
cseg01:02CD push di
cseg01:02CE call @$basg$qm6Stringt1 ; operator=(String &,String &)
cseg01:02D3 lea di, [bp-200h]
cseg01:02D7 push ss
cseg01:02D8 push di
cseg01:02D9 call @Concat$qm6Stringt1 ; Concat(String &,String &) //这里又做了一次字符串相连
cseg01:02DE call @$bsub$qm6Stringt1 ; operator-(String &,String &) //这里两个字符串想减, 差为0就正确了
cseg01:02E3 jnz short loc_2FB //这里又一个关键跳
cseg01:02E5 mov di, offset aYeahGoodWork ; "YEAH! Good work!"
cseg01:02E8 push cs
cseg01:02E9 push di
cseg01:02EA les di, [bp+6]
cseg01:02ED les di, es:[di+184h]
cseg01:02F2 push es
cseg01:02F3 push di
cseg01:02F4 call @TControl@SetText$q8TCaption ; TControl::SetText(TCaption)
cseg01:02F9 jmp short locret_30F
cseg01:02FB ; ---------------------------------------------------------------------------
cseg01:02FB
cseg01:02FB loc_2FB: ; CODE XREF: cseg01:02E3j
cseg01:02FB mov di, offset aNaahWrong ; "Naah! Wrong!"
cseg01:02FE push cs
cseg01:02FF push di
cseg01:0300 les di, [bp+6]
cseg01:0303 les di, es:[di+184h]
cseg01:0308 push es
cseg01:0309 push di
cseg01:030A call @TControl@SetText$q8TCaption ; TControl::SetText(TCaption)
cseg01:030F
cseg01:030F locret_30F: ; CODE XREF: cseg01:02ABj
cseg01:030F ; cseg01:02F9j
cseg01:030F leave
cseg01:0310 retf 8
......
上面的代码大概可以看出是按钮事件对应的代码, 里面就是算法部分~, 大概分析算法结果是:
有两个固定串"g3df"和"h9cf8"分别与我们输入的用户名串相连, 再与注册码比对~
我们找到关键跳
1). cseg01:0295 jnz short loc_2AD 对应的16进制代码段是: 75 16 BF EA 01 0E 57 C4
2). cseg01:02E3 jnz short loc_2FB 对应的16进制代码段是: 75 16 BF F7 01 0E 57 C4
我们打开UE编辑器, 分别搜索到这两个位置, 把1).的75改为EB(即: jnz改为jmp)跳过密码长度验证, 将2).的75 16 改为 90 90(即将jnz改为nop)保存, 复制到xp运行,
输入任意值或不输入, 点验证, 成功看到"YEAH! Good work!"~
2. 正常破解
由于在xp下, OD也无法单步调试, 虽然可以加载成功, 但地址段完全不一样, 可能就是因为NE程序的原因吧~ 所以放弃了,
由上面IDA代码可知, 密码串必然跟 用户名 与 "g3df","h9cf8" 这三串字符串相关~, 看了大佬的解法得到算法是:
pwd = g3df + user +g3df + user + h9cf8
例:
用户名: abc
密码为: g3dfabcg3dfabch9cf8
1~160每个破解过程,在吾爱破解论坛都有高手破解过了,也有整理好现成的, 我这边主要就是自己动手操作的过程,与他们的不太一样
附上高手们的连接: 点击前往查看
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载
新人入门教程"玩玩破解,写给新人看" 点击前往查看
我就是从这里开始的,对我这样的小白感觉超级友好~
下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~


浙公网安备 33010602011771号