最近朋友给了一个软件,让破解一下,软件没什么保护,首先OD打开直接准备下断,结果查找一看发现没有获取编辑框的API函数,再尝试给注册的"确定"按钮下消息断点,但不知道什么原因没下成功,然后直接用“超级字符串搜索”搜索Unicode字符,查找"无法通过验证",查到后汇编跟随,如下:
往上翻,在“40FCD1 push 2D”处下断,一步步跟,在“0040FCE2 CALL HydroLab.00405430”此条指令执行后ecx中惊现注册码
但是这个软件的注册码在不同的机器上是不同的,本人很懒,找到注册码了就懒得继续去跟了,也懒得去分析软件的算法,但必须给朋友一个在他机子上能正确使用的注册码,那怎么办,懒人有懒方法,我们用OD分析得到了注册码,那我们写一个注册机,模拟OD过程不就同样可以得到注册码。而且在不同的机子上都可以通用。
首先看我们用OD搜注册码的过程,我们只要让软件运行到0040FCE2 CALL HydroLab.00405430”此条指令后断下,取ecx的值,然后读其指向的内存,我们就能得到注册码了。
下面是代码
DebugProc proc
local BPNum:DWORD
mov BPNum, 0
invoke UH_FindProcess, addr szFindWndName
mov hFindProcess, eax
mov FindProcessID, edx
.if eax != 0
invoke WriteProcessMemory, hFindProcess, BPAddr, addr WrinteBP, 1, NULL ;在“40FCEF”写入断点
invoke DebugActiveProcess, FindProcessID ;附加进程进入调试
.while TRUE
invoke WaitForDebugEvent, addr strDebugEvent, INFINITE ;等待调试信息
.break .if strDebugEvent.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT
.if strDebugEvent.dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT
mov strContext.ContextFlags, CONTEXT_FULL
mov eax, strDebugEvent.u.CreateProcessInfo.hThread ;保存调试线程的句柄
mov hDebugThread, eax
.elseif strDebugEvent.dwDebugEventCode == EXCEPTION_DEBUG_EVENT
.if strDebugEvent.u.Exception.pExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT ;捕获调试进程的断点
.if BPNum > 0 ;被调试进程第一次进入调试时会自动产生一个断点信息,忽略
invoke GetThreadContext, hDebugThread, addr strContext ;获取调试进程的上下文信息
invoke ReadProcessMemory, hFindProcess, strContext.regEcx, addr EditBuffer, 18, NULL ;读取ecx地址说保存的注册码信息
invoke SetDlgItemText, hWinmain, IDC_EDT_OutPut, addr EditBuffer
.endif
inc BPNum
invoke ContinueDebugEvent, strDebugEvent.dwProcessId, strDebugEvent.dwThreadId, DBG_CONTINUE
.continue
.endif
.endif
invoke ContinueDebugEvent, strDebugEvent.dwProcessId, strDebugEvent.dwThreadId, DBG_EXCEPTION_NOT_HANDLED
.endw
.else
invoke MessageBox, NULL, addr szProcessFindfail, NULL, MB_OK
.endif
ret
DebugProc endp
1、我们先把软件运行起来,然后“40FCEF”的位置(其他位置也可以)写入中断指令“CC”,这样软件点注册后会中断在这里
2、软件断下来了,那么我们如何获取他的ecx呢,方法有多种,前面说过我们用模拟OD的方法,那么就用“DebugActiveProcess”附加软件进程,然后用“WaitForDebugEvent”循环捕获软件的断点异常,由于我们第一次附加进程时调式软件会自动产生一个断点异常,这个断点不是我们要的,我们加入一个循环计数,判断是否是第一次产生的中断
3、当我们点击软件注册后,软件断下,被我们的注册机捕获断点异常,然后用“GetThreadContext”获取调试进程的上下文信息,这里包含了调试软件几乎所有的寄存器信息,我们取ecx后然后读取软件的注册码信息
代码写得比较简陋,有兴趣的朋友还可以加入自动打开软件然后发送一个注册消息,模拟软件注册过程,然后自动得到注册码,这里我就不多写了
软件注册码得到后的截图:
源代码:
UnHydroLab.zip
注册软件:
HydroLab.haozip01.zip HydroLab.haozip02.zip
[课程]Linux pwn 探索篇!