들어가며
회사의 생산현장에서 USB에 캐드 도면파일을 담아 이동시켜 열어서 도면을 확인하는데 유출이 된 적이 있어 곤란하다고 한다.
현장 PC들이 인터넷이 접속안되게 하지만 내부네트워크는 접속이 되어야하며, 캐드 도면파일이 USB에서 PC로 옮기는건 되게끔, PC to USB는 불가능하게 해야한다고 한다.
머릿속에 떠오른건 USB를 인식하는 드라이버를 StopService 함수나.. 뭐 어떻게 해보려했는데 특정확장자만 이라는 조건이 붙어
역시 후킹만한게 없다고 판단했다.
인터넷의 경우 내부네트워크는 접속이 가능해야하니 이더넷을 죽이는 방법은 불가하니, 프록시를 변경해보려한다.
그래서 구상을 잠시 해보니 해야 할 건.
1. 프록시 변조를 통한 인터넷 차단
2. Ring 3 권한 후킹을 통한 특정 확장자의 파일 이동을 차단하되, USB to PC는 가능하게
그냥 USB to PC, PC to USB를 후킹을 통해 다 막아버리고, 따로 FileMover를 만들어주어 레지스트리에 등록시켜
.dwg 확장자를 가진 파일을 우클릭 할 시 FileMover를 클릭해 이동가능하도록 할 예정
3. PC가 부팅 될 시, 자동으로 해당 프로그램 실행 및 기능 작동
4. 패스워드를 입력해야만 기능 해제 가능
5. 프로그램 자동 업데이트를 통한 추 후 유지보수 용이
6. Windows explorer.exe 에 AntiDwg.dll 을 인젝션해서 후킹 사용
C#을 이용해 EXE 클라이언트 프로그램을 만들고, C++ DLL을 만들어 차단 기능은 DLL에서 동작하도록 만들 예정이다.
IPC 를 통해 통신시키려 한다. 후킹을 위해서는 또 인젝션이 필요하니. 그럼 시작 !
[!] 제작한지는 사실 몇달 되었는데... 귀찮아 미뤄두다 글을 이제 쓰기 시작하는거라.. 몇 내용이 좀 빠질 수도 있다.
프록시 변조
레지스트리를 건드려 변조할 예정이다.
C# 클라이언트에서 버튼을 누르면 기능이 동작한다.
뭐 따로 설명할건 없네..
AntiDWG.dll
후킹을 위한 코드는 직접 작성하진 않을 예정이다. 후킹을 손쉽게 사용할 수 있도록 MinHook 라이브러리가 있기 때문.
15년 전에 중학생때는 직접 구현 했었던거 같은데.. 요새 세상은 참 편하다
해당 dll 은 윈도우의 explorer.exe에 인젝션해서 사용할 예정이다.
윈도우 환경에서 어떤 함수가 파일 이동에 관여하는지 먼저 찾아야 할 필요가 있다.
ProcMon 이란 프로그램을 이용하면 윈도우 상에서 어떤 함수가 호출되는지 전부 확인이 가능한데 이를 통해 확인을 해보려했으나
너무 순식간이고 호출하는 함수들이 수없이 많기 때문에 찾기가 버거웠다..
제일 좋은건 역시 Ring 0 권한의 함수를 후킹하는게 좋은데, 이를 위해선 후에 배포과정에서 각 피시에 설치하기가 매우 번거로워진다. 서명받은 드라이버도 아닐 뿐더러 설치를 위해선 안전모드에서 서명되지 않은 드라이버를 일일히 설치 해주거나, 로컬에서 인증을받거나.. 튼 좋은 방법은아니다.
그래서 그냥 유저모드에서 파일 이동 복사 생성에 사용되는 함수들을 우선 전부 후킹해보려한다.
실질적으로 사용되는 함수는 후에 로그를 찍어 확인 하면 되니까
후킹할 함수들... 많다
CreateFile, CopyFile, MoveFile, SetFileInformationByHandle, ZwWriteFile, NtCreateFile, DeviceIoControl, NtWriteFile, ZwCreateFile 음...
nt나 zw함수를 후킹하는건 역시 유저모드에서 가장 강력한 방법이 아닐까 싶다.
후킹로직을 짜기 전에 우선 이동 시키는 드라이브가 USB인지, 그리고 Dwg확장자를 가진 파일이 맞는지
조건문에 넣어 판별해야하니 해당 함수먼저 만들어주자
Is USB Drive n Dwg Extension ?
경로를 받아올때 네이티브 경로로 받아와서 일반적인 Windows 경로로 변환시켜주는 작업을 우선했다.
그리고 GetVolumeInformation 함수를 통해 시스템 유형을 확인하고
QueryDosDevice 로 경로를 확인한다.
SetupDi API 로 USB 장치 여부를 확인한다.
.dwg 확장자는 캐드 도면파일의 확장자이니 해당 확장자만 이동이 불가능하게 해야한다.
추 후 다른 확장자도 원한다면 추가할 수 있겠지?
그리고 잘 동작이 되는지 확인을 위해 로그를 만들어주자
늘 코딩할 때는 로그를 넣는 편이다.
그럼 어디까지 작동이 되는지 어디서부터 막히는건지 알기가 수월해지니까
Hooking
zwCreateFile 후킹코드이다. 별 거 없다.
위에서 만들어둔 USB인지 .DWG 확장자인지 확인해서 맞으면 STATUS_UNSUCCESSFUL 을 반환해 버린다.
다른 함수들도 동일하게 후킹한다.
길어지니 다음 글에서 후킹 초기화 및 인젝션, 그리고 기능 테스트를 해볼까..
'Project > 이것저것' 카테고리의 다른 글
[NAS] 고장난 나스서버 하드디스크 복구기 -1- (1) | 2025.07.15 |
---|