鱼C论坛

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

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

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

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

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

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

  3. INCLUDE WINDOWS.INC
  4. INCLUDELIB IMPORT32.LIB

  5. EXTRN        ExitProcess:PROC
  6. EXTRN        MessageBoxA:PROC
  7. EXTRN        VirtualProtect:PROC

  8. CONTEXT        STRUC
  9.     C_ContextFlags        DD        ?
  10.     C_Dr0                        DD        ?
  11.     C_Dr1                        DD        ?
  12.     C_Dr2                        DD        ?
  13.     C_Dr3                        DD        ?
  14.     C_Dr6                        DD        ?
  15.     C_Dr7                        DD        ?
  16.     C_Float                        DB        70H        DUP(?)
  17.     C_SegGs                        DD        ?
  18.     C_SegFs                        DD        ?
  19.     C_SegEs                        DD        ?
  20.     C_SegDs                        DD        ?
  21.     C_Edi                        DD        ?
  22.     C_Esi                        DD        ?
  23.     C_Ebx                        DD        ?
  24.     C_Edx                        DD        ?
  25.     C_Ecx                        DD        ?
  26.     C_Eax                        DD        ?
  27.     C_Ebp                        DD        ?
  28.     C_Eip                        DD        ?
  29.     C_SegCs                        DD        ?
  30.     C_EFlags                DD        ?
  31.     C_Esp                        DD        ?
  32.     C_SegSs                        DD        ?
  33. CONTEXT        ENDS


  34. EXCEPTION_POINTERS        STRUC
  35.     ExceptionRecord        DD        ?
  36.     ContextRecord        DD        ?
  37. EXCEPTION_POINTERS        ENDS


  38. EXCEPTION_RECORD        STRUC
  39.         ExceptionCode                        DD        ?
  40.         ExceptionFlags                        DD        ?
  41.         LPExceptionRecord                DD        ?
  42.         ExceptionAddress                DD        ?
  43.         NumberParameters                DD        ?
  44.         ExceptionInformation        DD        0FH        DUP(?)
  45. EXCEPTION_RECORD        ENDS

  46. PAGE_EXECUTE_READWRITE = 40H

  47. .DATA
  48.         szMessage        DB        'Hello,World!',0
  49.         szCaption        DB        'Win32 Asm',0
  50.         ddBuffer        DD        0
  51. .CODE


  52. _Start:
  53.         ;代码段不可写,先更改页面保护属性
  54.         PUSH        OFFSET ddBuffer
  55.         PUSH        PAGE_EXECUTE_READWRITE
  56.         PUSH        01000H
  57.         PUSH        OFFSET _Start
  58.         CALL        VirtualProtect
  59.        

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

  70.         ;挂接结构化异常处理函数,拦截单步异常
  71.         ASSUME        FS:NOTHING
  72.         PUSH        OFFSET        _SEH_Entry
  73.         PUSH        DWORD PTR FS:[0]
  74.         MOV                FS:[0],ESP
  75.        
  76.         ;将单步标志置1,使程序进入单步执行
  77.         PUSHFD
  78.         OR                DWORD PTR [ESP],0100H
  79.         POPFD
  80. _StepBegin:
  81.         NOP       
  82. _SM@1:        PUSH        EBP
  83. _SM@2:        MOV                EBP,ESP
  84. _SM@3:        PUSHFD
  85. _SM@4:        PUSH        MB_OK
  86. _SM@5:        PUSH        OFFSET        szCaption
  87. _SM@6:        PUSH        OFFSET        szMessage
  88. _SM@7:        PUSH        NULL
  89. _SM@8:        CALL        MessageBoxA
  90.                 POPFD
  91.                 NOP
  92. _SM@9:        MOV                ESP,EBP
  93. _SM@10:        POP                EBP
  94. _SM@11:        NOP
  95.        
  96.         ;恢复结构化异常处理链,退出程序
  97.         POP                DWORD PTR FS:[0]
  98.         ADD                ESP,4
  99.         PUSH        0
  100.         CALL        ExitProcess


  101. ;DWORD __cdecl ExceptionFilter(EXCEPTION_RECORD * lpRecord,EXCEPTION_REGISTRATION * lpRegist,CONTEXT * lpContext,DWORD * dwParam)
  102. ;进入函数后,栈状态如下
  103. ;        [ESP+20]        DWORD * dwParam
  104. ;        [ESP+16]        CONTEXT *
  105. ;        [ESP+12]        EXCEPTION_REGISTRATION *
  106. ;        [ESP+8]                EXCEPTION_RECORD *
  107. ;        [ESP+4]                return address
  108. ;        [EBP]                original EBP
  109. _SEH_Entry        PROC
  110.         PUSH        EBP
  111.         MOV                EBP,ESP
  112.         PUSH        ECX
  113.         PUSH        ESI

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

  121.         ;非单步异常则交给系统处理
  122.         XOR                EAX,EAX
  123.         INC                EAX
  124.         JMP                _Exit
  125. _Step:
  126.         ;取单步异常发生的地址,即即将执行的下一条指令的地址
  127.         MOV                ESI,DWORD PTR [EBP + 16]
  128.         MOV                ESI,[ESI].C_Eip
  129.        
  130.         ;只处理加密代码
  131.         ;EIP < SM@1 或 EIP > SM@11
  132.         LEA                EAX,_SM@1
  133.         CMP                ESI,EAX
  134.         JL                _Exit_1
  135.         LEA                EAX,_SM@11
  136.         CMP                ESI,EAX
  137.         JG                _Exit_0
  138.        
  139.         ;MessageBoxA显示一下EIP的值
  140.         PUSH        0
  141.         PUSH        ESI
  142.         CALL        _ShowDWORD
  143.        
  144.         ;获取下一条指令长
  145.         ;一次只解密一条指令
  146.         LEA                ESI,codeLen
  147.         ADD                ESI,codeCount
  148.        
  149.         XOR                ECX,ECX
  150.         MOV                CL,BYTE PTR [ESI]
  151.        
  152.         ;总共加密了10条指令,超过10则退出了
  153.         INC                codeCount
  154.         CMP                codeCount,10
  155.         JG                _Exit_0
  156.        
  157.         ;循环解密指令
  158.         MOV                ESI,DWORD PTR [EBP + 16]
  159.         MOV                ESI,[ESI].C_Eip
  160. _Loop1:
  161.         XOR                BYTE PTR [ESI],055H
  162.         INC                ESI
  163.         LOOP        _Loop1
  164.        
  165.         ;继续将单步标志置1,下下条指令将继续触发单步异常
  166. _Exit_1:
  167.         MOV                ESI,DWORD PTR [EBP + 16]
  168.         OR                [ESI].C_EFlags,0100H
  169. _Exit_0:
  170.         ;告诉系统,异常已修复,可以继续执行
  171.         XOR                EAX,EAX
  172.         ;INC                EAX
  173. _Exit:
  174.         POP                ESI
  175.         POP                ECX
  176.         MOV                ESP,EBP
  177.         POP                EBP
  178.         RET
  179. _SEH_Entry        ENDP

  180. _ShowDWORD        PROC
  181.         PUSH        EBP
  182.         MOV                EBP,ESP

  183.         SUB                ESP,12

  184.         PUSH        EAX
  185.         PUSH        ECX
  186.         PUSH        EDI
  187.         PUSHF
  188.        
  189.         STD

  190.         MOV                EDI,EBP
  191.         DEC                EDI
  192.        
  193.         MOV                AL,0
  194.         STOSB
  195.         MOV                AL,'H'
  196.         STOSB
  197.        
  198.         MOV                EAX,DWORD PTR [EBP+8]
  199.         MOV                ECX,8

  200. _Hex2Ascii:
  201.         PUSH        EAX
  202.         AND                AL,0FH
  203.         ADD                AL,030H
  204.         CMP                AL,039H
  205.         JLE                _IsNumber
  206.         ADD                AL,7
  207. _IsNumber:
  208.         STOSB
  209.         POP                EAX
  210.         SHR                EAX,4
  211.         LOOP        _Hex2Ascii
  212.        

  213.         MOV                AL,'X'
  214.         STOSB
  215.         MOV                AL,'0'
  216.         STOSB

  217.         INC                EDI
  218.         CLD

  219.         PUSH        0
  220.         PUSH        0
  221.         PUSH        EDI
  222.         PUSH        0
  223.         CALL        MessageBoxA
  224.        
  225.         POPF
  226.         POP                EDI
  227.         POP                ECX
  228.         POP                EAX
  229.        
  230.         ADD                ESP,12
  231.         MOV                ESP,EBP
  232.         POP                EBP
  233.         RET                8
  234. _ShowDWORD        ENDP


  235. len0 =  OFFSET _SM@11 - OFFSET _SM@1
  236. len1 =        OFFSET _SM@2 - OFFSET _SM@1
  237. len2 =         OFFSET _SM@3 - OFFSET _SM@2
  238. len3 =         OFFSET _SM@4 - OFFSET _SM@3
  239. len4 =         OFFSET _SM@5 - OFFSET _SM@4
  240. len5 =         OFFSET _SM@6 - OFFSET _SM@5
  241. len6 =         OFFSET _SM@7 - OFFSET _SM@6
  242. len7 =         OFFSET _SM@8 - OFFSET _SM@7
  243. len8 =        OFFSET _SM@9 - OFFSET _SM@8
  244. len9 =         OFFSET _SM@10 - OFFSET _SM@9
  245. len10 =        OFFSET _SM@11 - OFFSET _SM@10


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

复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-11-4 20:17:51 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-11-6 11:13:31 | 显示全部楼层
牛逼
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-11-6 21:41:14 | 显示全部楼层
佩服
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-2 10:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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