시스템 프로그래밍 잘 아시는분 계신가요?(조금 긴글..)

.net wpf windows 프로그램을 개발하는 개발자입니다.

저희 제품은 설치 후 로그인 방식이고
로그인시 라이센스를 체크해서 실행 되는 구조인데

라이센스가 1개일 경우
타 PC에서 로그인하면 기존 연결을 끊을지 물어보고(카톡처럼)
끊는다고 하면 실행 되는 구조 입니다.

같은 PC의 경우 처음만 로그인 창이 뜨고
두번째 부터는 로그인 창이 뜨지 않고 그냥 실행 됩니다.
(워드나 어도비 같이 한PC에서 여러개 켤수 있는 것처럼)
같은 PC의 기준은 CPU ID, Board ID를 기준으로 하고 있습니다.

서버쪽에 먼저 CPU ID와 Board ID를 전달 해서
기존에 같은 값으로 로그인 되어 있는 세션이 있으면
그냥 통과 시키고
없으면 로그인 창이 떠서 로그인 시키는 구조 입니다.

그런데 몇일 전 이슈가 발생 했는데

특정 환경에서 이게 뚫리는 현상이 발생 했습니다.

학원인데 메인 PC가 있고 다른 컴퓨터들은 그 메인 PC에 연결해서 쓰는 구조라고 합니다.
(직접 가본게 아니라서 정확한 정보는 없습니다. 가서 시연 하신 분께 전해 들었습니다.)

그쪽 말로는 무슨 보안 프로그램을 쓴다고 했다는데 보안용은 아니고
1copy로 여러 PC에서 쓰기 위해 쓰는 프로그램 같습니다.

이 환경에서는 모두가 같은 PC로 인식 되서
1번만 로그인 창이 뜨고
다른 모든 PC는 그냥 로그인이 통과 되었습니다.

지금 이걸 막는게 제 임무인데
혹시 관련해서 경험이나 아는분 계실까요?

지금 막는다고 막고 있는데
이거도 뚫리면 직접 가서 제품 보고 타겟팅 해서 막는 방법 말곤
없어 보이네요…

1개의 좋아요

wmi로 하드웨어 정보를 가져온다면 IWbemClassObject (fastprox.dll) 후킹하면 뚫리겠죠

2개의 좋아요

네. 후킹까지는 포기 하려고요…
진짜 후킹까지 하는 프로그램이면
직접가서 보고 PS에 있으면 걸러야죠.

1개의 좋아요

__cpuid, __cpuidex | Microsoft Learn

4개의 좋아요

@그라목손 오!! 완전 신세계네요. 이건 첨 봤네여.

__cpuid 관련해서 마샬링 하는거 찾아보니

어셈블로 짜야 되는거 같은데 한번 도전해 봐야 겠네여 ㅎㅎ

1개의 좋아요

지금도 그러는지는 확인을 안 해봤습니다 만 일단 경험 상으로는 cpuid는 믿을게 못됩니다.
이게 bios옵션이나 기타 문제로 동일한 id가 뜨는 경우들이 있습니다.

이제 확인을 해야할 것이 스토리지가 각각의 시스템에 있는가? 입니다.
스토리지가 각각의 시스템에 있다면 스토리지쪽 id를 쓰는게 좀 더 확실하게 구분이 됩니다.
이것도 불가능하다면 서버에서 설치 시 또는 최초 실행 시 id를 받아와서 저장하는 방법이 있습니다.
저장 위치는 설치 폴더가 아닌 곳으로 좀 많이 숨겨야겠죠. 예전에 2000년도 초반엔 파일 안 만들고 섹터에 직접 쓰기도 했었습니다.

참고로 저는 C++개발자인지라 그라목손님이 링크거신방법으로 cpuid를 알아온겁니다. WMI아니고요.

3개의 좋아요

@SeungJun_Lee 의견 감사합니다! 참고해 보겠습니다.

1개의 좋아요

Cpuid로 할 경우 같은 유일한 값이 아닙니다. 동일한 Cpu의 경우 동일한 값이기 때문에 라이선스 인증으로는 추천드리지 않습니다.

1개의 좋아요

아 이걸… 뭘 가져다 키값으로 쓰는지 말하고 의미가 있는지
여쭤보고 싶은데… 이걸 함부로 공개했다가 역공 당할까봐…
차마 공개를 못하겠네여

1개의 좋아요

그냥 한마디로 못 막습니다.
보아하니 일종의 클라우드 형태인 것 같은데요.
프로그램이 실제로 실행되는 시스템이 하나이기 때문에 못 막아요.
물론 cpu-id 자체가 의미 없으니 이건 추후 고치시는게 좋을거고요.

꼭 막아야 한다면 그런류의 클라우드가 실행중인지 확인하여 서버에 설치를 못하게 막는 방향으로 가야하지 않을까 합니다.
성능이 많이 처지겠지만 클라이언트에 설치하도록 강제해야죠.

1개의 좋아요

로그인 인증이 없으면 막기 힘들지만 Hash(cpuid + main board + ssd) 키가 같고 세션이 여러개면 마지막 세션만 유효한 것이 되겠죠
인증하고 세션을 끊는다면 어렵겠지만 연결 유지하면 카톡처럼 가능하지 않을까요?

2개의 좋아요

“두번째 부터는 로그인 창이 뜨지 않고 그냥 실행 됩니다.”

프로그램이 실행되면 무조건 로그인하게 만들면 다 해결되는거 아닌가요?
사용자가 이 기능을 악용하는데 굳이 유지할 필요는 없어보이네요.
대안으로 계정을 클라이언트에 저장했다가 실행할때마다 자동으로 로그인하게 만들면 되구요.

2개의 좋아요

MAC Address는 어떤가요? 물론 수정가능한 값이긴 하지만 의도적으로 그러지 않는다면야 꽤 고유한 정보지 않나 싶습니다.
조합해서 쓰기엔 외부+로컬 IP 주소도 좋은 정보일 것 같기도하고…

2개의 좋아요

@사포192 쓰고 있습니다. 문제는 Mac이 그때그때 달라요.
이게 VM이나 VirtualBox를 깔거나 노트북으로 WiFi 쓰다가 랜쓰다가 하면
바뀌거든요.

2개의 좋아요

일단 그 보안을 목적으로 사용한다는 프로그램이 뭔지는 알아야 제대로 된 답변이 달릴 것 같네요.

2개의 좋아요

아… 어떤 환경을 찾으시는건지 알겠네요. 굉장히 머리아프네요 ㅠ.ㅠ

2개의 좋아요