-
-
算法请教~~~~~~~~~~
-
发表于: 2004-5-27 15:11 1437
-
是加密的算法,不知道该叫什么是什么原理
; -> Polymorphic En-/Decryption routine generator for per byte encryption <-
; by yoda
;---- STRUCTs ----
sPERTable STRUCT
dwSize DD ?
dwEncrypt DD ?
dwDecrypt DD ?
RandNumType DD ?
sPERTable ENDS
; RandNumType:
; 0 - no random num needed
; 1 - 3th byte must be a random number
; 2 - 2nd byte must be a random number
;----- EQUs -----
PERItems EQU 14
;----- CONST ----
.CONST
; all opcodes are in reverse order
PERTable DD 1
DD 090h ; NOP
DD 090h ; NOP
DD 0
DD 1
DD 0F9h ; STC
DD 0F9h ; STC
DD 0
DD 1
DD 0F8h ; CLC
DD 0F8h ; CLC
DD 0
DD 2
DD 0C0FEh ; INC AL
DD 0C8FEh ; DEC AL
DD 0
DD 2
DD 00004 ; ADD AL, 0
DD 0002Ch ; SUB AL, 0
DD 2
DD 2
DD 0002Ch ; SUB AL, 0
DD 00004 ; ADD AL, 0
DD 2
DD 2
DD 0C102h ; ADD AL, CL
DD 0C12Ah ; SUB AL, CL
DD 0
DD 2
DD 0C12Ah ; SUB AL, CL
DD 0C102h ; ADD AL, CL
DD 0
DD 2
DD 00034h ; XOR AL, 0
DD 00034h ; XOR AL, 0
DD 2
DD 3
DD 000C8C0h ; ROR AL, 0
DD 000C0C0h ; ROL AL, 0
DD 1
DD 3
DD 000C0C0h ; ROL AL, 0
DD 000C8C0h ; ROR AL, 0
DD 1
DD 3
DD 0E801EBh ; Self modifing
DD 0E801EBh ; Self modifing
DD 0
DD 3
DD 0E901EBh ; Self modifing
DD 0E901EBh ; Self modifing
DD 0
DD 3
DD 0C201EBh ; Self modifing
DD 0C201EBh ; Self modifing
DD 0
.DATA
dwRandVal DD 0
.CODE
; srand should only called one time !!!
InitRandom PROC
; manage the random generator
CALL GetTickCount
PUSH EAX
CALL srand
RET
InitRandom ENDP
MakePER PROC pEncryptBuff : LPVOID, pDecryptBuff : LPVOID, dwSize : DWORD
LOCAL dwCurRandNum : DWORD
; prepare some things
MOV EDI, pEncryptBuff ; EDI -> EncryptBuffer
MOV ESI, pDecryptBuff ; ESI -> DecryptBuffer
ADD ESI, dwSize ; ESI will be filled from down to top
; generate !
.REPEAT
; get a random PER Item
PUSH PERItems
CALL rand
MOV EBX, SIZEOF sPERTable
XOR EDX, EDX
MUL EBX
ADD EAX, OFFSET PERTable
XCHG EAX, EDX ; EDX -> PER Table Item
ASSUME EDX : PTR sPERTable
; is this item too big
MOV EBX, [EDX].dwSize
CMP EBX, dwSize
JG Retry
;---- past the Opcode ----
;-> encryption buffer
MOV ECX, [EDX].dwSize
MOV EAX, [EDX].dwEncrypt
MOV ECX, [EDX].dwSize
.WHILE ECX != 0
MOV BYTE PTR [EDI], AL
ADD EDI, 1
ROR EAX, 8
DEC ECX
.ENDW
; generate the random num
MOV EAX, [EDX].RandNumType
.IF EAX == 1 || EAX == 2
MOV EBX, EDI
SUB EBX, 1
PUSH 0F8h
CALL rand
INC EAX ; avoid 0 !
MOV dwCurRandNum, EAX
MOV BYTE PTR [EBX], AL
.ENDIF
; update variables/pointers
MOV EAX, [EDX].dwSize
SUB dwSize, EAX
;-> decryption buffer
MOV ECX, [EDX].dwSize
MOV EAX, [EDX].dwDecrypt
SUB ECX, 1
.WHILE ECX != 0
ROR EAX, 8
DEC ECX
.ENDW
MOV ECX, [EDX].dwSize
.WHILE ECX != 0
SUB ESI, 1
MOV BYTE PTR [ESI], AL
ROL EAX, 8
DEC ECX
.ENDW
; generate the random num
MOV EAX, [EDX].RandNumType
.IF EAX == 1
MOV EBX, ESI
ADD EBX, 2
MOV EAX, dwCurRandNum
MOV BYTE PTR [EBX], AL
.ELSEIF EAX == 2
MOV EBX, ESI
ADD EBX, 1
MOV EAX, dwCurRandNum
MOV BYTE PTR [EBX], AL
.ENDIF
ASSUME EDX : NOTHING
Retry:
.UNTIL dwSize == 0
RET
MakePER ENDP
rand PROC USES edx ebx, dwRange : DWORD
MOV EAX, dwRandVal
; save new random number
ADD EAX, 0567h
ROL EAX, 1
MOV dwRandVal, EAX
; get new random number
XOR EDX, EDX
MOV ECX, 32
BitLoop:
SHR EAX, 1
.IF CARRY?
XOR EAX, 013245769h
.ENDIF
LOOP BitLoop
; force dwRange
XOR EDX, EDX
MOV EBX, dwRange
DIV EBX
XCHG EAX, EDX
; -> Polymorphic En-/Decryption routine generator for per byte encryption <-
; by yoda
;---- STRUCTs ----
sPERTable STRUCT
dwSize DD ?
dwEncrypt DD ?
dwDecrypt DD ?
RandNumType DD ?
sPERTable ENDS
; RandNumType:
; 0 - no random num needed
; 1 - 3th byte must be a random number
; 2 - 2nd byte must be a random number
;----- EQUs -----
PERItems EQU 14
;----- CONST ----
.CONST
; all opcodes are in reverse order
PERTable DD 1
DD 090h ; NOP
DD 090h ; NOP
DD 0
DD 1
DD 0F9h ; STC
DD 0F9h ; STC
DD 0
DD 1
DD 0F8h ; CLC
DD 0F8h ; CLC
DD 0
DD 2
DD 0C0FEh ; INC AL
DD 0C8FEh ; DEC AL
DD 0
DD 2
DD 00004 ; ADD AL, 0
DD 0002Ch ; SUB AL, 0
DD 2
DD 2
DD 0002Ch ; SUB AL, 0
DD 00004 ; ADD AL, 0
DD 2
DD 2
DD 0C102h ; ADD AL, CL
DD 0C12Ah ; SUB AL, CL
DD 0
DD 2
DD 0C12Ah ; SUB AL, CL
DD 0C102h ; ADD AL, CL
DD 0
DD 2
DD 00034h ; XOR AL, 0
DD 00034h ; XOR AL, 0
DD 2
DD 3
DD 000C8C0h ; ROR AL, 0
DD 000C0C0h ; ROL AL, 0
DD 1
DD 3
DD 000C0C0h ; ROL AL, 0
DD 000C8C0h ; ROR AL, 0
DD 1
DD 3
DD 0E801EBh ; Self modifing
DD 0E801EBh ; Self modifing
DD 0
DD 3
DD 0E901EBh ; Self modifing
DD 0E901EBh ; Self modifing
DD 0
DD 3
DD 0C201EBh ; Self modifing
DD 0C201EBh ; Self modifing
DD 0
.DATA
dwRandVal DD 0
.CODE
; srand should only called one time !!!
InitRandom PROC
; manage the random generator
CALL GetTickCount
PUSH EAX
CALL srand
RET
InitRandom ENDP
MakePER PROC pEncryptBuff : LPVOID, pDecryptBuff : LPVOID, dwSize : DWORD
LOCAL dwCurRandNum : DWORD
; prepare some things
MOV EDI, pEncryptBuff ; EDI -> EncryptBuffer
MOV ESI, pDecryptBuff ; ESI -> DecryptBuffer
ADD ESI, dwSize ; ESI will be filled from down to top
; generate !
.REPEAT
; get a random PER Item
PUSH PERItems
CALL rand
MOV EBX, SIZEOF sPERTable
XOR EDX, EDX
MUL EBX
ADD EAX, OFFSET PERTable
XCHG EAX, EDX ; EDX -> PER Table Item
ASSUME EDX : PTR sPERTable
; is this item too big
MOV EBX, [EDX].dwSize
CMP EBX, dwSize
JG Retry
;---- past the Opcode ----
;-> encryption buffer
MOV ECX, [EDX].dwSize
MOV EAX, [EDX].dwEncrypt
MOV ECX, [EDX].dwSize
.WHILE ECX != 0
MOV BYTE PTR [EDI], AL
ADD EDI, 1
ROR EAX, 8
DEC ECX
.ENDW
; generate the random num
MOV EAX, [EDX].RandNumType
.IF EAX == 1 || EAX == 2
MOV EBX, EDI
SUB EBX, 1
PUSH 0F8h
CALL rand
INC EAX ; avoid 0 !
MOV dwCurRandNum, EAX
MOV BYTE PTR [EBX], AL
.ENDIF
; update variables/pointers
MOV EAX, [EDX].dwSize
SUB dwSize, EAX
;-> decryption buffer
MOV ECX, [EDX].dwSize
MOV EAX, [EDX].dwDecrypt
SUB ECX, 1
.WHILE ECX != 0
ROR EAX, 8
DEC ECX
.ENDW
MOV ECX, [EDX].dwSize
.WHILE ECX != 0
SUB ESI, 1
MOV BYTE PTR [ESI], AL
ROL EAX, 8
DEC ECX
.ENDW
; generate the random num
MOV EAX, [EDX].RandNumType
.IF EAX == 1
MOV EBX, ESI
ADD EBX, 2
MOV EAX, dwCurRandNum
MOV BYTE PTR [EBX], AL
.ELSEIF EAX == 2
MOV EBX, ESI
ADD EBX, 1
MOV EAX, dwCurRandNum
MOV BYTE PTR [EBX], AL
.ENDIF
ASSUME EDX : NOTHING
Retry:
.UNTIL dwSize == 0
RET
MakePER ENDP
rand PROC USES edx ebx, dwRange : DWORD
MOV EAX, dwRandVal
; save new random number
ADD EAX, 0567h
ROL EAX, 1
MOV dwRandVal, EAX
; get new random number
XOR EDX, EDX
MOV ECX, 32
BitLoop:
SHR EAX, 1
.IF CARRY?
XOR EAX, 013245769h
.ENDIF
LOOP BitLoop
; force dwRange
XOR EDX, EDX
MOV EBX, dwRange
DIV EBX
XCHG EAX, EDX
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏记录
参与人
雪币
留言
时间
一路南寻
为你点赞~
2024-4-3 01:28
東陽不列山
为你点赞~
2024-3-29 03:12
嫉妒的死远点
为你点赞~
2024-2-21 05:44
一笑人间万事
为你点赞~
2024-2-15 03:46
shinratensei
为你点赞~
2023-3-22 04:54
QinBeast
为你点赞~
2023-3-22 04:53
赞赏
他的文章
- 算法请教~~~~~~~~~~ 1438
- 谁能说一下加密软件隐藏导入表的原理啊,万分感谢 6426
看原图
赞赏
雪币:
留言: