首页
社区
课程
招聘
[原创]模拟OD获取软件的注册码
发表于: 2012-7-22 20:42 29631

[原创]模拟OD获取软件的注册码

2012-7-22 20:42
29631
最近朋友给了一个软件,让破解一下,软件没什么保护,首先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 探索篇!

上传的附件:
收藏
免费 6
支持
分享
最新回复 (34)
雪    币: 1585
活跃值: (190)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
思路不错,学习了。
2012-7-22 20:48
0
雪    币: 3515
活跃值: (4042)
能力值: (RANK:215 )
在线值:
发帖
回帖
粉丝
3
方便的话,还是用程序load要调试的程序,然后拦截获取。
2012-7-22 21:12
0
雪    币: 485
活跃值: (78)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
太麻烦了,直接一个补丁工具就可以了。这个方法很老了!不过还是感射你的分享!
2012-7-22 21:13
0
雪    币: 271
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wep
5
不错的说感谢分享。
2012-7-22 21:40
0
雪    币: 439
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
keymake太出名了。
2012-7-22 23:31
0
雪    币: 41
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
思路很好,支持了,分享了
2012-7-23 08:21
0
雪    币: 602
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
学习一下........
2012-7-23 08:27
0
雪    币: 7906
活跃值: (3086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
看不懂汇编,不过好像刘老师的内存注册机可以实现这个功能吧
2012-7-23 13:07
0
雪    币: 269
活跃值: (51)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
笨方法,不过思路很好
2012-7-23 16:57
0
雪    币: 27
活跃值: (90)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
11
不管方法好不好,潜心学习,舍得分享,就是好的

支持楼主
2012-7-23 17:12
0
雪    币: 385
活跃值: (32)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
学习了 谢谢分享
2012-7-23 21:53
0
雪    币: 321
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
大家有没有发现注册软件无法解压?
2012-7-24 13:26
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
思路不错,学习了。 不过我喜欢用KeyMake来制作补丁!
谢谢楼主分享!
2012-7-24 15:27
0
雪    币: 639
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
混编写的程序,看得好友压力...
2012-7-24 16:30
0
雪    币: 659
活跃值: (489)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
16
用好压试试,看雪附加不能超过3M,我把注册软件分割了
2012-7-24 17:32
0
雪    币: 659
活跃值: (489)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
17
用好压试试,看雪附加不能超过3M,我把注册软件分割了
2012-7-24 17:35
0
雪    币: 603
活跃值: (40)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
18
这也精华。。。。
2012-7-24 18:59
0
雪    币: 3202
活跃值: (1917)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
不用这么麻烦,直接内存注册机了事。
2012-7-24 21:27
0
雪    币: 142
活跃值: (310)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
20
现在普通的破解文章很少给精华了。
2012-7-25 10:00
0
雪    币: 274
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
支持分享,呵呵~~
2012-7-27 11:06
0
雪    币: 156
活跃值: (27)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
22
感谢。。。主要是有码。。学习了
2012-7-27 17:15
0
雪    币: 301
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
23
这个思路就是内存注册机了KeyMake
2012-7-27 20:56
0
雪    币: 65
活跃值: (118)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
24
思路不错,学习了。
2012-7-28 01:10
0
雪    币: 218
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
很有帮助的教程
2012-8-26 12:50
0
游客
登录 | 注册 方可回帖
返回
//