能力值:
( LV3,RANK:20 )
|
-
-
2 楼
感谢你对Crackme的分析,一起学习。你也把注册机代码写出来看看吧。
你的OD没有加载mfc90.lib的符号文件。所以指针没提示出来
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
感谢楼上的兄弟抬举--呵呵-- 本来想发到那个帖子的 可惜 饿哦是临时用户 权限---回不了帖子
我当初 调试的时候 费了好大的劲儿----啊--试过 GetDlgItemTextA,DialogBoxParamA
可是就是没断下来 ----- 后来 看到 代码中到处是 UNICODE 型API使用,于是
又试 W 型的API,后来 在 GetWindowTextW 处断到了 --找到 调用 这个函数的代码处,查看,下断,还是明显的 有 wsprintfW 和 lstrcmpW --- 当然 楼上的也说过 主要是为了算法分析 --因此明码比较 了 ----
下面这个注册机的代码是 MASM 语法所写 ---- 源文件,exe文件,资源文件都 在 附件中
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
ID_NAME equ 4h
ID_CODE equ 8h
ID_BUTTON equ 10h
.data?
dwLen dd ?
szNameBuffer db 24 dup (?)
szCodeBuffer db 80 dup (?)
dwCode dd ? ;dwCode保存关键注册数据
.const
szKeyString dw 'v','c','.','c','o','m',0 ;定义UNICODE串 "vc.com"
szTail dw 'd','d','s','o','f','t',0 ;定义UNICODE串 "ddsoft"
szFormat dw '%','s','%','d','%','s',0 ;定义UNICODE型szFormat,"%s%d%s"
szNameErr db 'Name字符数 6<= X <=10',0
.code
;/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
_ProcDlgMain proc uses ebx edi esi hDlg,wMsg,wParam,lParam
mov eax,wMsg
.if eax == WM_COMMAND
mov eax,wParam
.if ax == ID_BUTTON
;-------------------------------------------------------------------------
;这个以下是关键运算过程,此过程中使用UNICODE型API使得中文,英文同样处理方式
;-------------------------------------------------------------------------
invoke GetDlgItemTextW,hDlg,ID_NAME,addr szNameBuffer,sizeof szNameBuffer
mov dwLen,eax ;EAX返回获得的字符串长度,UNICODE则返回UNICODE字符数
.if eax > 10 || eax <= 5
invoke MessageBox,0,addr szNameErr,0,0
jmp _End
.endif
xor eax,eax
xor ecx,ecx
xor esi,esi
@@:
movzx edx,word ptr szNameBuffer[ecx] ;edx保存szBufferName的一项
movzx ebx,word ptr szKeyString[ecx] ;ebx保存szKeyString的一项
mov edi,edx
imul ebx,edi ;EBX == szNameBuffer[ecx] * szKeyString[ecx]
add ebx,eax ;EBX == EBX + EAX (EAX是个计数器,每循环一次增加5)
add edx,ebx ;EDX == szNameBuffer[ecx] * szKeyString[ecx] + 5*n + szNameBuffer[ecx]
add dwCode,edx ;dwCode == dwCode + EDX (dwCode是关键)
add eax,5
add ecx,2 ;ECX是数组指针(下标)
cmp eax,30 ;if eax < 30 继续循环,这样最多可循环6次.
jl @B
invoke wsprintfW,addr szCodeBuffer,addr szFormat,addr szNameBuffer,dwCode,addr szTail
invoke SetDlgItemTextW,hDlg,ID_CODE,addr szCodeBuffer
mov dwCode,0
_End:
.else
mov eax,FALSE
ret
.endif
.elseif eax == WM_INITDIALOG
invoke SendDlgItemMessage,hDlg,ID_NAME,EM_LIMITTEXT,20,0
.elseif eax == WM_CLOSE
invoke EndDialog,hDlg,0
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp
;/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
start:
invoke GetModuleHandle,NULL
invoke DialogBoxParam,eax,2,NULL,addr _ProcDlgMain,NULL
invoke ExitProcess,0
end start
;/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
能力值:
( LV3,RANK:20 )
|
-
-
4 楼
学习了下汇编,LZ基础很好啊。。。佩服。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
初学者中的高手..共同努力..
|
能力值:
( LV4,RANK:50 )
|
-
-
6 楼
共同努力!!!
临时会员加油-- - 呵呵--
|