我的破解心得(1) (3千字)
说明:这是我以前写的心得,贴在这里,请大家指正。破解对象:
IrfanView32
破解工具:
W32Dasm 8.5(或更高版本)
Hacker View 5.6(或更高版本)
破解者:
chcw
IrfanView32是一个免费软件,程序作者没有花什么力气来对付Cracker,故较适合
初学Crack的人练习用。
1. 运行IrfanView32。
2. 选择About/Registration, 随便输一个name和code, 如
name=chcw, code=9530109。
3. 一般来说,你的注册码当然是错误的(除非你的运气特别好,刚好给你碰对了)
程序将显示一个消息框, 内容是"Incorrect registration!"。记下该信息后,
退出IrfanView32。
4. 运行W32Dasm, 将I_view32.exe反汇编。
5. 反汇编结束后,选择W32Dasm菜单Refs/String Data References, 从列表框中
找出字符串"Incorrect registration!", 选中后用鼠标双击,W32Dasm将把亮
条定位在反汇编代码中访问到该字符串的代码行上。
6. 关闭字符串列表对话框,我们来看一下亮条处的代码:
...
:0041A733 E8C868FEFF call 00401000
:0041A738 83C408 add esp, 00000008
:0041A73B 85C0 test eax, eax
:0041A73D 751B jne 0041A75A
...
* Possible StringData Ref from Data Obj ->"Incorrect registration !"
|
:0041A74F 68A0E24700 push 0047E2A0 <-亮条所在处
:0041A754 51 push ecx
:0041A755 E9FEFDFFFF jmp 0041A558
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A73D(C)
:0041A75A 8B354C754900 mov esi, dword ptr [0049754C]
从亮条所在处往上找,可以发现在0041A73B处有一条test eax,eax语句,它
后面的jne语句是eax为非零值时,跳转到0041A75A处,正好跳过了对字符串
"Incorrect registration !"的引用。而在test语句前有一个call 00401000调
用。因此,00401000很可能就是一个对注册码进行检查的函数,当注册码合法时
返回非零值,否则返回零,并显示错误信息。将亮条移到:0041A733 call 00401000
语句处,亮条呈亮绿色。按工具栏上的"Call"按钮进入该子程序。在子程序ret
语句前有下面几条语句:
:00401280 3BE8 cmp ebp, eax
...
:00401284 0F94C1 sete cl
...
:00401288 8BC1 mov eax, ecx
...
:0040128E C3 ret
可见,如果猜想正确,那么我们只需要将00401284处的sete cl语句改为
setne cl,就可以使注册成功。
7. 在W32Dasm中,将亮条移到00401284的jne语句处,此时在W32Dasm反汇编窗口
的状态行中将显示@Offset 00000684h in File:I_view32.exe, 记下这个偏移地
址。
8. 将I_view32.exe备份,运行Hiew I_view32.exe,按F4键(Mode),选择Decode
模式,再按F5键(Goto), 输入偏移地址684,Hiew将定位到偏移684处:
.00401284 0F94C1 sete cl
9. 现在我们将这条语句改为setne cl,按F3键(Edit),输入0F95(setne的机器码)
将原先的0F94(sete的机器码)覆盖,此时我们可以看到机器码右部的汇编代码也发生
了相应的变化。再按F9键(Update),保存所作的修改,退出Hiew。
10. 运行I_view32.exe, 随便输入一个注册码(如Name="chcw",Code="9530109")选
择"OK",程序显示"Register Successful",再到About/About IrfanView中,可以看
到原先的registered to You字样改成了registerd to chcw。注册成功了!
在修改过I_view32.exe之后,如果你输入了正确的注册码,程序反而会提示
"Incorrect registeration"。
11. 有人也许会想,能不能将调用检测函数00401000之后的语句0041A73D jne 0041A75A
改为je或jmps语句,从而达到相同的效果呢?回答是否定的。的确,很多软件都可以在
检测函数之外的跳转处Patch,而且这样做一般来说更为安全,但是IrfanView32却是例外。
IrfanView32相当狡猾,它在程序启动时、注册时和显示About IrfanView32对话框时都会
反复调用00401000函数检验注册的正确性。所以直接改动检测函数也许更为合理一些。
