首页
社区
课程
招聘
[已解决]一个算法的汇编写法?
发表于: 2009-3-11 01:31 6719

[已解决]一个算法的汇编写法?

2009-3-11 01:31
6719
下面这个算法的易语言的解密写法

; 原码为: [20]:BYTE

编码表 = { 97, 214, 212, 233, 221, 240, 251, 242, 91, 100, 53, 173, 183, 200, 25, 117, 236, 49, 43, 188 }
.变量循环首 (1, 取字节集长度 (编码表), 2, i)
    密码 = 密码 + 字符 (位异或 (编码表 [i], 原码 [i]))
.变量循环尾 ()
返回 (密码)

;变量循环首  = FOR

简单说就是 原码与编码都从首位开始 隔位位异或(位异或的值转换为字符),这10个字符逐个相加就是密码了

看来我的汇编基础太差了,望各位高手指教,谢谢了

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 2384
活跃值: (766)
能力值: (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
2009-3-11 08:26
0
雪    币: 750
活跃值: (228)
能力值: ( 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

关系图:
上传的附件:
2009-3-11 13:41
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
一样把首地址送过去啊
2009-3-11 13:48
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
5
啊,我试试,看的不是很明白,能解释下就好了
2009-3-11 13:53
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
6
貌似不行啊,得到的乱码,只有第一个字母 J 是对的啊
2009-3-11 14:08
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
7
是的,如4楼所说,把你的字符编码首地址传过去就行。在汇编操作可视的字符和非可视的字符的ASCII码值没什么两样。都只是一个Byte类型的数值。
2009-3-11 14:09
0
雪    币: 2384
活跃值: (766)
能力值: (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
2009-3-11 14:11
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
9
OK了,谢谢小虾版主,谢谢stalker
2009-3-11 14:51
0
雪    币: 750
活跃值: (228)
能力值: ( 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


2009-3-11 17:19
0
雪    币: 2384
活跃值: (766)
能力值: (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]  ;  
2009-3-11 17:32
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
12
哦,明白了, dec ecx  也可以做为判断啊,谢谢
2009-3-11 17:36
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
13
mov  al ,BYTE ptr [edx+esi*2-1]        ;PassBytes (编码)的偶数位移到缓存
; 上面那那一句应该是
mov byte ptr [edx+esi*2-1],al
2009-3-11 17:43
0
雪    币: 750
活跃值: (228)
能力值: ( 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密码存入注册表的加解密过程!
2009-3-11 17:43
0
雪    币: 750
活跃值: (228)
能力值: ( 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了

谢谢了,受教!
2009-3-11 17:46
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
16
我用的是瑞星。
2009-3-11 17:46
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
17
啊,瑞星?

正版的?我觉得不好用,太占资源,还是ESET NOD32 好用,还可以免费使用
2009-3-11 17:52
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
18
嗯,是正版的,虽然配置不是很好,但运行也影响不了多少,用着也就懒得再去管那些了。
2009-3-11 18:00
0
雪    币: 122
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
19
终于看到这样的贴子了,一直想学如何写CrackMe,但就是不会写算法。这样的帖子应该更多才对。
2009-3-14 00:42
0
雪    币: 750
活跃值: (228)
能力值: ( 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


;########################################################################
2009-3-14 18:55
0
游客
登录 | 注册 方可回帖
返回
//