鱼C论坛

 找回密码
 立即注册
查看: 3161|回复: 3

[技术交流] 代码放送【将代码加密后逐条解密执行,可用于壳代码的加密】

[复制链接]
发表于 2016-10-25 16:36:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 康小泡 于 2016-10-26 10:42 编辑
.386
.MODEL FLAT

INCLUDE WINDOWS.INC
INCLUDELIB IMPORT32.LIB

EXTRN        ExitProcess:PROC
EXTRN        MessageBoxA:PROC
EXTRN        VirtualProtect:PROC

CONTEXT        STRUC
    C_ContextFlags        DD        ?
    C_Dr0                        DD        ?
    C_Dr1                        DD        ?
    C_Dr2                        DD        ?
    C_Dr3                        DD        ?
    C_Dr6                        DD        ?
    C_Dr7                        DD        ?
    C_Float                        DB        70H        DUP(?)
    C_SegGs                        DD        ?
    C_SegFs                        DD        ?
    C_SegEs                        DD        ?
    C_SegDs                        DD        ?
    C_Edi                        DD        ?
    C_Esi                        DD        ?
    C_Ebx                        DD        ?
    C_Edx                        DD        ?
    C_Ecx                        DD        ?
    C_Eax                        DD        ?
    C_Ebp                        DD        ?
    C_Eip                        DD        ?
    C_SegCs                        DD        ?
    C_EFlags                DD        ?
    C_Esp                        DD        ?
    C_SegSs                        DD        ?
CONTEXT        ENDS


EXCEPTION_POINTERS        STRUC
    ExceptionRecord        DD        ?
    ContextRecord        DD        ?
EXCEPTION_POINTERS        ENDS


EXCEPTION_RECORD        STRUC
        ExceptionCode                        DD        ?
        ExceptionFlags                        DD        ?
        LPExceptionRecord                DD        ?
        ExceptionAddress                DD        ?
        NumberParameters                DD        ?
        ExceptionInformation        DD        0FH        DUP(?)
EXCEPTION_RECORD        ENDS

PAGE_EXECUTE_READWRITE = 40H

.DATA
        szMessage        DB        'Hello,World!',0
        szCaption        DB        'Win32 Asm',0
        ddBuffer        DD        0
.CODE


_Start:
        ;代码段不可写,先更改页面保护属性
        PUSH        OFFSET ddBuffer
        PUSH        PAGE_EXECUTE_READWRITE
        PUSH        01000H
        PUSH        OFFSET _Start
        CALL        VirtualProtect
        

        ;将单步执行的代码加密
        ;简单加密,即每一个字节与 055H 进行异或运算
        MOV                AL,055H
        LEA                EDI,_SM@1
        PUSH        len0
        POP                ECX
@Loop:
        XOR                BYTE PTR [EDI],AL
        INC                EDI
        LOOP        @Loop

        ;挂接结构化异常处理函数,拦截单步异常
        ASSUME        FS:NOTHING
        PUSH        OFFSET        _SEH_Entry
        PUSH        DWORD PTR FS:[0]
        MOV                FS:[0],ESP
        
        ;将单步标志置1,使程序进入单步执行
        PUSHFD
        OR                DWORD PTR [ESP],0100H
        POPFD
_StepBegin:
        NOP        
_SM@1:        PUSH        EBP
_SM@2:        MOV                EBP,ESP
_SM@3:        PUSHFD
_SM@4:        PUSH        MB_OK
_SM@5:        PUSH        OFFSET        szCaption
_SM@6:        PUSH        OFFSET        szMessage
_SM@7:        PUSH        NULL
_SM@8:        CALL        MessageBoxA
                POPFD
                NOP
_SM@9:        MOV                ESP,EBP
_SM@10:        POP                EBP
_SM@11:        NOP
        
        ;恢复结构化异常处理链,退出程序
        POP                DWORD PTR FS:[0]
        ADD                ESP,4
        PUSH        0
        CALL        ExitProcess


;DWORD __cdecl ExceptionFilter(EXCEPTION_RECORD * lpRecord,EXCEPTION_REGISTRATION * lpRegist,CONTEXT * lpContext,DWORD * dwParam)
;进入函数后,栈状态如下
;        [ESP+20]        DWORD * dwParam
;        [ESP+16]        CONTEXT *
;        [ESP+12]        EXCEPTION_REGISTRATION *
;        [ESP+8]                EXCEPTION_RECORD *
;        [ESP+4]                return address
;        [EBP]                original EBP
_SEH_Entry        PROC
        PUSH        EBP
        MOV                EBP,ESP
        PUSH        ECX
        PUSH        ESI

        ;取异常代码
        MOV                ESI,DWORD PTR [EBP + 8]
        MOV                EAX,[ESI].ExceptionCode
        
        ;只处理单步异常
        CMP                EAX,080000004H
        JE                _Step

        ;非单步异常则交给系统处理
        XOR                EAX,EAX
        INC                EAX
        JMP                _Exit
_Step:
        ;取单步异常发生的地址,即即将执行的下一条指令的地址
        MOV                ESI,DWORD PTR [EBP + 16]
        MOV                ESI,[ESI].C_Eip
        
        ;只处理加密代码
        ;EIP < SM@1 或 EIP > SM@11
        LEA                EAX,_SM@1
        CMP                ESI,EAX
        JL                _Exit_1
        LEA                EAX,_SM@11
        CMP                ESI,EAX
        JG                _Exit_0
        
        ;MessageBoxA显示一下EIP的值
        PUSH        0
        PUSH        ESI
        CALL        _ShowDWORD
        
        ;获取下一条指令长
        ;一次只解密一条指令
        LEA                ESI,codeLen
        ADD                ESI,codeCount
        
        XOR                ECX,ECX
        MOV                CL,BYTE PTR [ESI]
        
        ;总共加密了10条指令,超过10则退出了
        INC                codeCount
        CMP                codeCount,10
        JG                _Exit_0
        
        ;循环解密指令
        MOV                ESI,DWORD PTR [EBP + 16]
        MOV                ESI,[ESI].C_Eip
_Loop1:
        XOR                BYTE PTR [ESI],055H
        INC                ESI
        LOOP        _Loop1
        
        ;继续将单步标志置1,下下条指令将继续触发单步异常
_Exit_1:
        MOV                ESI,DWORD PTR [EBP + 16]
        OR                [ESI].C_EFlags,0100H
_Exit_0:
        ;告诉系统,异常已修复,可以继续执行
        XOR                EAX,EAX
        ;INC                EAX
_Exit:
        POP                ESI
        POP                ECX
        MOV                ESP,EBP
        POP                EBP
        RET
_SEH_Entry        ENDP

_ShowDWORD        PROC
        PUSH        EBP
        MOV                EBP,ESP

        SUB                ESP,12

        PUSH        EAX
        PUSH        ECX
        PUSH        EDI
        PUSHF
        
        STD

        MOV                EDI,EBP
        DEC                EDI
        
        MOV                AL,0
        STOSB
        MOV                AL,'H'
        STOSB
        
        MOV                EAX,DWORD PTR [EBP+8]
        MOV                ECX,8

_Hex2Ascii:
        PUSH        EAX
        AND                AL,0FH
        ADD                AL,030H
        CMP                AL,039H
        JLE                _IsNumber
        ADD                AL,7
_IsNumber:
        STOSB
        POP                EAX
        SHR                EAX,4
        LOOP        _Hex2Ascii
        

        MOV                AL,'X'
        STOSB
        MOV                AL,'0'
        STOSB

        INC                EDI
        CLD

        PUSH        0
        PUSH        0
        PUSH        EDI
        PUSH        0
        CALL        MessageBoxA
        
        POPF
        POP                EDI
        POP                ECX
        POP                EAX
        
        ADD                ESP,12
        MOV                ESP,EBP
        POP                EBP
        RET                8
_ShowDWORD        ENDP


len0 =  OFFSET _SM@11 - OFFSET _SM@1
len1 =        OFFSET _SM@2 - OFFSET _SM@1
len2 =         OFFSET _SM@3 - OFFSET _SM@2
len3 =         OFFSET _SM@4 - OFFSET _SM@3
len4 =         OFFSET _SM@5 - OFFSET _SM@4
len5 =         OFFSET _SM@6 - OFFSET _SM@5
len6 =         OFFSET _SM@7 - OFFSET _SM@6
len7 =         OFFSET _SM@8 - OFFSET _SM@7
len8 =        OFFSET _SM@9 - OFFSET _SM@8
len9 =         OFFSET _SM@10 - OFFSET _SM@9
len10 =        OFFSET _SM@11 - OFFSET _SM@10


DB 'xieglt',0
codeCount        DD        0
codeLen                DB        len1,len2,len3,len4,len5,len6,len7,len8,len9,len10
END _Start

评分

参与人数 1鱼币 +5 收起 理由
爱学习520 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-4 20:17:51 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-6 11:13:31 | 显示全部楼层
牛逼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-6 21:41:14 | 显示全部楼层
佩服
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 20:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表