看了论坛上一位同志的 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期)