Python/2.7 for fun.

나만의 편한 프록시 실행파일 만들기 1. (방법론)

qkqhxla1 2015. 4. 27. 18:18

웹해킹시 프록시를 종종 사용하는데 불편해서 만들려고 했었다. burp-suite를 사용하는데, 이걸 사용하려면 cmd를 켜서, java -jar bur~을 쳐서 프록시를 키고, 크롬의 속성창에서 인터넷 속성을 들어가서 프록시 사용을 체크하고확인누르고 나와서 사용, 사용안할려면 다시 들어가서 체크를 해제하고 확인누르고.. 이게 은근히 짜증났다.


그래서. exe를 실행만 하면 프록시가 켜지면서 동시에 알아서 프록시 사용 모드로 바뀜-> 버튼이 하나 나타나는데, 버튼 클릭 여부에 따라서 프록시 사용 모드가 on/off로 바뀜. 이렇게 편안한 프록시용 exe를 만들어보려고 했는데 실패했다. 


아래는 프록시가 바뀌었는지 레지스트리를 확인하고 체크하는 코드이다.

# -*- encoding: cp949 -*-
from _winreg import *
import os, time
def switch_proxy(on_off):
    keyVal = r'Software\Microsoft\Windows\CurrentVersion\Internet Settings' #여기 경로의
    try: key = OpenKey(HKEY_CURRENT_USER, keyVal, 0, KEY_ALL_ACCESS)
    except:
        print 'keyerror!!'
        exit(1)
    SetValueEx(key, "ProxyEnable", 0, REG_DWORD, on_off) #ProxyEnable값에 따라서 프록시가 설정된다.
    print EnableReflectionKey(key)
    CloseKey(key)

switch_proxy(1) #1은 on, 0은 off
#os.system(r'java -jar C:\Users\Ko\burpsuite_free_v1.6.jar')
import win32con, win32gui 
win32gui.SendMessageTimeout(win32con.HWND_BROADCAST, 
win32con.WM_SETTINGCHANGE, 0, "Environment", 
win32con.SMTO_ABORTIFHUNG, 2000)
print 'done!'

처음에 고민했던 것은 어떻게 인터넷 속성의 프록시 체크창을 프로그래밍적으로 체크하고 해제할까..? 였는데 크롬 설정 파일을 뒤져도 관련 자료가 없었다. 


그런데 나중에 구글링을 하다 보니 2005년에 어떤분이 프록시 설정 값을 확인하고 싶다는 질문을 올렸었다.(링크는 까먹었다.) 답변이 있었는데 레지스트리로 확인이 가능하다는 답이 있었고, 당연히 변경도 거기서 가능할거라고 생각해서 프록시 on/off관련된 레지스트리를 찾다보니 


HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings


이 경로를 찾을수 있었고, 이 내부의 ProxyEnable가 프록시 사용을 체크했을땐 1로, 체크해제했을땐 0으로 된다는 사실을 발견했다. 엇 그럼 저값만 변경하면 되는거아냐?!! 라고 생각했다. 위의 코드도 값 변경은 된다. 레지스트리 내부적으로 프록시를 사용한다는 스위치는 켜는게 가능했다. 그런데 문제는 레지스트리가 '적용'이 안된다는것이다. 


저 값을 1로 변경하고 인터넷 속성의 프록시 사용 여부를 체크하는곳에 들어가게 되면 내가 체크한것처럼 변경되있다. 그리고 그 창을 빠져나오는 순간부터 프록시 사용이 적용된다. (그러니까 설정 창을 들어가서 한번은 확인해봐야 한다는 소리이다.) 결국 설정 창을 한번 더 들어가는건 똑같으므로 프로그래밍한 의미가 없어졌다.


계속 생각해보니 왠지 레지스트리를 다시 refresh해서 적용하라는 메시지를 뿌려주면 될거 같다는 생각에 어디선가 또 찾아온 뒤의 코드 win32gui.SendMessageTimeout~~ 이걸 넣었는데도 레지스트리 값만 바뀌고 실제 적용은 되질 않았다. 계속해서 구글링을 해보니 재부팅이나 다시 키지 않고서는 안된다. 안된다. 안되. 라는 말뿐이라서 일단 실패했다......


레지스트리 삽질을 하면서 이것저것 찾아보면서 난생 처음으로 레지스트리 파일도 만들어 보기도 했다.

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]

"ProxyEnable"=dword:00000001

(이 레지스트리 파일은 위 코드와 동일하게 ProxyEnable값을 1로 바꿔준다. 그런데 이것도 값만 1로 바꿔주지 적용은 한번 들어갔다 나와야 적용됨.)


옛날부터 은근히 짜증나서 만들어보려다가 시간만 날림. 해결되면 글 추가 예정.


성공 : http://qkqhxla1.tistory.com/345