Q&A

  • 키보드 후킹을 만들었는데요, 한가지 에러가..
안녕하세요. 까마귀입니다.



여기 및 델코의 강좌란을 토대로 키보드 후킹을 만들었는데요.

메모리 맵을 사용해서 구현했습니다. DLL로...

버튼을 누르면 키보드가 아무것도 않 먹히도록.

강좌의 예제 소스가 위의 것을 구현한거라서 베껴서 만들었지요.

그런데, 한가지 문제가 생기더군요.

일단 프로그램을 실행해서 키보드가 않 먹도록 했고요.

다음에 윈도우창의 시작/실행을 눌러서 거기에 글이 써지는지 확인을 했습니다.

당근 않 먹지요.

그 뒤에, 취소버튼을 누르면 에러가 생기던데 이유를 모르겠습니다.



04x!:bff9de97의 모듈 KERNEL32.DLL에서 EXPLORER 잘못된 페이지 오류 발생.



왜 이 에러가 생기는지 알고 싶습니다. 해결책도요.

아래는 제가 만든 DLL의 내용입니다. 거의 예제 소스 그대롭니다.



var

FileMapObj : THandle;

HKbHook : HHook;



{ 메모리 맵 설정. }

function CreateMap() : Integer;

begin

FileMapObj := CreateFileMapping(

$FFFFFFFF, // 파일 연동 않함.

NIL, // 보안 문제 신경 않씀.

PAGE_READWRITE, // 읽고 쓰기.

0, // 크기 --> 상위 DWORD.

Sizeof(LongWord), // 크기 --> 하위 DWORD.

'KbHookMemoryMap' // 메모리 맵 파일의 이름.

);

Result := GetLastError;

end;



{ 메모리 맵 해제. }

function DestroyMap() : Boolean;

begin

Result := CloseHandle(FileMapObj); // 성공하면 0이 아닌값을 반환.

end;



{ 훅 프로시저 }

function MyKBHook(Code : Integer; wParam : WPARAM; lParam : LPARAM)

: LongInt; stdcall;

begin

// Code 값이 0보다 크거나 같을때만 갈구리질을 하는게 요령.

if Code >= 0 then

begin

// 키보드를 전부 않눌리게 한다.

// 다음 훅체인이 불리지 않도록 하면 끝.

Result := Integer(True);

Exit;

end;

Result := CallNextHookEx(HKbHook,Code,wParam,lParam);

end;



{ 키보드 훅 찍기. }

function HookKB() : Boolean;

begin

HKbHook := SetWindowsHookEx(WH_KEYBOARD,MyKBHook,HInstance,0);

Result := Boolean(HKbHook);

// 파일에 훅핸들 쓰기.

WriteData();

end;





0  COMMENTS