728x90

[WinAPI] 카카오톡 광고 제거 프로그램 제작

WinAPI를 이용해서 카카오톡의 광고를 제거(숨김)하는 프로그램입니다.

카카오톡 광고 제거 프로그램 개발기
카카오톡의 PC 버전은 상당히 편리합니다만, 하단의 광고가 거슬릴 수 있습니다
 
회사의 수익모델(광고)을 건드리지 않고, 외부 어플리케이션을 제어하는 방법이 궁금한 사람들에게 도움이 되고자 개발 과정을 공개합니다.

카카오톡의 광고를 없애는 방법

1. 외부에서 제어를 해서, 광고를 제거 혹은 숨깁니다.
2. 설치된 어플리케이션의 리소스를 해킹해서 광고를 완전 제거해버립니다.

두 번째 방법의 경우, 카카오톡 프로그램 무단 변경으로 연락이 올 수 있기에 첫 번째 방법을 택했습니다.

카카오톡 클래스의 구조

카카오톡의 클래스 구조는 위와 같습니다.
카카오톡의 지식 윈도우를 살펴보면, EVA_Window 라는 클래스가 광고라고 짐작할 수 있습니다.
아직은 짐작만 할 뿐, 한 번 숨겨보면 확실해 지겠죠.

ShowWindow Function, FindWindow Function
ShowWindow 함수의 경우, 대상 윈도우를 숨기거나 보이게 할 수 있습니다.
즉, 이 말은 외부 프로그램을 제어할 수 있다는 말입니다.
ShowWindow의 원형 : BOOL ShowWindow(HWND hWnd, int nCmdShow);

첫 번째 인자로 대상 윈도우의 핸들을 받고, 두 번째 인자로 어떤 작업을 할지 받습니다.
우리는 이 광고 창을 숨길 것이므로 두 번째 인자에는 SW_HIDE를 넣어주면 됩니다.

SW_HIDE : 윈도우를 숨김 <-> SW_SHOW : 윈도우를 활성화 시킨 다음, 화면에 띄워줌

이 ShowWindow 함수를 사용하기 위해서는 카카오톡의 핸들 값을 알아야 하는데 이것을 찾아주는 함수가 FindWindow 함수입니다.
FindWindow 함수는 윈도우의 클래스명이나 캡션명을 알고 있을 경우 검색해주는 일을 합니다.
첫 번째 인자는 대상 윈도우의 클래스명, 두 번째 인자는 캡션명을 적어주면 되며,
카카오톡의 클래스명은 "#32770", 캡션명은 "카카오톡" 입니다.

FindWindow("#32770""카카오톡");
cs

이와 같이 적어주면 카카오톡의 핸들값을 자동으로 찾아줄 것입니다.

#include <Windows.h>
 
int main(void) {
    HWND KaKaoMain;
 
    KaKaoMain = FindWindow("#32770""카카오톡");
 
    return 0;
}
cs

HWND의 자료형의 경우 윈도우의 핸들값을 저장하는 자료형이라 보면 됩니다.
KaKaoMain 변수는 FindWindow를 통해 찾은 카카오톡의 핸들값을 저장하기 위한 변수입니다.

카카오톡 광고창의 핸들값 구하기 - FindWindowEx Function
카카오톡의 광고창은 클래스명이 EVA_Window 이며, 캡션명은 없습니다.
또한, 카카오톡을 부모 윈도우로 갖고 있죠.
자식 윈도우를 검색할 때 사용할 수 있는 함수가 바로 FindWindowEx 함수입니다.

FindWindwEx는 총 4개의 인자를 입력받습니다.

첫 번째 인자는 부모 윈도우의 핸들 값
두 번째 인자는 자식 윈도우를 여러 개 검색해야 할 때 사용되는 인자
세 번째 인자는 찾을 윈도우의 클래스명
네 번째 인자는 찾을 윈도우의 캡션명

FindWindowEx(KaKaoMain, NULL"EVA_Window"NULL);
cs

부모 윈도우로 카카오톡을 갖고 있고, 클래스명은 EVA_Window, 캡션명은 없기 때문에 NULL을 적어주면 됩니다.

#include <Windows.h>
 
int main() {
    HWND KakaoMain, KakaoAD;
 
    KakaoMain = FindWindow("#32770""카카오톡");
    KakaoAD = FindWindowEx(KakaoMain, NULL"EVA_Window"NULL);
 
    return 0;
}
cs

이렇게 해주면 광고창의 핸들 값까지 저장이 완료된 상태입니다.
이제 이 것을 아까 본 ShowWindow 함수를 이용해서 숨겨주면 됩니다.

#include <Windows.h>
 
int main(void) {
    HWND KaKaoMain, KaKaoAD;
 
    KaKaoMain = FindWindow("#32770""카카오톡");
    KaKaoAD = FindWindowEx(KaKaoMain, NULL"EVA_Window"NULL);
 
    ShowWindow(KaKaoAD, SW_HIDE);
 
    return 0;
}
cs


광고가 사라지긴 했지만, 비어있는 부분이 거슬리므로
표시한 부분의 크기를 강제적으로 늘려서 광고창을 가리는 방법을 생각했습니다.

SetWindowPos Function
대상 윈도우의 좌표와 크기를 조정할 수 있는 함수입니다.

BOOL SetWindowPos(HWND hWnd, HWND hWndInsertAfter,
int X, int Y, int cx, int cy, UINT uFlags);
cs

많은 것들을 인자로 입력 받는데 살펴보면 그렇게 복잡하지는 않습니다.
먼저 우리는 이 함수를 이용해서 윈도우의 크기를 늘릴 것입니다.

그러기 위해서는 대상 윈도우의 핸들 값을 알아야 하므로 검색합시다.
저 표시한 부분의 클래스명은 #32770이고, 캡션명은 없습니다.

#include <Windows.h>
 
int main() {
    HWND KakaoMain, KakaoAD, KakaoWnd;
 
    KakaoMain = FindWindow("#32770""카카오톡");
    KakaoAD = FindWindowEx(KakaoMain, NULL"EVA_Window"NULL);
    KakaoWnd = FindWindowEx(KakaoMain, NULL"#32770"NULL);
 
    ShowWindow(KakaoAD, SW_HIDE);
 
    return 0;
}
cs

SetWindowPos는 첫 번째 인자로 대상 윈도우의 핸들값을 입력받습니다.
두 번째 인자는 이 윈도우의 Z 위치를 결정하는 것인데, 이 윈도우가 최상위로 표시되기를 원한다면 HWND_TOPMOST를 적어주면 됩니다.
굳이 카카오톡을 최상위로 올릴 필요는 없으니, HWND_BOTTOM을 적어줍시다.
세 번째, 네 번째 인자는 이 윈도우의 좌표를 입력 받아서 그 위치로 윈도우를 이동시킵니다.
다섯 번째, 여섯 번째 인자는 윈도우의 크기를 재설정해주는 역할을 합니다.
마지막 인자는 여러 가지 옵션들을 지정해주는데 우리가 사용할 옵션은 SWP_NOMOVE, 윈도우를 움직이지 않고, 크기만 조절해주는 역할을 합니다.

지금까지 나온 것을 바탕으로 인자를 적어보면..

SetWindowPos(KakaoWnd, HWND_BOTTOM, 00, Width, Height, SWP_NOMOVE);
cs

이제 Width와 Height를 구해주어야 하는데 카카오톡은 크기가 고정되어 있지 않고, 사용자가 카카오톡의 크기를 수정할 수 있습니다.
때문에 이 값도 유동성있게 지정해 주어야 하는데, 그러기 위해서는 이 카카오톡의 길이와 높이를 알아야 합니다.
이 길이와 높이를 GetWindowRect 함수를 이용해서 구할 것입니다.

먼저 좌표값을 저장할 변수 Rect를 선언합니다.
그리고 GetWindowRect(KakaoMain, &Rect); 이렇게 해주면 KakaoTalkMainWnd 윈도우의 좌표값들이 Rect안에 들어가게 됩니다.
엄밀히 따지자면 RECT는 구조체인데, 이 부분에 대해서는 넘어가도록 합시다.

#include <Windows.h>
 
int main() {
    HWND KakaoMain, KakaoAD, KakaoWnd;
    RECT Rect;
 
    KakaoMain = FindWindow("#32770""카카오톡");
    KakaoAD = FindWindowEx(KakaoMain, NULL"EVA_Window"NULL);
    KakaoWnd = FindWindowEx(KakaoMain, NULL"#32770"NULL);
 
    GetWindowRect(KakaoMain, &Rect);
    ShowWindow(KakaoAD, SW_HIDE);
 
    return 0;
}
cs

지금까지 작성한 소스코드입니다.

이제 SetWindowPos를 이용해서 크기를 재설정하면,
SetWindowPos(KakaoWnd, HWND_BOTTOM, 0, 0, Width, Height, SWP_NOMOVE);
윈도우의 크기는 (Rect.right - Rect.left), (Rect.bottom - Rect.top - 32)
이렇게 해주면 됩니다.

좌표가 이렇다고 가정을 해보면 이 윈도우의 가로 길이는 right값에서 left값을 뺀 200이 될 것이고,
세로 길이는 bottom 값에서 top 값을 뺀 100이 될 것입니다.

하지만 세로 길이의 경우

분홍색으로 표시한 저 부분의 길이를 빼 주어야 한다. 그래서 높이에서 32만큼을 빼준 것입니다.

#include <Windows.h>
 
int main() {
    HWND KakaoMain, KakaoAD, KakaoWnd;
    RECT Rect;
 
    KakaoMain = FindWindow("#32770""카카오톡");
    KakaoAD = FindWindowEx(KakaoMain, NULL"EVA_Window"NULL);
    KakaoWnd = FindWindowEx(KakaoMain, NULL"#32770"NULL);
 
    GetWindowRect(KakaoMain, &Rect);
    ShowWindow(KakaoAD, SW_HIDE);
    SetWindowPos(KakaoWnd, HWND_BOTTOM, 00,
    (Rect.right - Rect.left), (Rect.bottom - Rect.top - 32), SWP_NOMOVE);
 
    return 0;
}
cs

자, 그럼 이제 성공적으로 광고가 제거되었을 것입니다.

잠금모드에서 광고 제거하기

#include <Windows.h>
int main() {
    HWND KakaoMain, KakaoAD, KakaoWnd;
    RECT Rect;
 
    KakaoMain = FindWindow("#32770""카카오톡");
    KakaoAD = FindWindowEx(KakaoMain, NULL"EVA_Window"NULL);
    KakaoWnd = FindWindowEx(KakaoMain, NULL"#32770"NULL);
 
    GetWindowRect(KakaoMain, &Rect);
    ShowWindow(KakaoAD, SW_HIDE);
    SetWindowPos(KakaoWnd, HWND_BOTTOM, 00,
    (Rect.right - Rect.left), (Rect.bottom - Rect.top - 32), SWP_NOMOVE);
 
    KakaoWnd = FindWindowEx(KakaoMain, KakaoWnd, "#32770"NULL);
    KakaoWnd = FindWindowEx(KakaoMain, KakaoWnd, "#32770"NULL);
 
    SetWindowPos(KakaoWnd, HWND_BOTTOM, 00,
    (Rect.right - Rect.left), (Rect.bottom - Rect.top - 32), SWP_NOMOVE);
 
    return 0;
}
cs


2017-04-08 작동 확인


728x90
728x90

'Project > C Project' 카테고리의 다른 글

[C Function] 정수를 입력받는 함수  (0) 2017.09.28