ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PyQt5를 사용한 IP 스캐너 GUI 애플리케이션
    기술(Tech) 2024. 7. 31. 11:58
    반응형

    결과화면



    이번 포스팅에서는 PyQt5를 사용하여 IP 주소를 스캔하는 GUI 애플리케이션을 만드는 방법을 공유하겠습니다. 이 애플리케이션은 AbuseIPDB 및 VirusTotal API를 사용하여 IP 주소의 평판을 확인합니다. 이 프로젝트는 PyQt5 애플리케이션 내에서 API 요청 통합, 동시 처리를 위한 스레딩, 입력 및 출력을 위한 사용자 친화적 인터페이스를 보여줍니다.

     

    프로젝트 개요

    이 애플리케이션은 사용자가 IP 주소를 수동으로 입력하거나 CSV 파일에서 로드할 수 있도록 합니다. 그런 다음 IP 주소를 AbuseIPDB 및 VirusTotal API와 비교하여 국가, 도메인, 학대 신뢰도 점수, 악성 활동과 같은 평판에 대한 정보를 검색합니다. 결과는 애플리케이션에 표시되고 CSV 파일에 저장됩니다.

     

    주요 기능

    • GUI 인터페이스: PyQt5로 구축된 이 애플리케이션은 직관적이고 사용하기 쉬운 인터페이스를 제공합니다.
    • API 통합: AbuseIPDB 및 VirusTotal API를 활용하여 IP 평판을 확인합니다.
    • 동시성: 스레딩을 사용하여 API 요청을 동시에 수행하여 성능을 개선합니다.
    • 파일 입출력: CSV 파일에서 IP 주소를 로드하고 결과를 CSV 파일에 저장하는 것을 지원합니다.

    필수 조건이 애플리케이션을 실행하려면 다음이 필요합니다.

    • Python 3.x
    • PyQt5
    • Requests library


    pip를 사용하여 필요한 라이브러리를 설치합니다:

    pip install PyQt5 requests

     

    코드 분석


    API 키 구성
    먼저 AbuseIPDB와 VirusTotal에 대한 API 키를 설정합니다. 이 키는 안전하게 보관해야 하며 공개적으로 공유해서는 안 됩니다.

    # Basic API Key Configuration
    default_abuseipdb_apikey = 'your_abuseipdb_apikey_here'  # Replace with your AbuseIPDB API Key
    default_virustotal_apikey = 'your_virustotal_apikey_here'  # Replace with your VirusTotal API Key
    
    # Replace with your AbuseIPDB API Key
    abuseipdb_apikey = default_abuseipdb_apikey
    virustotal_apikey = default_virustotal_apikey

     

    IPCheckThread 클래스
    이 클래스는 IP 주소의 실제 검사를 처리합니다. API 요청을 수행하고 응답을 처리합니다.

    class IPCheckThread(QThread):
        progress = pyqtSignal(int)
        finished = pyqtSignal()
        log = pyqtSignal(str)
        result = pyqtSignal(str)
    
        def __init__(self, ip_list, output_file):
            super().__init__()
            self.ip_list = ip_list
            self.output_file = output_file
    
        def check_ip_abuseipdb(self, ip_address):
            # AbuseIPDB API request implementation
    
        def check_ip_virustotal(self, ip_address):
            # VirusTotal API request implementation
    
        def run(self):
            # Thread execution logic

     

    MyApp 클래스
    이 클래스는 메인 애플리케이션 창과 그 기능을 정의합니다.

    class MyApp(QMainWindow):
        def __init__(self):
            super().__init__()
            self.initUI()
            self.createTrayIcon()
    
        def initUI(self):
            self.setWindowTitle('IP Scanner')
            self.setGeometry(300, 300, 600, 600)
    
            # Setting up the status bar, toolbar, and layout
            # Adding widgets for API key input, IP input, and buttons
            # Implementing file dialog and tray icon functionalities
    
        def createTrayIcon(self):
            # Tray icon creation and setup
    
        def applyAbuseIPDBApiKey(self):
            global abuseipdb_apikey
            abuseipdb_apikey = self.abuseipdbApiKeyInput.text()
            self.updateLog("AbuseIPDB API Key applied.")
    
        def applyVirusTotalApiKey(self):
            global virustotal_apikey
            virustotal_apikey = self.virustotalApiKeyInput.text()
            self.updateLog("VirusTotal API Key applied.")
    
        def clearResults(self):
            self.resultBox.clear()
            self.updateLog("Results cleared.")
    
        def showDialog(self):
            options = QFileDialog.Options()
            options |= QFileDialog.ReadOnly
            fileName, _ = QFileDialog.getOpenFileName(self, "Open CSV File", "", "CSV Files (*.csv);;All Files (*)", options=options)
            if fileName:
                self.fileLabel.setText(fileName)
                self.outputFileName = fileName.replace('.csv', '_results.csv')
                self.startScanFromFile(fileName, self.outputFileName)
    
        def startSearch(self):
            ip_text = self.ipInput.toPlainText()
            ip_list = [ip.strip() for ip in ip_text.split('\n') if ip.strip()]
            self.outputFileName = 'output_results.csv'
            self.startScan(ip_list, self.outputFileName)
    
        def startScan(self, ip_list, output_file):
            self.thread = IPCheckThread(ip_list, output_file)
            self.thread.progress.connect(self.progressBar.setValue)
            self.thread.log.connect(self.updateLog)
            self.thread.result.connect(self.appendResult)
            self.thread.finished.connect(self.scanFinished)
            self.thread.start()
    
        def updateLog(self, message):
            self.logLabel.setText(message)
    
        def appendResult(self, result):
            self.resultBox.append(result)
    
        def scanFinished(self):
            self.updateLog(f"Scan finished. Results saved to {self.outputFileName}")

     

    Main Function

    애플리케이션의 진입점은 PyQt5 애플리케이션을 초기화하고 메인 창을 시작합니다.

    def main():
        app = QApplication(sys.argv)
        ex = MyApp()
        sys.exit(app.exec_())
    
    if __name__ == '__main__':
        main()

     

    결론
    이 프로젝트는 PyQt5를 사용하여 기능이 풍부한 GUI 애플리케이션을 만드는 방법을 보여줍니. AbuseIPDB 및 VirusTotal API와의 통합은 외부 데이터 소스를 애플리케이션에 통합하는 방법을 보여줍니다. 스레딩을 사용하면 애플리케이션의 성능이 향상되어 여러 IP 주소를 동시에 처리할 때에도 응답성이 뛰어납니다.

    필요에 맞게 이 프로젝트를 사용자 지정하고 확장하세요. 질문이 있거나 추가 지원이 필요하면 아래에 댓글을 남겨주세요!

    반응형

    댓글

Designed by Tistory.