能力值:
(RANK:410 )
|
-
-
2 楼
.386
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib
.data
bTable db 97, 214, 212, 233, 221, 240, 251, 242, 91, 100, 53, 173, 183, 200, 25, 117, 236, 49, 43, 188
szOutBuffer db 256 dup(0)
szTestScr db 'dbcdefghijklmnopqrstuvwxyz',0
.code
GetPass proc uses esi edi ebx lpScr,lpOutBuffer
mov edi,lpScr
mov edx,lpOutBuffer
xor eax,eax
test edx,edx
jnz @f
ret
@@:
test edi,edi
jnz @f
ret
@@:
lea ebx,bTable
mov ecx,sizeof bTable/2
xor esi,esi
@@:
movzx eax,BYTE ptr [edi+esi]
xor al,BYTE ptr [ebx+esi*2]
mov BYTE ptr [edx+esi],al
inc esi
dec ecx
jnz @b
mov eax,edx
ret
GetPass endp
start:
invoke GetPass,offset szTestScr,offset szOutBuffer
invoke MessageBox,0,offset szOutBuffer,NULL,MB_OK
invoke ExitProcess,NULL
ret
end start
|
能力值:
( LV9,RANK:780 )
|
-
-
3 楼
谢谢小吓版主,如果我的源码(szTestScr) 不是一个文本,而是由文本转换而来的字节集了?如下面:
那又该如何了?谢谢了
源码: 00BH,0D6H,0E3H.0E9H,0E8H,0FOH,0C3H,0F2H,06CH,064H,053H,0ADH,082H,0C8H,06BH,075H,0DBH,031H,05BH,0BCH
编码: 061H,0D6H,0D4H,0E9H,0DDH,0FOH,0FBH,0F2H,05BH,064H,035H,0ADH,0B7H,0C8H,019H,075H,0ECH,031H,02BH,0BCH
密码: j 7 e 8 7 f 5 r 7 p 解密后的密码为: j7e87f5r7p 关系图:
|
能力值:
(RANK:350 )
|
-
-
4 楼
一样把首地址送过去啊
|
能力值:
( LV9,RANK:780 )
|
-
-
5 楼
啊,我试试,看的不是很明白,能解释下就好了
|
能力值:
( LV9,RANK:780 )
|
-
-
6 楼
貌似不行啊,得到的乱码,只有第一个字母 J 是对的啊
|
能力值:
(RANK:410 )
|
-
-
7 楼
是的,如4楼所说,把你的字符编码首地址传过去就行。在汇编操作可视的字符和非可视的字符的ASCII码值没什么两样。都只是一个Byte类型的数值。
|
能力值:
(RANK:410 )
|
-
-
8 楼
.386
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib
.data
bTable db 97, 214, 212, 233, 221, 240, 251, 242, 91, 100, 53, 173, 183, 200, 25, 117, 236, 49, 43, 188
szOutBuffer db 256 dup(0)
szTestScr db 'dbcdefghijklmnopqrstuvwxyz',0
.code
GetPass proc uses esi edi ebx lpScr,lpOutBuffer
mov edi,lpScr
mov edx,lpOutBuffer
xor eax,eax
test edx,edx
jnz @f
ret
@@:
test edi,edi
jnz @f
ret
@@:
lea ebx,bTable
mov ecx,sizeof bTable/2
xor esi,esi
@@:
movzx eax,BYTE ptr [edi+esi*2] ; 这里修改一下就行了
xor al,BYTE ptr [ebx+esi*2]
mov BYTE ptr [edx+esi],al
inc esi
dec ecx
jnz @b
mov eax,edx
ret
GetPass endp
start:
invoke GetPass,offset szTestScr,offset szOutBuffer
invoke MessageBox,0,offset szOutBuffer,NULL,MB_OK
invoke ExitProcess,NULL
ret
end start
|
能力值:
( LV9,RANK:780 )
|
-
-
9 楼
OK了,谢谢小虾版主,谢谢stalker
|
能力值:
( LV9,RANK:780 )
|
-
-
10 楼
另外,根据版主的解密写发,写了个加密过程,欢迎小虾版主批评指正!另外,这2句不是很明白,希望
大侠能指正下,谢谢
dec ecx
jnz @b
EnPass proc proc uses esi edi ebx lpScr,lpOutBuffer mov edi,lpScr mov edx,lpOutBuffer xor eax,eax test edx,edx jnz @F ; 不为空就跳 测试 lpOutBuffer 是否为空,@F表示匹配本条指令后的第一个@@标号 ret @@: test edi,edi ; 测试 lpScr 是否为空 jnz @f ret @@: lea ebx,PassBytes ;是把PassBytes 的地址放入ebx寄存器中 mov ecx,sizeof PassBytes/2 ;ecx=10 xor esi,esi ;esi 清零,i=0 @@: ;记次循环 i从0开始
movzx eax,BYTE ptr [edi+esi] ; ax/al= lpScr(源码)的i+1位BYTE数据 xor al, BYTE ptr [ebx+esi*2] ; lpScr的奇数位与 PassBytes (编码)对应的奇数位进行位异或运算,结果存入al mov BYTE ptr [edx+esi*2],al ;位异或的结果移到缓存的奇数位 movzx eax,BYTE ptr [ebx+esi*2-1] ; ax/al= PassBytes (编码)的偶数位BYTE数据 mov al ,BYTE ptr [edx+esi*2-1] ;PassBytes (编码)的偶数位移到缓存
inc esi ;esi +1 (i+1) dec ecx jnz @b ; 这个判断从那里来 ? @b 表示匹配本条指令前的第一个@@标号 mov eax,edx ;返回结果 ret EnPass endp
|
能力值:
(RANK:410 )
|
-
-
11 楼
jnz的作用是不为零则跳,是针对dec ecx而言,如果ecx = ecx - 1 <> 0则跳到上面再继续执行。
xor al, BYTE ptr [ebx+esi*2] ; lpScr(源码)1+i位与 PassBytes (编码)的奇数位 位异或 ,结果存入al
mov BYTE ptr [edx+esi*2],al ;结果移到缓存
不过,我看不出下面两句指令有什么作用。
movzx eax,BYTE ptr [ebx+esi*2-1]
mov al ,BYTE ptr [edx+esi*2-1] ;
|
能力值:
( LV9,RANK:780 )
|
-
-
12 楼
哦,明白了, dec ecx 也可以做为判断啊,谢谢
|
能力值:
(RANK:410 )
|
-
-
13 楼
mov al ,BYTE ptr [edx+esi*2-1] ;PassBytes (编码)的偶数位移到缓存
; 上面那那一句应该是
mov byte ptr [edx+esi*2-1],al
|
能力值:
( LV9,RANK:780 )
|
-
-
14 楼
[QUOTE=小虾;590023]jnz的作用是不为零则跳,是针对dec ecx而言,如果ecx = ecx - 1 <> 0则跳到上面再继续执行。
xor al, BYTE ptr [ebx+esi*2] ; lpScr(源码)1+i位与 PassBytes (编码)的奇数位 位异或 ,结果存入al
...[/QUOTE]
哦,这个啊,是把编码的奇数位移到缓存
原始密码是10字节
加密后的密码是20字节
加密后的密码与编码的奇数位不变,只位异或了偶数位
不知道版主用的啥杀毒软件,这个是ESET NOD32密码存入注册表的加解密过程!
|
能力值:
( LV9,RANK:780 )
|
-
-
15 楼
[QUOTE=小虾;590032]mov al ,BYTE ptr [edx+esi*2-1] ;PassBytes (编码)的偶数位移到缓存
; 上面那那一句应该是
mov byte ptr [edx+esi*2-1],al[/QUOTE]
你是说用 movzx 重复命令了?
没必要 xor eax,eax了
谢谢了,受教!
|
能力值:
(RANK:410 )
|
-
-
16 楼
我用的是瑞星。
|
能力值:
( LV9,RANK:780 )
|
-
-
17 楼
啊,瑞星?
正版的?我觉得不好用,太占资源,还是ESET NOD32 好用,还可以免费使用
|
能力值:
(RANK:410 )
|
-
-
18 楼
嗯,是正版的,虽然配置不是很好,但运行也影响不了多少,用着也就懒得再去管那些了。
|
能力值:
( LV3,RANK:20 )
|
-
-
19 楼
终于看到这样的贴子了,一直想学如何写CrackMe,但就是不会写算法。这样的帖子应该更多才对。
|
能力值:
( LV9,RANK:780 )
|
-
-
20 楼
补充另外一种写法:
.data
PassBytes db 97, 214, 212, 233, 221, 240, 251, 242, 91, 100, 53, 173, 183, 200, 25, 117, 236, 49, 43, 188
LOCAL @lpPass[20]:BYTE ;加密过的源码 LOCAL @Pass[10]:BYTE ;密码
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;密码加密过程2,参数源码,输出缓存 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
EnCode proc uses edi ebx lpEnCode,lpEnDestBuff xor edi,edi lea eax,PassBytes mov edx,lpEnCode mov ebx,lpEnDestBuff .while edi < 10 mov cl,BYTE ptr [edx+edi] ;把密码逐位移到CL xor cl,BYTE ptr [eax+edi*2] ;;关键代码: 与编码奇数位进行位异或运算 mov BYTE ptr [ebx+edi*2],cl ;奇数位移到缓存 mov cl,BYTE ptr [eax+edi*2-1] ;偶数位移到缓存 mov BYTE ptr [ebx+edi*2-1] ,cl inc edi .endw mov eax,ebx ret EnCode endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;密码解密过程2,参数源码,输出缓存 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DeCode proc uses edi ebx lpEnCode,lpDeDestBuff xor edi,edi lea eax,PassBytes mov edx,lpEnCode mov ebx,lpDeDestBuff .while edi < 10 mov cl,BYTE ptr [edx+edi*2] ;把加密后的密码奇数位移到CL xor cl,BYTE ptr [eax+edi*2] ;关键代码: 与编码奇数位进行位异或运算 mov BYTE ptr [ebx+edi],cl ;奇数位移到缓存 inc edi .endw mov eax,ebx ret DeCode endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;密码解密过程,参数源码,输出缓存 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
GetPass proc uses esi edi ebx lpScr,lpOutBuffer mov edi,lpScr mov edx,lpOutBuffer xor eax,eax test edx,edx jnz @F ; 不为空就跳 测试 lpOutBuffer 是否为空,@F表示匹配本条指令后的第一个@@标号 ret @@: test edi,edi ; 测试 lpScr 是否为空 jnz @f ret @@: lea ebx,PassBytes ;是把PassBytes 的地址放入ebx寄存器中 mov ecx,sizeof PassBytes/2 ;ecx=10 xor esi,esi ;esi 清零 @@: movzx eax,BYTE ptr [edi+esi*2] ; ax/al= lpScr[1+2*i]源码的奇数位 xor al,BYTE ptr [ebx+esi*2] ; lpScr(源码)的奇数位与 PassBytes (编码)的奇数位 位异或 ,结果存入AL mov BYTE ptr [edx+esi],al ; 把结果存入lpOutBuffer(缓存) inc esi ;esi +1 (i+1) dec ecx jnz @b ; @b 表示匹配本条指令前的第一个@@标号 mov eax,edx ;返回结果 ret
GetPass endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;密码加密过程,参数密码,输出缓存 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
EnPass proc proc uses esi edi ebx lpScr,lpOutBuffer mov edi,lpScr mov edx,lpOutBuffer xor eax,eax test edx,edx jnz @F ; 不为空就跳 测试 lpOutBuffer 是否为空,@F表示匹配本条指令后的第一个@@标号 ret @@: test edi,edi ; 测试 lpScr 是否为空 jnz @f ret @@: lea ebx,PassBytes ;是把PassBytes 的地址放入ebx寄存器中 mov ecx,sizeof PassBytes/2 ;ecx=10 xor esi,esi ;esi 清零,i=0 @@: movzx eax,BYTE ptr [edi+esi] ; ax/al= lpScr(源码)[1+i] xor al, BYTE ptr [ebx+esi*2] ; 关键代码: lpScr(源码)1+i位与 PassBytes (编码)的奇数位 位异或 ,结果存入al mov BYTE ptr [edx+esi*2],al ;结果移到缓存 mov al,BYTE ptr [ebx+esi*2-1] ; al= PassBytes(编码)的偶数位 mov BYTE ptr [edx+esi*2-1],al ; ;PassBytes (编码)的偶数位移到缓存
inc esi ;esi +1 (i+1) dec ecx jnz @b ; @b 表示匹配本条指令前的第一个@@标号 mov eax,edx ;返回结果 ret EnPass endp
;########################################################################
|
|
|