破解实战-第二战
本帖最后由 我是用户 于 2013-6-23 13:50 编辑【软件名称】: 豪杰屏幕录像机 v2.0
【作者邮箱】: 2714608453@qq.com
【下载地址】: http://www.skycn.com/soft/12856.html
【加壳方式】: Microsoft Visual C++ 6.0
【使用工具】: OD
【操作平台】: XP SP2
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
与注册相关的文件:
EXE:
Courseware2.exe 主程序
AuthReg.exe 注册程序
play.exe 录像播放程序
DLL:
RUNEXEC.dll 验证函数(试用框资源)
SthClass.dll 验证函数
1.查壳
分别对Courseware2.exe,AuthReg.exe,play.exe,RUNEXEC.dll,SthClass.dll 用PEID查壳。
结果如下:
Courseware2.exe Microsoft Visual C++ 6.0
AuthReg.exe Microsoft Visual C++ 6.0
play.exe Microsoft Visual C++ 6.0
RUNEXEC.dll PE Win32 DLL (0 EntryPoint)(无壳)
SthClass.dll PE Win32 DLL (0 EntryPoint)(无壳)
都没有壳,很好,直接载入OD。
2.简单的分析
第一点:Courseware2.exe,play.exe运行之前会调用RUNEXEC.dll。
在RUNEXEC.dll中先判断注册码是否正确,正确直接跳过试用框,错误则判断日期是否到期(满30天)
第二点:AuthReg.exe为注册程序,验证函数在SthClass.dll里,如果成功,则保存注册码。
第三点:RUNEXEC.dll与SthClass.dll两者的注册函数是一样的。
3.具体的分析(PS:因为DLL存在重定位问题,所以基址不同,地址也不相同)
对RUNEXEC.dll的分析。
用OD载入Courseware2.exe,未到达Courseware2.exe的OEP,试用框窗口已出现,点击确定或试用后,到达Courseware2.exe的OEP。
因为我们要对RUNEXEC.dll下断,然后Ctrl+F2重新运行,程序成功断下。
RUNEXEC.dll分析代码如下:
00621C60/$8B4424 08 mov eax,dword ptr ss: ;runexec.00628000
00621C64|.83EC 10 sub esp,0x10
00621C67|.83F8 01 cmp eax,0x1
00621C6A|.56 push esi ;runexec.00620000
00621C6B|.0F85 96000000 jnz runexec.00621D07
00621C71|.8B0D 28806200 mov ecx,dword ptr ds:
00621C77|.8BC1 mov eax,ecx
00621C79|.41 inc ecx
00621C7A|.890D 28806200 mov dword ptr ds:,ecx
00621C80|.85C0 test eax,eax
00621C82|.74 0C je short runexec.00621C90
00621C84|.B8 01000000 mov eax,0x1
00621C89|.5E pop esi ;runexec.00620000
00621C8A|.83C4 10 add esp,0x10
00621C8D|.C2 0C00 retn 0xC
00621C90|>E8 8B000000 call runexec.00621D20 ;注册CALL
00621C95|.8BF0 mov esi,eax
00621C97|.85F6 test esi,esi ;runexec.00620000
00621C99|.75 63 jnz short runexec.00621CFE ;跳走则表示注册成功,未跳走则取系统时间进行日期比较
00621C9B|.8D4424 04 lea eax,dword ptr ss:
00621C9F|.50 push eax ; /pSystemTime = NULL
00621CA0|.FF15 C8916200 call dword ptr ds:[<&KERNEL32.GetSystemT>; \GetSystemTime
00621CA6|.8B4C24 04 mov ecx,dword ptr ss: ;runexec.006265E4
00621CAA|.33C0 xor eax,eax
00621CAC|.66:8B4424 06mov ax,word ptr ss:
00621CB1|.81E1 FFFF0000 and ecx,0xFFFF
00621CB7|.C1E1 04 shl ecx,0x4
00621CBA|.0BC8 or ecx,eax
00621CBC|.33C0 xor eax,eax
00621CBE|.C1E1 08 shl ecx,0x8
00621CC1|.66:8B4424 0Amov ax,word ptr ss:
00621CC6|.0BC8 or ecx,eax
00621CC8|.51 push ecx ;7DD518(7DD年份,5月份,18日期)
00621CC9|.890D 2C806200 mov dword ptr ds:,ecx
00621CCF|.E8 1CF5FFFF call runexec.006211F0 ;将日期加密保存在注册表里
00621CD4|.8B4C24 1C mov ecx,dword ptr ss:
00621CD8|.83C4 04 add esp,0x4
00621CDB|.8BF0 mov esi,eax
00621CDD|.56 push esi ;runexec.00620000
00621CDE|.51 push ecx
00621CDF|.E8 4CFFFFFF call runexec.00621C30 ;出现试用对话框
00621CE4|.83C4 08 add esp,0x8
00621CE7|.85F6 test esi,esi ;esi=1表示还在使用期
00621CE9|.75 13 jnz short runexec.00621CFE
00621CEB|.E8 30000000 call runexec.00621D20
00621CF0|.8BF0 mov esi,eax
00621CF2|.85F6 test esi,esi ;runexec.00620000
00621CF4|.75 08 jnz short runexec.00621CFE
00621CF6|.6A 00 push 0x0 ; /ExitCode = 0x0
00621CF8|.FF15 DC916200 call dword ptr ds:[<&KERNEL32.ExitProces>; \ExitProcess
00621CFE|>8BC6 mov eax,esi ;runexec.00620000
00621D00|.5E pop esi ;runexec.00620000
00621D01|.83C4 10 add esp,0x10
00621D04|.C2 0C00 retn 0xC
00621D07|>85C0 test eax,eax
00621D09|.75 06 jnz short runexec.00621D11
00621D0B|.FF0D 28806200 dec dword ptr ds:
00621D11|>B8 01000000 mov eax,0x1
00621D16|.5E pop esi ;runexec.00620000
00621D17|.83C4 10 add esp,0x10
00621D1A\.C2 0C00 retn 0xC
进入00621D20注册CALL
00621EEC|.8D4424 14 lea eax,dword ptr ss:
00621EF0|.8D5424 54 lea edx,dword ptr ss:
00621EF4|.50 push eax
00621EF5|.52 push edx
00621EF6|.FFD1 call ecx ;注册CALL(ECX=00622640)
00621EF8|.85C0 test eax,eax
00621EFA|.7F 1A jg short runexec.00621F16
00621EFC|.85C0 test eax,eax
00621EFE|.7D 14 jge short runexec.00621F14
00621F00|.85FF test edi,edi
进入00622640注册CALL
00622640 .8B4424 08 mov eax,dword ptr ss:
00622644 .50 push eax
00622645 .E8 26000000 call runexec.00622670 ;注册CALL
0062264A .83C4 04 add esp,0x4
0062264D .85C0 test eax,eax
0062264F .75 0D jnz short runexec.0062265E
00622651 .8B4424 04 mov eax,dword ptr ss:
00622655 .50 push eax
00622656 .E8 E5010000 call runexec.00622840
0062265B .83C4 04 add esp,0x4
0062265E >C2 0800 retn 0x8
进入00622670注册CALL
00622670/$8B4424 04 mov eax,dword ptr ss:
00622674|.81EC 38010000 sub esp,0x138
0062267A|.8D8C24 B80000>lea ecx,dword ptr ss:
00622681|.53 push ebx
00622682|.56 push esi ;kernel32.lstrlenA
00622683|.50 push eax ; /String2 = ""
00622684|.51 push ecx ; |String1 = runexec.00622640
00622685|.FF15 00926200 call dword ptr ds:[<&KERNEL32.lstrcpyA>] ; \lstrcpyA
0062268B|.8D4C24 40 lea ecx,dword ptr ss:
0062268F|.8D8424 C00000>lea eax,dword ptr ss:
00622696|.51 push ecx ;runexec.00622640
00622697|.50 push eax
00622698|.E8 830C0000 call runexec.00623320
0062269D|.C74424 28 800>mov dword ptr ss:,0x80
006226A5|.8B0D 78816200 mov ecx,dword ptr ds:
006226AB|.894C24 2C mov dword ptr ss:,ecx ;runexec.00622640
006226AF|.8B15 7C816200 mov edx,dword ptr ds:
006226B5|.895424 30 mov dword ptr ss:,edx
006226B9|.8B15 A8816200 mov edx,dword ptr ds:
006226BF|.A1 80816200 mov eax,dword ptr ds:
006226C4|.6A 10 push 0x10
006226C6|.894424 38 mov dword ptr ss:,eax
006226CA|.8D8424 840000>lea eax,dword ptr ss:
006226D1|.8B0D 84816200 mov ecx,dword ptr ds:
006226D7|.50 push eax
006226D8|.894C24 40 mov dword ptr ss:,ecx ;runexec.00622640
006226DC|.6A 10 push 0x10
006226DE|.8D4C24 4C lea ecx,dword ptr ss:
006226E2|.895424 48 mov dword ptr ss:,edx
006226E6|.8D5424 34 lea edx,dword ptr ss:
006226EA|.51 push ecx ;runexec.00622640
006226EB|.52 push edx
006226EC|.E8 CF0A0000 call runexec.006231C0
006226F1|.8B8C24 940000>mov ecx,dword ptr ss:
006226F8|.8B9424 980000>mov edx,dword ptr ss:
006226FF|.8D4424 1C lea eax,dword ptr ss:
00622703|.894C24 54 mov dword ptr ss:,ecx ;runexec.00622640
00622707|.8D4C24 54 lea ecx,dword ptr ss:
0062270B|.895424 58 mov dword ptr ss:,edx
0062270F|.8D5424 40 lea edx,dword ptr ss:
00622713|.83C4 14 add esp,0x14
00622716|.33F6 xor esi,esi ;kernel32.lstrlenA
00622718|.897424 48 mov dword ptr ss:,esi ;kernel32.lstrlenA
0062271C|.50 push eax
0062271D|.897424 50 mov dword ptr ss:,esi ;kernel32.lstrlenA
00622721|.51 push ecx ;runexec.00622640
00622722|.52 push edx
00622723|.E8 B8000000 call runexec.006227E0
00622728|.8B8C24 940000>mov ecx,dword ptr ss:
0062272F|.8B9424 980000>mov edx,dword ptr ss:
00622736|.897424 1C mov dword ptr ss:,esi ;kernel32.lstrlenA
0062273A|.897424 20 mov dword ptr ss:,esi ;kernel32.lstrlenA
0062273E|.894C24 4C mov dword ptr ss:,ecx ;runexec.00622640
00622742|.895424 50 mov dword ptr ss:,edx
00622746|.8D4424 24 lea eax,dword ptr ss:
0062274A|.8D4C24 4C lea ecx,dword ptr ss:
0062274E|.897424 54 mov dword ptr ss:,esi ;kernel32.lstrlenA
00622752|.897424 58 mov dword ptr ss:,esi ;kernel32.lstrlenA
00622756|.83C4 0C add esp,0xC
00622759|.50 push eax
0062275A|.51 push ecx ;runexec.00622640
0062275B|.8D5424 10 lea edx,dword ptr ss:
0062275F|.52 push edx
00622760|.E8 7B000000 call runexec.006227E0
00622765|.8B4C24 24 mov ecx,dword ptr ss:
00622769|.8B5424 28 mov edx,dword ptr ss: ;MPGAUDIO.005EB008
0062276D|.8D4424 14 lea eax,dword ptr ss:
00622771|.894C24 2C mov dword ptr ss:,ecx ;runexec.00622640
00622775|.8D4C24 24 lea ecx,dword ptr ss:
00622779|.895424 30 mov dword ptr ss:,edx
0062277D|.83C4 0C add esp,0xC
00622780|.6A 10 push 0x10
00622782|.50 push eax
00622783|.6A 10 push 0x10
00622785|.68 88816200 push runexec.00628188
0062278A|.51 push ecx ;runexec.00622640
0062278B|.E8 70040000 call runexec.00622C00
00622790|.8B4424 1C mov eax,dword ptr ss: ;SPad.10006000
00622794|.83C4 14 add esp,0x14
00622797 3B05 98816200 cmp eax,dword ptr ds: //通过计算后的注册值比较
0062279D EB 27 jnz short runexec.006227D4
0062279F A1 9C816200 mov eax,dword ptr ds:
006227A4 8B4C24 0C mov ecx,dword ptr ss:
006227A8 3BC8 cmp ecx,eax //通过计算后的注册值比较
006227AA 75 28 jnz short runexec.006227D4
006227AC A1 A0816200 mov eax,dword ptr ds:
006227B1 8B4C24 10 mov ecx,dword ptr ss: ;runexec.00620000
006227B5 3BC8 cmp ecx,eax //通过计算后的注册值比较
006227B7 75 1B jnz short runexec.006227D4
006227B9 A1 A4816200 mov eax,dword ptr ds:
006227BE 8B4C24 14 mov ecx,dword ptr ss:
006227C2 3BC8 cmp ecx,eax //通过计算后的注册值比较
006227C4 75 0E jnz short runexec.006227D4
006227C6|.B8 01000000 mov eax,0x1 //注册标志
006227CB|.5E pop esi ;0012F7BC
006227CC|.5B pop ebx ;0012F7BC
006227CD|.81C4 38010000 add esp,0x138
006227D3 C3 retn
006227D4 33C0 xor eax,eax //未注册标志
006227D6 5E pop esi ;0012F7BC
006227D7 5B pop ebx ;0012F7BC
006227D8 81C4 38010000 add esp,0x138
006227DE\.C3 retn
爆破:1.006227D4处的xor eax,eax改成mov eax,0x1,但是代码长度太长,不合适.
2.0062279D处的jnz short runexec.006227D4改成jmp 006227C6,合适.
当我们照第二点改好之后,保存,注意保存的代码长度,多选会把重定位数据也保存了,因为play.exe也要调用这个CALL,
所以会出错。Ctrl+F2,试用框已不出现了。
顺便说一下使用日期的加密,只是单纯的取反加密罢了,保存日期的键值是通过xor 7F进行加密的,感兴趣
的朋友可以去跟一下。
然后在SthClass.dll中也找到相应的代码,修改之后,保存,成功爆破。
如图1,2:
=================================================================
传送门:
破解实战-第一战:http://www.52pojie.cn/thread-197281-1-1.html
破解实战-第二战:http://www.52pojie.cn/thread-197598-1-1.html
破解实战-第三站:http://www.52pojie.cn/thread-197957-1-1.html
破解实战-第四站:http://www.52pojie.cn/thread-198203-1-1.html
破解实战-第五战:http://www.52pojie.cn/thread-198365-1-1.html
破解实战-第六战:http://www.52pojie.cn/thread-198930-1-1.html
破解实战-第七战:http://www.52pojie.cn/thread-199459-1-1.html
破解实战-第八战:http://www.52pojie.cn/thread-199834-1-1.html
破解实战-第九战:http://www.52pojie.cn/thread-200655-1-1.html
破解实战-第十战:http://www.52pojie.cn/thread-200798-1-1.html
下载来练练手 因大神的连接地址已失效,自己直接百度下载的这个软件安装后为什么没有RUNEXEC.dll这个。
跟楼主文件不一样了,我又不会弄了,能写个详细点儿的教程吗?
我安装后文件列表如下:
Appicon.ico
HSR.ico
AuthReg.exe
Courseware2.exe
play.exe
SEdit.exe
UNINST32.EXE
Auth936.dll
Auth950.dll
CapFileIO.dll
caphook.dll
CAPSCRN.DLL
Courseware2936.dll
EncFAVI.DLL
EncFGif.DLL
ENCMPA.DLL
HttpReq.dll
MPGAUDIO.DLL
SEdit_ch.dll
SEdit_en.dll
SPad.dll
SthClass.dll
TimeCount.dll
UNIST936.DLL
WaveOut.dll
WAVEREC.DLL 感谢大神提供技术分享! 一个很明显的验证 有学习的必要 感谢,,学习了 前排,太高端了。
对于新手来说太复杂咯。 谢谢楼主,学习了,好教程 谢谢楼主,当作范例收藏了。论坛太需要这样的教程了 问个小白的问题。RUNEXEC.dll下断要怎么下断点我怎么进不去00621c60这段代码 用F8单步也不行