작은 모니터링 응용 프로그램을 구현 중이므로 CreateWindowExA/W를 처리 중이므로 Windows 생성을 제어 할 수 있습니다. 내가 후킹하는 데 사용하는 방법은 어셈블러 JMP 명령어가있는 호출의 처음 5 바이트를 my hook 함수로 바꾸는 것입니다. (네, 어셈블러를 알고, 전에 여러 번 같은 방법을 사용했습니다). 내 후크 코드의 시작 부분에 EnterCriticalSection을 사용하고 InterlockedExchange를 사용하여 도난당한 바이트를 일괄 대체합니다. CreateWindowExA/W의 시작 부분에서 실제 5 바이트를 썼습니다. 그래서 함수를 올바르게 호출 할 수 있습니다. 내 경험에 따르면, 모든 일이 잘되고있다,하지만 그 순간에 내가 JMP를 실제 바이트로 대체 한 순간에, 다른 스레드가 함수를 호출하고, 바이트가 바뀐 것처럼 보인다.스레드 안전 걸이 기능
나는 IAT/EAT 테이블 후킹을 사용할 수 있지만 현재의 방법에 문제가 있는지 알고 싶습니다. 아마도 InterlockedExchange가 작동하지 않는 문제는 CreateWindowExA/W가 dll (comctl32 .dll, shell32.dll ...)하지만 주 실행 모듈은 아닙니다.
나는 당신이 내 설명을 잘 이해하지 못한다면 나에게 도움을 요청하고 다시 설명 할 것이기를 바랍니다.
무엇을해야 할 것 같아요으로
스레드를 일시 중단하는 것은 나쁜 솔루션을 보이는, DXHooks에서 http://dxhook.googlecode.com/svn/trunk/dxhook.cpp에서보세요. 나에게 더 나은 방법은 간단한 길이 디스어셈블러를 사용하여 처음 몇 가지 어셈블러 명령어를 jmp로 대체 한 다음 나중에 복원하는 것이지만 스택에 params를 밀어 넣어 도난당한 명령어와 JMP를 CreateWindowExA/W, JMP JMP 바로 뒤에 실제로 코드로 연결됩니다. 누군가 모든 OS에서 모든 API의 첫 번째 어셈블러 지침이 "MOV EDI, EDI", "PUSH EBP", "MOV EBP, ESP"인지 확인할 수 있습니까? (나는 그 ntdll.dll에 대한 경우가 아니라는 것을 알고있다) – VisaToHelluser32.dll의 EAT와 IAT를 현재 프로세스에있는 다른 모든 모듈의 IAT에 연결하면, 나중에 새 모듈이로드 될 때 나중에 괜찮을 것이다. .dll은 CreateWindowEx/A/W에 대한 나의 후크 주소를 새 모듈에서 얻을 수 있습니까? – VisaToHell
@VisaToHell : 현재 프로세스의 모든 모듈에 우회 경로를 적용하려면 (** 귀하의 질문이 의미하는 것이 아닌 **), 시스템 dll에있는 코드 만 핫 패칭하면됩니다 ('mov edi, edi'와 선행 바이트는 RLD가 필요 없음), 모든 프로세스가 시스템 dll의 복사본을 가져옵니다. 이 기능을 사용하기 전에 다른 기능이 사용되기 전에 일반적으로 로더가 일시 중단 된 상태에서 프로세스를 시작하거나 패치가 완료 될 때까지 init을 차단해야합니다. – Necrolis