能力值:
( LV13,RANK:460 )
|
-
-
7 楼
你的visual c++ 编译器在构建 myhack3.dll 的过程中,把字节码数组 g_InjectionCode 放到了全局数据段中,通常情况该段会被映射进内存的不可执行页,于是将控制转移到这种页面时就会传递一个STATUS_ACCESS_VIOLATION(0xc0000005)异常到尝试非法引用的线程。
有几种解决办法:
1。重构你的 myhack3.c 源码,将shellcode 数组放在 DllMain() 中试试。
2。如果还是非法访问,则在 DllMain() 中,通过 windows API VirtualAlloc() 为 shellcode 分配内存空间,接下来,通过 VirtualProtect() ,并且传入符号常量 PAGE_EXECUTE,PAGE_EXECUTE_READ,PAGE_EXECUTE_READWRITE 的其中之一,从而将 shellcode 映射的页面属性设置为可读写或可执行,或三者。建议你传入 PAGE_EXECUTE_READWRITE ,如果传入 PAGE_EXECUTE(仅执行),在写入(修改)数组时还是会生成 0xc0000005。
这 2 个函数的使用详解可以参考 MSDN 文档。
3。在桌面上右击“计算机”图标->“属性”->“高级系统设置”->点击“高级”选项卡的“性能”栏目的“设置”->“数据执行保护”选项卡,将你要注入的 dll 和可执行文件添加到 DEP 的例外列表中。
4。将 Visual Studio 的/NXCOMPAT 链接器标志改为 no,然后重新构建你的 dll 工程文件。
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
第一次上传的代码这里出错了
hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&g_InjectionCode,(LPVOID)&pFunc,0,NULL);
(LPVOID)&pFunc改为(LPVOID)pFunc pFunc本来就是函数MessageBox的地址,按我第一次写的,就是取函数地址的地址了。
这是我改正后的代码。我给传一下
#include "windows.h"
#include "iostream"
#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) void dummy()
{
return;
}
#ifdef __cplusplus
}
#endif//dll对外提供的函数
BYTE g_InjectionCode[] =
{
0x55,0x8b,0xec,0x8b,0x45,0x08,0x6a,0x00,0xe8,0x0c,0x00,0x00,0x00,
0x52,0x65,0x76,0x65,0x72,0x73,0x65,0x43,0x6f,0x72,0x65,0x00,0xe8,
0x14,0x00,0x00,0x00,0x77,0x77,0x77,0x2e,0x72,0x65,0x76,0x65,0x72,
0x73,0x65,0x63,0x6f,0x72,0x65,0x2e,0x63,0x6f,0x6d,0x00,0x6a,0x00,
0xff,0xd0,0x33,0xc0, 0x8b,0xe5,0x5d,0xc3
};
/*
004010ED 55 PUSH EBP
004010EE 8BEC MOV EBP,ESP
004010F0 8B75 08 MOV EAX,DWORD PTR SS:[EBP+8] ; EAX = pParam
004011F3 6A 00 PUSH 0 ; - MB_OK (0)
004011F5 E8 0C000000 CALL 0040112C
004011FA <ASCII> ; - "ReverseCore", 0
00401201 E8 14000000 CALL 00401145
00401206 <ASCII> ; - "www.reversecore.com", 0
00401215 6A 00 PUSH 0 ; - hWnd (0)
00401217 FFD0 CALL EAX ; MessageBoxA(0, "www.reversecore.com", "ReverseCore", 0)
00401219 33C0 XOR EAX,EAX
0040121B 8BE5 MOV ESP,EBP
0040121D 5D POP EBP
0040121E C3 RETN
*/
BOOL APIENTRY DllMain(HANDLE hMoudle,DWORD reason,LPVOID lpReserved) //dllmain函数
{
HANDLE hThread = NULL;
HMODULE hMod = NULL;
FARPROC pFunc;
hMod = LoadLibraryA("user32.dll");
pFunc = GetProcAddress(hMod,"MessageBoxA");
PVOID pvMem = VirtualAlloc(NULL,sizeof(g_InjectionCode),MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
WriteProcessMemory(INVALID_HANDLE_VALUE,pvMem,(LPVOID)&g_InjectionCode,sizeof(g_InjectionCode),NULL);
switch(reason)
{
case DLL_PROCESS_ATTACH:
hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)pvMem,(LPVOID)pFunc,0,NULL);
return TRUE;
default:
return TRUE;
}
}
先使用virtualalloc申请内存页,然后使用writevritualmem向内存页写汇编代码。内存页属性一定要是Page_Execute_ReadWrite
|