首页
社区
课程
招聘
[原创]shellcode框架,纯属娱乐
发表于: 2010-12-2 15:20 15598

[原创]shellcode框架,纯属娱乐

2010-12-2 15:20
15598

这个框架只是为了得到LoadLibray,以及自己实现了GetProcAddress。
// shellcode.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>

void _declspec(naked) shellcode()
{
        __asm
        {
                pushad;
                mov ebp,esp;
                sub esp,2000h;//create a stack
                jmp seh_to_base;
funcs_1://LoadLibraryA:0x75399faf
                __emit 0afh;
                __emit 09fh;
                __emit 039h;
                __emit 075h;
//GetProcAddress:0xdc25496b
                //__emit 06bh;
                //__emit 049h;
                //__emit 025h;
                //__emit 0dch;
//CreateFileA :0x147d9b2b
                __emit 02bh;
                __emit 09bh;
                __emit 07dh;
                __emit 014h;
//WriteFile :0x046d7121
                __emit 021h;
                __emit 071h;
                __emit 06dh;
                __emit 004h;
//CloseHandle :0x15bd1b24
                __emit 024h;
                __emit 01bh;
                __emit 0bdh;
                __emit 015h;
//WinExec :0x04c95129
                __emit 029h;
                __emit 051h;
                __emit 0c9h;
                __emit 004h;
seh_to_base:
                mov esi,fs:[30h];//得到peb
                mov esi,[esi+0ch];//得到Ldr
                mov esi,[esi+1ch];//得到InInitializationOrderModuleList
                mov esi,[esi];//第一个链表的位置。ntdll
                mov esi,[esi+08h];//第二个链表的位置。kernel32

                mov edx,5;
get_base_func:
                push edx;
                push esi;
                push esi;//dll base
                mov eax,funcs_1;
                mov eax,[eax+edx*4-4];
                push eax;
                call getprocaddress;//eax返回的为函数地址
                pop esi;
                pop edx;
                dec edx;
                jne get_base_func;

                //加载动态链接库
                add esp,2000h;
                popad;
                retn;

getprocaddress://除了esp,ebp以外,都可以使用。
                mov esi,[esp+8h];//得到头部偏移地址
                mov eax,[esi+3ch];//pe偏移
                lea eax,[esi+eax+78h];//数据目录表中导出表的位置
                mov eax,[eax];//导出表的偏移
                lea eax,[esi+eax];
                push eax;
                mov esi,[eax+20h];//函数名偏移
                mov ecx,[eax+18h];
                push esi;
                add esi,[esp+0ch];
                push [esp+0ch];//hash
                push [esp+14h];//dll base
                call strloop;
                pop ecx;
                mov ecx,[ecx+01ch];
                add ecx,[esp+8h];
                lea ecx,[ecx+eax*4-4];
                mov eax,[ecx];
                add eax,[esp+8h];
                ret 8h;

strloop://作用为从一个导出表里面查找一个特定hash值的字符串的索引
                mov eax,[esp+0ch];//函数名指针地址表偏移
                mov ebx,[esp+4h];//dll base
                lea eax,[eax+ebx];//函数名指针地址表偏移
                lea eax,[eax+ecx*4-4];//字符串位置
                mov eax,[eax];
                lea edi,[ebx+eax];//得到本次查询函数名的偏移
                xor eax,eax;
                push edx;
                xor edx,edx;
                call hash_loop;
                pop edx;
                cmp eax,[esp+8h];
                jz end;
                dec ecx;
                jne strloop;
end:
                mov eax,ecx;
                ret 0ch;

               
hash_loop://作用为求一个字符串的hash值
                xor dl,byte ptr [edi];
                ror edx,11;
                scasb;
                jne hash_loop;
                mov eax,edx;
                retn;
        }
}
void GenHash()
{
        char * kernel32[] =
        {
                "GetProcAddress",
                "LoadLibraryA",
                "CreateFileA",
                "WriteFile",
                "CloseHandle",
                "WinExec"
        };
        char * ws2_32[] =
        {
                "socket",
                "bind",
                "gethostname",
                "gethostbyname",
                "recv"
        };
        for(int i=0; i<sizeof(kernel32)/4; i++)
        {
                char * tmp = kernel32[i];
                DWORD result = 0;
                __asm
                {
                        pushad;
                        xor edx,edx;
                        xor eax,eax;
                        mov edi,tmp;
hash_loop:
                        xor dl,byte ptr [edi];
                        ror edx,11;
                        scasb;
                        jne hash_loop;
                        lea eax,[result];
                        mov [eax],edx;
                        popad;
                }
                fprintf(stdout,"%s :0x%08x\n",kernel32[i],result);
        }

       
}
int _tmain(int argc, _TCHAR* argv[])
{
        //GenHash();
        shellcode();
        return 0;
}


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (18)
雪    币: 53
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
WIN7下不行
2010-12-2 16:20
0
雪    币: 266
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
强力mark
2010-12-2 17:46
0
雪    币: 30
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
不好意思,win7下没有测试过……
2010-12-2 20:06
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
5
win7中,kerlnel32.dll是位于第三个模块,而不再跟以前一样位于第二模块。
2010-12-3 07:43
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
shellcode寻找win7中的kernel32.dll ——http://skypher.com/index.php/2009/07/22/shellcode-finding-kernel32-in-windows-7/
2010-12-3 09:01
0
雪    币: 30
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
谢谢riusksk。
2010-12-3 12:35
0
雪    币: 768
活跃值: (540)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
8
强,学习Shell
2010-12-3 15:33
0
雪    币: 1149
活跃值: (908)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
9
膜拜。。。ing
2010-12-4 19:12
0
雪    币: 89
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我XP  也不行?

mov eax,[eax+edx*4-4];  这就挂了
2010-12-4 21:25
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
无奈了
2010-12-5 07:33
0
雪    币: 65
活跃值: (118)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
12
看看shellcode
2010-12-5 13:45
0
雪    币: 30
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
[QUOTE=swlilike;898727]我XP  也不行?

mov eax,[eax+edx*4-4];  这就挂了[/QUOTE]

能否把各个寄存器的值传上来?看看究竟是怎么回事。
2010-12-5 23:13
0
雪    币: 89
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
EAX = 75399FAF EBX = 7FFD9000
ECX = 00000000 EDX = 00000005
ESI = 7C800000 EDI = 0012FF80
EIP = 0040106E ESP = 0012DF04
EBP = 0012FF10 EFL = 00000202
2010-12-6 12:51
0
雪    币: 30
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
看起来貌似正常,不知道你是什么系统。不过我的代码只是一个框架,没有做兼容性处理,做了一些原理注释,可以根据原理自己跟踪调试一下。
2010-12-7 09:43
0
雪    币: 21
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
楼主可以考虑对指令进行精简优化

哎,不错,我就没有这耐心写个框架
2010-12-7 10:41
0
雪    币: 107
活跃值: (419)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
技术强帖啊。。。。。。。。。。
2010-12-7 10:49
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
楼上的fido好啊
2010-12-7 13:05
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19
灌水........

学习ing..............
2010-12-8 12:52
0
游客
登录 | 注册 方可回帖
返回
//