模拟OD获取软件的注册码
程序员文章站
2022-12-04 09:15:05
作 者: organic
最近朋友给了一个软件,让破解一下,软件没什么保护,首先OD打开直接准备下断,结果查找一看发现没有获取编辑框的API函数,再尝试给注册的"确定"按...
作 者: organic
最近朋友给了一个软件,让破解一下,软件没什么保护,首先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”写入断点 www.2cto.com
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后然后读取软件的注册码信息
代码写得比较简陋,有兴趣的朋友还可以加入自动打开软件然后发送一个注册消息,
模拟软件注册过程,然后自动得到注册码,这里我就不多写了
软件注册码得到后的截图:
最近朋友给了一个软件,让破解一下,软件没什么保护,首先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”写入断点 www.2cto.com
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后然后读取软件的注册码信息
代码写得比较简陋,有兴趣的朋友还可以加入自动打开软件然后发送一个注册消息,
模拟软件注册过程,然后自动得到注册码,这里我就不多写了
软件注册码得到后的截图:
推荐阅读
-
用Angular实时获取本地Localstorage数据,实现一个模拟后台数据登入的效果
-
同花顺 模拟炒股软件的使用方法
-
PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
-
PHP CURL获取cookies模拟登录的方法
-
傲软CAD看图软件如何激活?DWG文件查看软件获取永久商业授权的方法介绍
-
模拟炒股软件app排名(易上手且安全的8款炒股软件)
-
压缩宝如何安装激活使用?图片视频压缩软件获取终身授权的方法
-
脚本之家夏**ke提取码在哪里 脚本之家下载电子书或软件获取分享码的方法
-
在电脑中激活、获取Windows Phone和模拟器的信息
-
苹果封杀失败 在电脑上模拟运行iOS的软件面向个人用户开放