讨论(加密方面)

iamxiang 2007-06-28 06:11:52
请各位高手指点一下:

有没有加密密码输入框的代码或者方法啊~
现在的密码框随便用一个*号查看工具就可以看到代码了
想做成仿foxmail 6的那种,txtpassword框显示的都是*号,具体的密码存储在程序里面。

或者有其它好的方法,请指教~
...全文
491 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamxiang 2007-08-26
  • 打赏
  • 举报
回复
谢谢小吉的热情!结贴了!
homezj 2007-08-25
  • 打赏
  • 举报
回复
纯对的防破解是不太现实的。破解与反破解如同捉迷葳,用别人没想到的方法加密,不管是否复杂,都是最有效的,所以这需要有一定的创意才行。我想可能有人会有好的加密方案,但不会随便说出来的,因为可能这东西一公布,就不能叫加密了^_^

楼主提到的问题,是最常见的,一般加密不会这么简单,防止校验函数被NOP的方法很多,例举几个,不过这都是已公开的,实用价值不大,只是开拓一下思路:
1、在校验函数中放入软件运行必需的代码段或变量赋值,不执行校验函数,整个程序都无法执行;

2、用控件属性保存校验结果,如:一个Lable或Menu的Visible属性,这比变量破解难度要大一些,而这些属性会成为程序运行所需的一个相关参数,这比判断后跳转要好一些;

3、人海战术,增加校验执行的机会,对校验函数多做几个复本,内容相同,不同名即可,在不同地方调用;

4、执行时间限定,在校验前记录起始时间,校验后判断时间差,因破解时是要设断点的,而没中断的情况下,再慢的机器再复杂的校验都不会超过1秒吧,所以这可以增加破解难度;

5、是我从一个共享软件中学到的“超级杀招”,属“防修改自校验法”,首先,给主Exe文件加壳,加壳后Exe大小一般都要缩小一倍以上,比如1M变为300K,因为,破解软件前必需要先脱壳,所以在软件中加入对自身文件大小的检查,超过500K,哈,这必然是被破解的!这个方法还有很多变化,如修改加壳文件头,防止再加壳等,自己发挥想像力吧!

最后,补充一点,VB程序的P代码,比N代码难破解得多,大多数破解者看到P代码就会头痛,多数都不愿去破解它,若对程序效率影响不大,不妨用P代码编译。
iamxiang 2007-08-25
  • 打赏
  • 举报
回复
一般程序都这样写:
if(CheckRegCode(szRegCode) == TRUE)
{
//注册信息正确,执行正常的功能
}
else
{
//注册信息不正确,提示错误
}
这种封装看起来使程序代码结构良好,便于代码的组织与维护,但是也为破解者提供了良机。这样的程序通过反汇编之后通常有以下结构:
push 00406070 '字符串szRegCode参数入栈
call 00401050 '调用CheckRegCode函数
test eax,eax '判断CheckRegCode返回值
je 00401029 '跳转到出错位置
' 注册信息正确,顺序执行
从上面的汇编代码可以看到,只需将执行跳转的je指令(机器码是740B)改成两个NOP(CPU空操作指令,机器码是90)就等于忽略了对 CheckRegCode函数返回值的判断,也就是说,无论这个函数返回TRUE还是FALSE,真正的功能代码都会执行,对注册码的校验就形同虚设。破解者根据指令的内存偏移地址计算出在可执行程序文件中的文件偏移位置,直接修改可执行文件就达到了破解这个功能的目的。此外,破解者还知道校验函数的位置是00401050,也就可以直接修改这个函数的代码,将函数开始部分的代码改成:
mov eax,1 ' 机器码是B801
ret ' 机器码是C3
也就是说根本不判断注册码,直接返回1(校验成功的标志),就能够使整个软件的注册码校验功能失效,软件被彻底的破解。

怎么办???
iamxiang 2007-08-25
  • 打赏
  • 举报
回复
谢谢楼上的 我试了都是可以的 不过现在就是第二个问题不知道怎么解决啊?
gddd 2007-07-24
  • 打赏
  • 举报
回复
用子类来处理.防止键盘拦截工具.
建窗口文件FrmWndProc,模块文件ModWndProc
窗口文件包括
Text1.text="text1"(*号隐藏)
Text2.text="Text2"
Command1.cap="开始"(按纽)

FrmWndProc代码包括
Option Explicit

Dim St As Long

Private Sub Command1_Click()

If St = -1 Then

PrevWndProc = SetWindowLong(Text1.Hwnd, GWL_WNDPROC, AddressOf SubWndProc)
Command1.Caption = "停止"
St = 1
Me.Caption = "子类处理状态!"

Else

SetWindowLong Text1.Hwnd, GWL_WNDPROC, PrevWndProc
Command1.Caption = "开始"
St = -1
Me.Caption = "正常状态"

End If

End Sub

Private Sub Form_Load()

St = -1
Me.Caption = "准备完毕"

End Sub

Private Sub Form_Unload(Cancel As Integer)

If St <> -1 Then
SetWindowLong Text1.Hwnd, GWL_WNDPROC, PrevWndProc
End If

End Sub

Private Sub Timer1_Timer()

Text2.Text = Text1.Text

End Sub


ModWndProc模块代码
Option Explicit

Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal Hwnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const GWL_WNDPROC = (-4)
Public Const WM_GETTEXT = &HD

Public PrevWndProc As Long

Public Function SubWndProc(ByVal Hwnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Select Case MSG '在这里进行过滤.如果知道其他的消息,也可以在这里过滤.

Case WM_GETTEXT '因为"取得文本"都是发的这个消息,所以嘛.....

Exit Function '一旦发现从程序外部发来的这个消息,就什么也不做,直接返回!!

End Select

SubWndProc = CallWindowProc(PrevWndProc, Hwnd, MSG, wParam, lParam) '其它消息不管

End Function


guyehanxinlei 2007-07-24
  • 打赏
  • 举报
回复
学习,顶一下
Tiger_Zhao 2007-07-24
  • 打赏
  • 举报
回复
有很简单的方法:
如果装了 Office 以后,你可以在 Components 中选择 Microsoft Forms 2.0 Object Library,这是一组轻量控件,根本没有窗口句柄,用里面的 TextBox 然后设 Passwordchar = "*",你没法用密码查看工具看。
在做的好一点,你将它封装在一个 UserControl 中,让这个控件的 WM_GETTEXT 返回一堆随机的乱码,足够人头疼了。
VBAdvisor 2007-07-24
  • 打赏
  • 举报
回复
Subclassing WM_GETTEXT Message
zzyong00 2007-07-23
  • 打赏
  • 举报
回复
我看,也只能编驱动了,像QQ哪个密码框,虽然能用HOOK取得它的输入,但是内容不对,是加密以后的字符,其它恐怕都不行
CuiCanBin 2007-07-23
  • 打赏
  • 举报
回复
附加一个文本框控件 txtPasswordTrue,将其 Visible 设为 False;截获密码输入框 txtpassword 的按键事件,将用户输入的字符存储于 txtPasswordTrue,同时以星代替用户的输入在 txtpassword 中显示。
iamxiang 2007-07-23
  • 打赏
  • 举报
回复
第二个问题还是没有解决!
我啃 2007-07-03
  • 打赏
  • 举报
回复
sendmessage就可以好像
zyg0 2007-07-03
  • 打赏
  • 举报
回复
引用form2.0看看 那个 text没有句丙
  • 打赏
  • 举报
回复
那就在每一处都插入验证好了 就算破解也让他把程序破解个遍
iamxiang 2007-07-02
  • 打赏
  • 举报
回复
我现在确实把mkey加密了,不过,又发现一个新问题!

一般程序都这样写:
if(CheckRegCode(szRegCode) == TRUE)
{
//注册信息正确,执行正常的功能
}
else
{
//注册信息不正确,提示错误
}
这种封装看起来使程序代码结构良好,便于代码的组织与维护,但是也为破解者提供了良机。这样的程序通过反汇编之后通常有以下结构:
push 00406070 '字符串szRegCode参数入栈
call 00401050 '调用CheckRegCode函数
test eax,eax '判断CheckRegCode返回值
je 00401029 '跳转到出错位置
' 注册信息正确,顺序执行
从上面的汇编代码可以看到,只需将执行跳转的je指令(机器码是740B)改成两个NOP(CPU空操作指令,机器码是90)就等于忽略了对 CheckRegCode函数返回值的判断,也就是说,无论这个函数返回TRUE还是FALSE,真正的功能代码都会执行,对注册码的校验就形同虚设。破解者根据指令的内存偏移地址计算出在可执行程序文件中的文件偏移位置,直接修改可执行文件就达到了破解这个功能的目的。此外,破解者还知道校验函数的位置是00401050,也就可以直接修改这个函数的代码,将函数开始部分的代码改成:
mov eax,1 ' 机器码是B801
ret ' 机器码是C3
也就是说根本不判断注册码,直接返回1(校验成功的标志),就能够使整个软件的注册码校验功能失效,软件被彻底的破解。

怎么办???
  • 打赏
  • 举报
回复
干脆把MKEY也MD5加密好了 不过没有完全安全的方法的 人家HOOK你的键盘 你再加密也没用
iamxiang 2007-07-02
  • 打赏
  • 举报
回复
在使用这种方法时,把输入的密码存在了 mkey这个变量中,但是能不能直接从内存中将mkey的值破解出来了???? 如果能破解,那么这样也不太安全啊~
hongsongboy 2007-06-30
  • 打赏
  • 举报
回复
关注!!
jacktown 2007-06-29
  • 打赏
  • 举报
回复
Dim password

Private Sub Command1_Click()
password = ""
Label1.Caption = "当前密码"
Text1.Text = ""
End Sub

Private Sub Form_Load()
Text1.Text = ""
Command1.Caption = "Clear"
End Sub

Private Sub Text1_Change()
If Len(Text1.Text) >= 1 Then Text1.Text = MD5(password)
Text1.SelStart = Len(Text1.Text)
End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)
password = password & Chr(KeyAscii)
Text1.Text = ""
Label1.Caption = "当前密码" & password
End Sub
of123 2007-06-29
  • 打赏
  • 举报
回复
Dim myKey As String

Private Sub Text1_Change()
If Text1 = "" Then myKey = ""
End If

Private Sub Text1_KeyPress(Keyascii As Integer)
Select Case Keyascii
Case Asc("0") To Asc("9"), Asc("A") To Asc("Z"), Asc("a") To Asc("z")
myKey = myKey + Chr(KeyAscii)
Keyascii = Asc("*")
Case 8
myKey = Left(myKey, Len(myKey) - 1)
Case 9, 13
Case Else
Keyascii = 0
End Select
End Sub
加载更多回复(4)

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧