我是用户 发表于 2013-5-25 12:48

破解实战-第二战

本帖最后由 我是用户 于 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

SxAni丶 发表于 2013-5-25 13:18

下载来练练手

a46213599 发表于 2015-8-2 12:09

因大神的连接地址已失效,自己直接百度下载的这个软件安装后为什么没有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

小雨细无声 发表于 2013-5-25 13:22

感谢大神提供技术分享!

1354669803 发表于 2013-5-25 13:45

一个很明显的验证

wkxq 发表于 2013-5-25 14:01

有学习的必要

q349806278 发表于 2013-5-25 14:34

感谢,,学习了

jy03024663 发表于 2013-5-25 14:59

前排,太高端了。
对于新手来说太复杂咯。

老万 发表于 2013-5-25 20:01

谢谢楼主,学习了,好教程

yuxiaopc 发表于 2013-5-30 14:31

谢谢楼主,当作范例收藏了。论坛太需要这样的教程了

107883194 发表于 2013-6-1 17:16

问个小白的问题。RUNEXEC.dll下断要怎么下断点我怎么进不去00621c60这段代码 用F8单步也不行
页: [1] 2 3 4 5 6 7 8 9
查看完整版本: 破解实战-第二战