Python/2.7 for fun.

나만의 편한 프록시 실행파일 만들기 2.

qkqhxla1 2015. 5. 14. 18:38

http://qkqhxla1.tistory.com/337 글에서 만들려다가 삽질만 하고 실패했었는데, 우연히 adm1nkyj님의 블로그를 돌아다니다가 해법을 찾았다. 이런 엄청난 우연이......



코드를 짜기전에 실제로 불편함을 해소하기 위한 프로그램이었으므로 어떻게하면 최소한의 동작만을 할까 고민했다. 처음에는 gui버튼을 만들어서 프록시 옆에 붙이기로 했다.(on/off버튼.) 그런데 생각해보니 gui버튼이 프록시 옆에 붙어있으려면 exe가 계속 실행되어야 하고, 리소스를 많이 잡아먹을거라 생각했다. 생각하고 또 생각한결과 내가 만든 알고리즘은.


1. 프로그램이 실행했을때 burp_suite가 안 켜진 상태이면, 프록시 사용상태가 on인지 off인지 체크한다. off면 burp_suite를 켜고, 스위치를 on으로 전환한다. on이면 off로만 변경한다. 


2. 프로그램 실행 시 burp_suite가 켜진 상태이면 마찬가지로 on인지 off인지 체크하고 on이면 off로, off면 on으로 단순히 동작만 바꾼다. (on/off 스위치처럼.) 


말을 좀 복잡하게 적었는데 최대한 모든 경우를 고려했기 때문에 쓰다 보면 편하다는걸 느낀다.


코드.

# -*- encoding: cp949 -*-
from _winreg import *
import os, time
import ctypes
import subprocess
 
def getProxy(): #현재 프록시가 on이면 True를, 꺼져있으면 False를 리턴한다.
    proxy = OpenKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings")
    server, type = QueryValueEx(proxy, "ProxyServer")
    enabled, type = QueryValueEx(proxy, "ProxyEnable")
    if enabled:
        return True #server
    return False
 
INTERNET_OPTION_REFRESH = 37
INTERNET_OPTION_SETTINGS_CHANGED = 39
def switch_proxy(on_off): #on_off값이 1이면 프록시 on, 0이면 proxy off
    keyVal = r'Software\Microsoft\Windows\CurrentVersion\Internet Settings' #여기 경로의
    try: key = OpenKey(HKEY_CURRENT_USER, keyVal, 0, KEY_ALL_ACCESS)
    except: exit(1)
    SetValueEx(key, "ProxyEnable", 0, REG_DWORD, on_off) #ProxyEnable값에 따라서 프록시가 설정된다.
    InternetSetOption = ctypes.windll.Wininet.InternetSetOptionW
    InternetSetOption(0, INTERNET_OPTION_REFRESH, 0, 0) #적용한다고 메시지를 뿌려줌.
    InternetSetOption(0, INTERNET_OPTION_SETTINGS_CHANGED, 0, 0) #마찬가지.
    CloseKey(key)
  
a = os.popen("tasklist").readlines() #현재 프로세스 목록을 가져와서
flag = True
for x in a:
      try:
         if x.find('java.exe') == 0: #프록시가 켜져있으면(java -jar으로 자바로 프록시를 실행하므로 java.exe의 여부로 프록시가 켜져있는지를 판별했다.)
             flag = False
             if getProxy(): #프록시사용 모드가 on이면 
                 switch_proxy(0) #프록시 사용 모드를 off로 바꿈
                 break
             else: #프록시 사용 모드가 off면
                 switch_proxy(1) #프록시 사용 모드를 on으로 변경
      except:
           pass
if flag == True: #프록시가 꺼져있으면
    if getProxy(): #프록시가 꺼져있는데 프록시 사용으로 되있으면 프록시 사용을 off로 함.
        switch_proxy(0)
    else: #프록시도 꺼져있고, 사용도 off면 프록시를 키고 사용도 on으로 변경
        switch_proxy(1)
        cmd = subprocess.Popen(r'java -jar C:\Users\Ko\burpsuite_free_v1.6.jar', shell=True, stderr=subprocess.PIPE)


setup.py

#-*- coding: cp949 -*-
from distutils.core import setup
import py2exe, glob
  
setup(
     windows=[
         {
         'script':'hello.py',
         "icon_resources": [(1, "burp.ico")],
         }
         ], #console=['hello.py']가 아니라 앞을 windows로 주면 보기싫은 콘솔 창이 사라짐.
     #data_files=[ ('C:\\Users\\Ko\\Desktop\\python exe\\imageformats',glob.glob('C:\\Python27\\Lib\\site-packages\\PyQt4\\plugins\\imageformats\\*.*')) ],
     options = {'py2exe': {
         'bundle_files':1,
         'dist_dir':'C:\\Users\\Ko\\Desktop\\python exe',
         }},
     zipfile = None
     )