반응형

오늘 역시 삽질을 해버렸다.


내가 처음 구현했던 방식은 이전 게시글을 바탕으로 아예 CreateRemoteThread를 막아버리는 거였는데,


그렇게 하면 ZwCreateRemoteThread 함수로 Wrapping되어있기 때문에 판별하는 방법이 한정된다.


그래서 나는 아래와 같은 코드로 구현을 해봤었다.



if ((DWORD)ProcessHandle == 0xffffffff){
	DbgPrint("Call Original ZwCreateThreadEx");
	return OrgZwCreateThreadEx(ThreadHandle, DesiredAccess, ObjectAttributes, ProcessHandle,
			StartRoutine, Argument, CreateFlags, ZeroBits, StackSize, MaximumStackSize, AttributeList);
}

return STATUS_UNSUCCESSFUL;


하지만 어째선지 다른 RTL 계 함수들이 호출되는 걸 볼 수 있었고, 나중에는 결국 뻑 나가게 된다.


그래서 그냥 Argument 안에 .dll이 있는지 없는지만 검사를 해서 넘겨줬지만,


그마저도 RemoteThread에서 다른 프로세스의 값을 읽어야되는 상태가 되버려서 뻑 나가게 되버렸다.


결국 나는 아래와 같이 구현하려고 생각한다.


먼저 ZwQuerySystemInformation 함수를 호출해서 해당 인젝션 당하는 프로세스의 정보를 얻어와


PsLookupProcessByProcessId 함수를 통해 EPROCESS를 얻어온다.


그 EPROCESS를 기반으로 그 프로세스를 Attach해서 인자값을 읽어와 .dll이 포함되있다면 무시하도록 한다.


결론, 아직 구현은 못했다 내일 아마 해야할듯;;


아 참, 커널에서 힙을 할당하는 건 ExAllocatePool를 사용하면 된다.


ex)

PVOID proc = ExAllocatePool(NonPagedPool, sizeof(struct _SYSTEM_PROCESSES) * 10);

블로그 이미지

KuroNeko_

KuroNeko

,