雨过天晴电脑保护系统的注册判断过程非常直接,只要硬盘上有正版注册标志它就认为是正版。但是雨过天晴电脑保护系统可以分为两个部分:windows环境下的主体程序EAZTRAY.exe和非windows环境的辅助程序(计算机启动时按HOME键可进入),而每一个进度还原的操作都会用到这个辅助程序,所以在windows下爆破主体程序或者其他诸如补丁的方法没有任何意义。让试用版变成注册版,我们要做的只能是把已注册标志写入硬盘。自己写程序完成这个过程有点麻烦(在DOS下方便一点),让雨过天晴主体程序自我完成注册标志的写入才是最简单和快捷的。
这里拿060612专业版本为例。雨过天晴软件在进入系统的时候自动运行,可以先用任务管理器结束其进程,然后OD加载分析看看其正式版的标志是什么。至于判断的位置,很容易就能找见,最简单的方法就是搜索字串"试用期限"然后向前定位,或者通过API函数WinSysTime2ShieldSysTime定位。这里说两个关键的地方:
1.内存地址0040B8C6处,cmp byte ptr[esi+6CD],2
[esi+6CD]中存放的就是注册标志,一个byte,1为试用版,2为正式版,3就不用管了。在这里中断后要记下[esi+6CD]所指的位置,每台机器上都是不同的。
2.内存地址0040B93C处,jle 0040B95E
注意后面不远处的call 0043ED36,这个call中有写入注册信息的部分,这意味着0040B93Ch处绝对不能跳。
接下来很简单了,要做的就是在调用call 0043ED36前把注册标志改为2;当然这个过程必须是在程序执行到0040B93C处才能做。下断0040B8C6和0040B93C,
在0040B93C中断后,修改[esi+6CD]中的值为2,然后设法不让跳,过了call 0043ED36后注册信息就被写入了。修改日期到7天以后,重新启动HOME键进去试试,没有任何提示,正版了吧?
如果要写个类似loader的东西作为注册工具,可以如下:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;雨过天晴自我注册
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
includelib dic32u.lib
include macro.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
BREAK_POINT1 equ 0040B8C6h ;第一个断点
BREAK_POINT2 equ 0040B93Ch ;第二个断点
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.const
dbPatched1 db 02h
dbPatched2 db 90h,90h
dbInt3 db 0cch
dbOldByte db 80h
szExecFilename db 'EAZTRAY.exe',0
.data?
align dword
PATCH_POSITION dd ?
dwTemp dd ?
stCT CONTEXT <?>
stDE DEBUG_EVENT <?>
stStartUp STARTUPINFO <>
stProcInfo PROCESS_INFORMATION <>
stProcess PROCESSENTRY32<>
hSnapShot dd ?
.code
Start:
invoke RtlZeroMemory,addr stProcess,sizeof stProcess
mov stProcess.dwSize,sizeof stProcess
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0
mov hSnapShot,eax
invoke Process32First,hSnapShot,addr stProcess
.while eax
invoke CompareString,LOCALE_USER_DEFAULT,NORM_IGNORECASE,addr szExecFilename,\
sizeof szExecFilename,addr stProcess.szExeFile,sizeof szExecFilename
.if eax==2
invoke OpenProcess,PROCESS_TERMINATE,FALSE,stProcess.th32ProcessID
.if eax
mov ebx,eax
invoke TerminateProcess,ebx,-1
invoke CloseHandle,ebx
.endif
.break
.endif
invoke Process32Next,hSnapShot,addr stProcess
.endw
;********************************************************************
; 创建进程
;********************************************************************
invoke GetStartupInfo,addr stStartUp
invoke CreateProcess,offset szExecFilename,NULL,NULL,NULL,NULL,\
DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS,NULL,NULL,\
offset stStartUp,offset stProcInfo
.if !eax
invoke MessageBox,NULL,CTEXT("无法装载目标文件,",0dh,"复制本程序到雨果天晴安装目录下执行!"),NULL,MB_OK or MB_ICONSTOP
invoke ExitProcess,NULL
.endif
;********************************************************************
; 调试进程
;********************************************************************
.while TRUE
invoke WaitForDebugEvent,addr stDE,INFINITE
.break .if stDE.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT
;********************************************************************
; 如果进程开始,则将入口地址处的代码改为 int 3 断点中断
;********************************************************************
.if stDE.dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT
invoke WriteProcessMemory,stProcInfo.hProcess,BREAK_POINT1,addr dbInt3,1,addr dwTemp
invoke WriteProcessMemory,stProcInfo.hProcess,BREAK_POINT2,addr dbInt3,1,addr dwTemp
;********************************************************************
; 如果发生断点中断,则恢复断点处代码并进行内存补丁
;********************************************************************
.elseif stDE.dwDebugEventCode == EXCEPTION_DEBUG_EVENT
.if stDE.u.Exception.pExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT
mov stCT.ContextFlags,CONTEXT_FULL
invoke GetThreadContext,stProcInfo.hThread,addr stCT
.if stCT.regEip == BREAK_POINT1 + 1
dec stCT.regEip
invoke WriteProcessMemory,stProcInfo.hProcess,BREAK_POINT1,addr dbOldByte,1,addr dwTemp
mov eax,stCT.regEsi
add eax,6CDh
mov PATCH_POSITION,eax
invoke SetThreadContext,stProcInfo.hThread,addr stCT
.elseif stCT.regEip == BREAK_POINT2 + 1
dec stCT.regEip
invoke WriteProcessMemory,stProcInfo.hProcess,BREAK_POINT2,addr dbPatched2,sizeof dbPatched2,addr dwTemp
invoke WriteProcessMemory,stProcInfo.hProcess,PATCH_POSITION,addr dbPatched1,sizeof dbPatched1,addr dwTemp
invoke SetThreadContext,stProcInfo.hThread,addr stCT
.endif
.endif
.endif
invoke ContinueDebugEvent,stDE.dwProcessId,stDE.dwThreadId,DBG_CONTINUE
.endw
invoke CloseHandle,stProcInfo.hProcess
invoke CloseHandle,stProcInfo.hThread
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end Start
好了,想要研究该软件的穷光蛋们不妨试试。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)