首页
社区
课程
招聘
[求助]帮忙看下RING0调用RING3 API 函数
发表于: 2010-7-5 14:31 5871

[求助]帮忙看下RING0调用RING3 API 函数

2010-7-5 14:31
5871
看了论坛上一位同志的 Ring0 MessageBox scr 自己搞了下
成功调用了一些函数 下面这几个匝地也搞不定,大家帮忙看下
//**************************************************************************************
//**************************************************************************************
//模块名字:ULONG HeapAlloc(ULONG hHeap,ULONG dwFlags,ULONG dwBytes)
//模块功能:从堆中分配的内存
//返回数值:
//**************************************************************************************
//参数说明:参数名                        |   输入/输出  |        参数说明
//                          |              |
//                          |              |
//                          |              |
//**************************************************************************************
//**************************************************************************************
/*__declspec ( naked ) void CallBackHeapAlloc(void)//这里改了好多方法也没搞定
{
        _asm
        {
        mov   eax,[esp+4] //四个字节
        push  dword ptr [eax+0xc]
        push  dword ptr [eax+0x8]
        push  dword ptr [eax+0x4]                                   
                call  dword ptr [eax] //两个字节
                retn  0xc//2个字节
                int 3
        }
}
ULONG HeapAllocA(ULONG hHeap,ULONG dwFlags,ULONG dwBytes)
{
    NTSTATUS status;
        ULONG    addrHeapAlloc;
        ULONG    ApiIndex;
        ULONG    KernelCallBackTable;
        ULONG    Arguments[3];//第一个是函数地址,从第二个开始是参数表 4 为MessageBoxA的参数个数
        ULONG    ResultLentgh;
        PVOID    ResultBuffer;
        char     *pBuf=NULL;
        ULONG    buflen=0x1000;
    ULONG    needlen=0;

        __try
        {
                //取CallBackTable的地址
                KernelCallBackTable = GetCallBackTable();
                //取HeapAlloc的地址
                addrHeapAlloc = GetProcAddress(GetModuleHandle("kernel32.dll"),"HeapAlloc");
               
                if (!addrHeapAlloc)
                {
                        DbgPrint("获取 HeapAlloc 地址错误.\n");
                        return;
                }
                //申请内存,准备写入shellcode和参数
                status=ZwAllocateVirtualMemory(NtCurrentProcess(),&pBuf,0,&buflen,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
                if (!NT_SUCCESS(status))
                {
                        DbgPrint("Error, Alloc Usermode Memory Failed.\n");
                     return;
                }
                //开始填充缓冲区
                *(ULONG*)pBuf=(ULONG)pBuf+sizeof(ULONG);//似乎只是为了占位
                RtlCopyMemory(pBuf+4,(char*)CallBackHeapAlloc,30);
                //填充完毕
                //准备参数
                ApiIndex=((ULONG)pBuf - KernelCallBackTable)/4;
               
                Arguments[0]=addrHeapAlloc;
                Arguments[1]=hHeap;
                Arguments[2]=dwFlags;
                Arguments[3]=dwBytes;
                DbgPrint("Call HeapAlloc...\n");
                status=KeUserModeCallback(ApiIndex,Arguments,sizeof(ULONG)*(4),&ResultBuffer,&ResultLentgh);
                DbgPrint("HeapAlloc Status=0x%08X\n",status);
                ZwFreeVirtualMemory(NtCurrentProcess(),&pBuf,&buflen,MEM_RELEASE);
        }
        __except(1)
        {
                DbgPrint("Unknown Error occured.\n");
                return ;
        }       
}
//**************************************************************************************
//**************************************************************************************
//模块名字:ULONG HeapFree(ULONG hHeap,ULONG dwFlags,ULONG dwBytes)
//模块功能:释放从堆中分配的内存
//返回数值:
//**************************************************************************************
//参数说明:参数名                        |   输入/输出  |        参数说明
//                          |              |
//                          |              |
//                          |              |
//**************************************************************************************
//**************************************************************************************
__declspec ( naked ) void CallBackHeapFree(void)
{
        _asm
        {
        mov   eax,[esp+4] //四个字节
        push  dword ptr [eax+0xc]
        push  dword ptr [eax+0x8]
        push  dword ptr [eax+0x4]                                   
                call  dword ptr [eax] //两个字节
                retn  0xc//2个字节
                int 3
        }
}
ULONG HeapFree(ULONG hHeap,ULONG dwFlags,ULONG dwBytes)
{
        ULONG user32Base;
        ULONG addrHeapFree;
        ULONG ApiIndex;
        ULONG KernelCallBackTable;
        ULONG PebAddr;
        ULONG Arguments[3];//第一个是函数地址,从第二个开始是参数表 4 为MessageBoxA的参数个数
        ULONG buflen=0x1000,needlen=0;
        ULONG ResultLentgh;
        PVOID ResultBuffer;
        char *pBuf=NULL;
        NTSTATUS status;

        __try
        {
                //取CallBackTable的地址
                KernelCallBackTable = GetCallBackTable();
                addrHeapFree = GetProcAddress(GetModuleHandle("kernel32.dll"),"HeapAlloc");
                if (!addrHeapFree)
                {
                        DbgPrint("获取 HeapFree 地址错误.\n");
                        return;
                }
                //申请内存,准备写入shellcode和参数
                status=ZwAllocateVirtualMemory(NtCurrentProcess(),&pBuf,0,&buflen,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
                if (!NT_SUCCESS(status))
                {
                        DbgPrint("Error, Alloc Usermode Memory Failed.\n");
                        return;
                }
                //开始填充缓冲区
                *(ULONG*)pBuf=(ULONG)pBuf+sizeof(ULONG);//似乎只是为了占位
                RtlCopyMemory(pBuf+4,(char*)CallBackHeapFree,17);
                //填充完毕
                //准备参数
                ApiIndex=((ULONG)pBuf - KernelCallBackTable)/4;
                Arguments[0]=addrHeapFree;
                Arguments[1]=hHeap;
                Arguments[2]=dwFlags;
                Arguments[3]=dwBytes;
                DbgPrint("Call HeapAlloc...\n");
                status=KeUserModeCallback(ApiIndex,Arguments,sizeof(ULONG)*(3),&ResultBuffer,&ResultLentgh);
                DbgPrint("HeapAlloc Status=0x%08X\n",status);
                ZwFreeVirtualMemory(NtCurrentProcess(),&pBuf,&buflen,MEM_RELEASE);
        }
        __except(1)
        {
                DbgPrint("Unknown Error occured.\n");
                return ;
        }       
}
*/

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 352
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
难道这个就是传说中的沙发 ?
2010-7-5 16:05
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
申请内存为什么一定要用Heap? 你用ZwAllocatVirtualMemory申请到的东西叫什么???
2010-7-5 22:34
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
4
申请的 CallBackHeapAlloc 的空间 还有字符串的空间 ,不过字符串这里没用到,HEAP 是调用RING3我也不知道有别的函数可替代
2010-7-7 12:25
0
游客
登录 | 注册 方可回帖
返回
//