首页
社区
课程
招聘
[求助]如果修改虚拟内存的类型为MEM_IMAGE
发表于: 2016-5-15 15:57 5834

[求助]如果修改虚拟内存的类型为MEM_IMAGE

2016-5-15 15:57
5834
问题起因:
在WINDOW7下对一程序进行代码注入时,由VirtualAllocEx分配内存写入代码【代码1】,如果代码中包括有异常处理代码(SEH),并且目标进程调用过SetUnhandledExceptionFilter【代码代码 代码2】,则不会进入异常处理代码。
原因:
当发生异常时会进入ntdll!KiUserExceptionDispatcher,在此函数的sub_7DED3369->sub_7DED3238对传的的error_handle有检测【代码2】,判断传入的error_handle的虚拟内存类型是不是MEM_IMAGE[0x1000000],不是则RtlRaiseException。

解决办法 :
修改VirtualAllocEx所分配内存的类型,从MEM_PRIVATE变为MEM_IMAGE。或有其他的解决办法。希望各位不吝赐教。
问题:
请问怎么修改虚拟内存的类型。
【代码1】
__declspec(naked) int _call_function()
{
	__asm {

		PUSH EBP;//save ebp (used to address stack frame)
		MOV  EBP, ESP;//use EBP as stack frame pointer
		SUB ESP, __LOCAL_SIZE;//make 16 dwords on stack for local data
		;//**************** install handler and its ERR structure
		PUSHAD;
		PUSHFD;
		//构造  _EXCEPTION_HXSTACK
		PUSH EBP;//ERR+14h save ebp (being ebp at safe-place)
		PUSH 0;//ERR+10h area for flags
		PUSH 0;//ERR+0Ch information for handler
		PUSH OFFSET SAFE_PLACE;//ERR+8h new eip at safe-place
		;//PUSH _except_handler_new;//ERR+4h address of handler
		PUSH OFFSET HANDLER
		 //PUSH FS:[0]						;//ERR+0h keep next ERR up the chain
		 //MOV FS:[0],ESP					;//point to ERR just made on the stack
		mov		  eax, dword ptr fs : [00000000h];
		push        eax;
		mov         eax, esp;
		mov         dword ptr fs : [00000000h], eax;


		mov ebx, 0x1254;

		mov eax, 0;
		mov[eax], 0


	SAFE_PLACE:;//handler sets eip/esp/ebp for here
		POP FS : [0];//restore next ERR up the chain
		ADD	ESP, 0x16;// sizeof _EXCEPTION_HXSTACK

		POPFD;
		POPAD;

		MOV ESP, EBP;
		POP EBP;
		RET;

	HANDLER:

		PUSH EBP;
		MOV EBP, ESP;
		SUB ESP, __LOCAL_SIZE;
		PUSH EBX;
		PUSH EDI;
		PUSH ESI;

		MOV EBX, [EBP + 8];// get exception record in ebx
		TEST[EBX + 4], 01h;// see if its a non - continuable exception
		JNZ  L5;// yes, so must not deal with it
		TEST[EBX + 4], 02h;// see if its EH_UNWINDING(from Unwind)
		JZ	L2;// no
		JMP L5;// must return 1 to go to next handler
	L2:
		PUSH 0;// return value(not used)
		PUSH[EBP + 8h];// pointer to this exception record
		PUSH OFFSET UN23;// code address for RtlUnwind to return
		PUSH[EBP + 0Ch];// pointer to this ERR structure
		CALL RtlUnwind;
	UN23:
		MOV ESI, [EBP + 10h];// get context record in esi
		MOV EDX, [EBP + 0Ch];// get pointer to ERR structure
		MOV[ESI + 0C4h], EDX;// use it as new esp
		MOV EAX, [EDX + 8];// get safe place given in ERR structure
		MOV[ESI + 0B8h], EAX;// insert new eip
		MOV EAX, [EDX + 14h];// get ebp at safe place given in ERR
		MOV[ESI + 0B4h], EAX;// insert new ebp
		MOV EAX, 1;// get eax at safe place given in ERR
		MOV[ESI + 0B0h], EAX;// insert new return value

		XOR EAX, EAX;// reload context & return to system eax = 0
		JMP L6;
	L5:
		MOV EAX, 1;// go to next handler - return eax = 1
	L6:
		POP ESI;
		POP EDI;
		POP EBX;
		MOV ESP, EBP;
		POP EBP;
		RET;// ordinary return (no actual arguments)

	}

}
int main() {

	_call_function();
	return 0;


}


【代码2】
.text:7DED339E                 and     [ebp+ProcessInformation], 0
.text:7DED33A2                 push    0               ; ReturnLength
.text:7DED33A4                 push    4               ; ProcessInformationLength
.text:7DED33A6                 mov     ebx, eax
.text:7DED33A8                 lea     eax, [ebp+ProcessInformation]
.text:7DED33AB                 push    eax             ; ProcessInformation
.text:7DED33AC                 push    22h             ; ProcessInformationClass
.text:7DED33AE                 or      edi, 0FFFFFFFFh
.text:7DED33B1                 push    edi             ; ProcessHandle
.text:7DED33B2                 mov     byte ptr [ebp+arg_0+3], 1
.text:7DED33B6                 call    ZwQueryInformationProcess
………………………………………………
text:7DEE3B70                                         ; f__________sub_7DED3238+2D073j
.text:7DEE3B70                 mov     eax, [ebp+ProcessInformation]
.text:7DEE3B73                 and     eax, 30h
.text:7DEE3B76                 cmp     al, 30h
.text:7DEE3B78                 jz      loc_7DED32A2
.text:7DEE3B7E                 jmp     loc_7DF002B0

【代码3】
770F02B0    8D45 EC         lea     eax, dword ptr [ebp-14]
770F02B3    50              push    eax
770F02B4    6A 1C           push    1C
770F02B6    8D45 D0         lea     eax, dword ptr [ebp-30]
770F02B9    50              push    eax
770F02BA    57              push    edi
770F02BB    53              push    ebx   ;/////这里是传入的error_handler
770F02BC    6A FF           push    -1
770F02BE    E8 25F9F8FF     call    ZwQueryVirtualMemory
770F02C3    85C0            test    eax, eax
770F02C5  ^ 0F8C D72FFDFF   jl      770C32A2
770F02CB    F645 E4 F0      test    byte ptr [ebp-1C], 0F0
770F02CF    74 3A           je      short 770F030B
770F02D1    817D E8 0000000>cmp     dword ptr [ebp-18], 1000000 ;//判断是不是MEM_IMAGE类型,关键是这里。
770F02D8    75 24           jnz     short 770F02FE
770F02DA    8D45 F8         lea     eax, dword ptr [ebp-8]
770F02DD    50              push    eax
770F02DE    8D45 F4         lea     eax, dword ptr [ebp-C]
770F02E1    50              push    eax
770F02E2    FF75 D4         push    dword ptr [ebp-2C]
770F02E5    E8 63DBFAFF     call    7709DE4D



附加上测试程序:
Debug.7z
注入程序后会跳二次对话框,点第一次后在DEBUGVIEW里会打印出
[3652] DllMain = 0x295AA778
[3652] FS:[0] = 0x18FBCC

请用OD进入 0x295AA778【DllMain = 0x295AA778】
在下在的异常产生处,下个断点开始跟进。
295B8DCF    C700 09000000   mov     dword ptr [eax], 9

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 144
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
恩,我想起了以前遇到的一个问题。shellcode中使用SEH时总是不能够正常调用。以前一直不知道啥原因
2016-5-15 16:20
0
雪    币: 189
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
是的。就是这个原因引起的。在WINDOWS10下,好像可以。
2016-5-15 16:27
0
雪    币: 144
活跃值: (335)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不错。。。。
2016-5-15 17:09
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
PUSH OFFSET SAFE_PLACE
不用重定位吗?
2016-5-15 21:02
0
雪    币: 189
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
RtlUnwind 需要定位。
2016-5-16 03:10
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你都注入进来了,直接把ZwQueryInformationProcess也顺手hook了呗
2016-5-19 12:14
0
雪    币: 189
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
嗯,这个也不失为一个办法,但是最终还是修改了代码,对于某些有检测的程度来说,还是不太好。
2016-7-1 06:13
0
游客
登录 | 注册 方可回帖
返回
//