本文最后更新于474 天前,其中的信息可能已经过时,如有错误请发送至评论区或邮箱alore@can6.top
鸣谢:吾爱技术吧
前提需要知道的知识
软件版本分类
一般分为以下几类:
【商业版】:也就是正规的商业发行版,这种软件本应通过正规购买方式获得,但网络上一些朋友将这些软件进行技术处理之后以软件包的形式提供下载,一般来说在使用上和正规购买的版本没有什么区别。
【试用版】:这类软件一般是商业软件开发商自己通过网络提供于大家下载的。但和正式商业版相比在功能上会有一定限制,比如原来在网络上提供的金山2003试用版。就有使用次数的限制。
【共享版】:也就是共享软件,这类软件一般是由个人开发完成,只通过网络下载的方式发行,但软件开发者为了获取利益,会对软件进行技术处理,在未向作者正式购买该软件之前会在使用过程中受到一定限制,如只能使用30天,或者某些高级功能无法使用。当使用者向作者付款之后,会通过比如注册码方式对软进行解锁,从而能够无障碍使用该软件。
【免费版】:和共享软件一样,大多由个人开发,但却是免费提供给大家使用,没有任何功能或时间、次数上的限制。但一般不允许对该软件进行二次开发或用于商业赢利目的。
【自由版】:也就是自由软件,这类软件不但向使用者提供没有任何限制的使用权限,而且遵循相关的自由软件授权协议允许任何人对该软件进行二次开发或用于商业用途,甚至有时会提供软件源代码(LINUX软件大多属于此类)。
【破解板】(注册版):严格来说这不属于一种授权版本,因为他是针对商业版、试用版、共享版这类有使用限制的软件进行二次开发之后形成的特殊版本,也就是说,使用者可以在没有任何经济付出的条件下无限制的使用该软件的
使用工具
- 查壳
PEID–功能强大的侦壳工具,自带脱壳插件(但是,效果不怎么样)
工作原理:核心是userdb.txt(大家看看就完全明白了)[通过壳的入口特征码进行辨认] - od
强大的反汇编工具,也是现在最常用的 - Dump
OD自带的脱壳插件–到达OEP之后右键。。。
LordPE、PeDumper–选择所调试的进程–右键–完整脱壳 - 修复
Import REConstructor 1.6 - VMware
虚拟机
认识软件是否加密
通过特征来判断
----------------------------------------------------------------------------
Microsoft Visual C++ 6.0
00496EB8 >/$ 55 PUSH EBP ; (初始 cpu 选择)
00496EB9 |. 8BEC MOV EBP,ESP
00496EBB |. 6A FF PUSH -1
00496EBD |. 68 40375600 PUSH Screensh.00563740
00496EC2 |. 68 8CC74900 PUSH Screensh.0049C78C ; SE 处理程序安装
00496EC7 |. 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
00496ECD |. 50 PUSH EAX
00496ECE |. 64:8925 00000>MOV DWORD PTR FS:[0],ESP
00496ED5 |. 83EC 58 SUB ESP,58
----------------------------------------------------------------------------
Microsoft Visual Basic 5.0 / 6.0
00401166 - FF25 6C104000 JMP DWORD PTR DS:[<&MSVBVM60.#100>] ; MSVBVM60.ThunRTMain
0040116C > 68 147C4000 PUSH PACKME.00407C14
00401171 E8 F0FFFFFF CALL <JMP.&MSVBVM60.#100>
00401176 0000 ADD BYTE PTR DS:[EAX],AL
00401178 0000 ADD BYTE PTR DS:[EAX],AL
0040117A 0000 ADD BYTE PTR DS:[EAX],AL
0040117C 3000 XOR BYTE PTR DS:[EAX],AL
----------------------------------------------------------------------------
BC++
0040163C > $ /EB 10 JMP SHORT BCLOCK.0040164E
0040163E |66 DB 66 ; CHAR 'f'
0040163F |62 DB 62 ; CHAR 'b'
00401640 |3A DB 3A ; CHAR ':'
00401641 |43 DB 43 ; CHAR 'C'
00401642 |2B DB 2B ; CHAR '+'
00401643 |2B DB 2B ; CHAR '+'
00401644 |48 DB 48 ; CHAR 'H'
00401645 |4F DB 4F ; CHAR 'O'
00401646 |4F DB 4F ; CHAR 'O'
00401647 |4B DB 4B ; CHAR 'K'
00401648 |90 NOP
00401649 |E9 DB E9
0040164A . |98E04E00 DD OFFSET BCLOCK.___CPPdebugHook
0040164E > \A1 8BE04E00 MOV EAX,DWORD PTR DS:[4EE08B]
00401653 . C1E0 02 SHL EAX,2
00401656 . A3 8FE04E00 MOV DWORD PTR DS:[4EE08F],EAX
0040165B . 52 PUSH EDX
0040165C . 6A 00 PUSH 0 ; /pModule = NULL
0040165E . E8 DFBC0E00 CALL <JMP.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA
00401663 . 8BD0 MOV EDX,EAX
----------------------------------------------------------------------------
Borland Delphi 6.0 - 7.0
00509CB0 > $ 55 PUSH EBP
00509CB1 . 8BEC MOV EBP,ESP
00509CB3 . 83C4 EC ADD ESP,-14
00509CB6 . 53 PUSH EBX
00509CB7 . 56 PUSH ESI
00509CB8 . 57 PUSH EDI
00509CB9 . 33C0 XOR EAX,EAX
00509CBB . 8945 EC MOV DWORD PTR SS:[EBP-14],EAX
00509CBE . B8 20975000 MOV EAX,unpack.00509720
00509CC3 . E8 84CCEFFF CALL unpack.0040694C
----------------------------------------------------------------------------
易语言入口
00401000 > E8 06000000 call dump_.0040100B
00401005 50 push eax
00401006 E8 BB010000 call <jmp.&KERNEL32.ExitProcess>
0040100B 55 push ebp
0040100C 8BEC mov ebp,esp
0040100E 81C4 F0FEFFFF add esp,-110
00401014 E9 83000000 jmp dump_.0040109C
00401019 6B72 6E 6C imul esi,dword ptr ds:[edx+6E],6C
0040101D 6E outs dx,byte ptr es:[edi]
也可能是这样的入口
Microsoft Visual C++ 6.0 [Overlay] E语言
00403831 >/$ 55 PUSH EBP
00403832 |. 8BEC MOV EBP,ESP
00403834 |. 6A FF PUSH -1
00403836 |. 68 F0624000 PUSH Nisy521.004062F0
0040383B |. 68 A44C4000 PUSH Nisy521.00404CA4 ; SE 处理程序安装
00403840 |. 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
00403846 |. 50 PUSH EAX
00403847 |. 64:8925 00000>MOV DWORD PTR FS:[0],ESP
----------------------------------------------------------------------------
MASM32 / TASM32入口
00401258 >/$ 6A 00 push 0 ; /pModule = NULL
0040125A |. E8 47000000 call <jmp.&kernel32.GetModuleHandleA> ; \GetModuleHandleA
0040125F |. A3 00304000 mov dword ptr ds:[403000],eax
00401264 |. 6A 00 push 0 ; /lParam = NULL
00401266 |. 68 DF104000 push dump.004010DF ; |DlgProc = dump.004010DF
0040126B |. 6A 00 push 0 ; |hOwner = NULL
0040126D |. 6A 65 push 65 ; |pTemplate = 65
0040126F |. FF35 00304000 push dword ptr ds:[403000] ; |hInst = NULL
00401275 |. E8 56000000 call <jmp.&user32.DialogBoxPar
----------------------------------------------------------------------------
MASM32 / TASM32入口
00401258 >/$ 6A 00 push 0 ; /pModule = NULL
0040125A |. E8 47000000 call <jmp.&kernel32.GetModuleHandleA> ; \GetModuleHandleA
0040125F |. A3 00304000 mov dword ptr ds:[403000],eax
00401264 |. 6A 00 push 0 ; /lParam = NULL
00401266 |. 68 DF104000 push dump.004010DF ; |DlgProc = dump.004010DF
0040126B |. 6A 00 push 0 ; |hOwner = NULL
0040126D |. 6A 65 push 65 ; |pTemplate = 65
0040126F |. FF35 00304000 push dword ptr ds:[403000] ; |hInst = NULL
00401275 |. E8 56000000 call <jmp.&user32.DialogBoxPar
汇编简单基础
cmp a,b // 比较a与b
mov a,b // 把b值送给a值,使a=b
ret // 返回主程序
nop // 无作用
call // 调用子程序,子程序以ret结尾
je或jz // 相等则跳(机器码是74或84)
jne或jnz // 不相等则跳(机器码是75或85)
jmp // 无条件跳(机器码是EB)
jb // 若小于则跳
ja // 若大于则跳
jg // 若大于则跳
jge // 若大于等于则跳
jl // 若小于则跳
pop xxx // xxx出栈
push xxx // xxx压栈
// ...
实战
破解第一个简单程序
注册码输入正确就显示以下跳转
错误则报错
- 拖拽
.exe
到PEid查壳
发现此程序没有壳,是易语言通过vc++最后编译出来的程序,带着vc++的特征码
- 拖拽
.exe
到x32dbg,并搜索字符串
- 在字符串界面找到提示的字符,双击跳转查看执行过程。或者直接找到注册码,完成破解
- 分析程序,找到关键call(注册成功和失败的调用),关键call上边的地方有关键跳
- 将此处的逻辑用
NOP
填充或者je
改为jne
(破坏跳转逻辑,使跳转不成立),进而输入错误的注册码也可以执行
- 通过debug的方式看程序是否在这个地方直接执行注册,不进行跳转(此处不再演示)
- 通过打补丁的方式,将补丁打给此程序的一个副本,实现破解
- 测试破解是否成功
通过错误的注册码进入了正确的成功界面,破坏了判断错误后的跳转,直接进入正确的跳转,破解成功。
总结
破解步骤
- 查壳破壳
- 拉入程序到x32dbg
- 通过程序特征(字符串、事件等)去找关键call,进而找到关键跳,破坏验证的关键跳 | 或者找到注册码
- 如果破坏了关键跳,记得给程序打上补丁,完成破解
来源: docx
文章作者: .docx
文章链接: https://bigzcoder.gitee.io/2021/01/23/crushsoftwarebase/
本文章著作权归作者所有,任何形式的转载都请注明出处。