Archive for 12月, 2007

验证码识别技术01

验证码识别技术
模拟精灵是首个公开最有效的验证码识别技术的软件,
使用模拟精灵制作了大量的免费、商用群发软件,对很多复杂BT的验证码都能成功的识别。
但是验证码仍然需要精湛的技术与足够的耐心。请牢记这一点。
验证码识别不适合浮躁的人去做。
验证码识别是一项特殊的技术,任何一个公开的验证码识别代码都会很快的失效。
因为代码的公开后相关网站都会很快的更改验证码。
所以下面我只会介绍其原理。
在这里讨论验证码识别技术纯粹基于技术研究目的。
公开此技术也是为了让更多的网站采取更有效的防范措施。
禁止任何人利用这里介绍的验证码识别技术滥发垃圾信息。
本文介绍的验证码识别适用于比较复杂的图片验证码,也是大多数网站采用的方法。
有一些网站的验证码极简单,例如在网页中直接显示验证码字符而不是图片,或者图片的文件名直接就是验证码上的字符。
或者有其他规律可循,或者有其他明显的漏洞可以利用(例如通过改写访问验证码页面的源代码使验证码不刷新)。
这一类的验证码识别极其简单,只要熟练掌握web库、element库的函数即可,不需要使用下面介绍的方法。
一、下载验证码样本
打开c:\test文件夹,选“查看缩略图”,
然后重复运行下面的LAScript脚本,每运行一次,就查看c:\test下自动生成的图片,把图片上的字符改为文件名.
例如图片上面显示5,就把文件名改为5.jpg.
如果变化比较复杂的验证码,可以对每个字符多用几个样本,第一个字符为验证码字符,第二个字符可以为任意字符。
例如:5a.jpg , 5b.jpg , 5c.jpg ………..等等。
样本多就会识别能力就越强。

img = image.new();

–下载图像,没有后缀名要显示指定*.bmp格式
img:getURL("http://www.***.com/test.asp","*.png");
assert(img:ok(),"下载验证码失败");
img:Crop(4 ,3 , 56 ,18 )
img:save("c:\\test\\test.jpg") –保存到硬盘

–折分图片,指定一行四列
img2,img3,img4,img5 = img:split(1,4);
img2:save("c:\\test\\0001.jpg")
img3:save("c:\\test\\0002.jpg")
img4:save("c:\\test\\0003.jpg")
img5:save("c:\\test\\0004.jpg")
image.del(img);

如何确定图片后缀名

在整个验证码识别过程中,格式与后缀名一定不能搞错,否则就会失败。
通常:asp的验证码是bmp格式,php的验证码是png格式,其他验证码很多是jpg格式。
简单的,在验证码上右键点选“图片另存为”,就可以看到格式(不一定准确)。
另外,你可以用UltraEdit等以二进制方式打开看文件头部
首先下载:
str = web.getURL("http://www.***.com/test.asp")
string.save( str,"c:\\test.bin")
然后用UE打开test.bin看文件头部(第一行)
jpg文件头部有 JFIF 字眼
png文件头部 有 PNG 字眼
gif文件头部有 GIF字眼
如果你搞不清楚,这时候就不要指定后缀名
img:getURL("http://vwww.***.com/test.asp","")
这样就可以下载了

二、生成验证码样本数据库
复制下面的代码并粘贴到fap程序的「脚本区块」内,然后点击"回放运行",最后再点击"读取源代码"。
你就可以在ApeML源代码最后面的「数据区块」中看到生成的验证码样本了。
将「数据区块」的内容复制需要使用验证码识别的fap模拟程序中覆盖「数据区块」即可。
local tkey ={A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0};
–在字典中添加所有数字键
for i =0,9,1 do
    tkey[ tostring(i) ] = 0;
end;
–如果一个字符有多个样本,例如 5A.jpg 5B.jpg 5C.jpg
for k,v in pairs(tkey) do
    if((#k)~=2)then –如果元素键名不是两位字符
        tkey[k.."A" [...]

验证码识别技术

由于现在很多网站,为了加强安全性,以及防止程序的自动操作网站,都加入的了验证码技术。但却给广大站长推广宣传网站带来的麻烦。所以我准备写这篇关于验证码识别技术的文章,不足之处在所难免!本人从来不写东西,今天为了想落伍才写了!
    广大站长宣传推广自己的网站,经常要发布一些宣传广告,如果靠人工,太慢太昂贵,所以理想的办法是使用群发软件,可现在很多网站都有验证码,这成为群发软件的技术难点,而识别也就难点中的难点,好的,闲话少说,言归正传!
我举的例子是比较难于识别的验证码,不讨论不变形、不换字体、不换大小、不旋转的验证码,这里我可能不会写出代码,只是提供我编写的思路,按照这个思路,我写出的程序,比市场上出售的程序的识别率还要高很多。(有兴趣的可以问我,我不想在这里帮别人宣传,呵呵~~)
首先以数字验证码开始,字母的要比数字麻烦一些,不过搞清楚了数字验证码的识别,字母的也就不难了。
验证码一般都是图片,而且一般都是4位数,处理过程是:先分割为4个部分,然后逐一识别,由于分割比较简单,我这里就不说了,我这里只说如何识别。
我的方法是把需要识别的图片,划分为 5 行,3 列,15个块,为什么要划分为15个块呢?先看图!
○■○
■○■
■○■
■○■
○■○
○■○
■■○
○■○
○■○
■■■
■■■
○○■
■■■
■○○
■■■
■■■
○○■
■■■
○○■
■■■
我先举这4个例子吧,其余的大家可以自己画出来。如果做过验证码识别的朋友,肯定很快就明白为什么划分为15个块,其实主要就是因为这样划分更合理,也就更能提高识别率。
我的方法是把需要识别的图片,划分为 5 行,3 列,15个块,然后对每个块进行计算,当每个块里的有效象素超过多少百分比的时候,就标记为 ■,如果没超过就标记为○,(这里为了显示方便我使用了■,○,你完全可以把它标为1、0),这里要注意一下,这里的百分比根据字体的粗细可以取 67%,50%,33%,20%,为什么要取这几个数?主要和计算机的浮点数运算有关,选这几个数,运算更快,且不容易出错,否则计算机在进行大量计算时也是会出错的!当然这里,你完全可以选适合你的验证码图片的百分比!!
如果验证码不变形、不换字体、不换大小、不旋转,我们的识别工作到这一步基本上就结束了,因为已经可以得到比较清晰的块图,对付大多数论坛,就已经足够了。^_^
如果验证码的变形比较大、且有很多字体、大小也不固定、且有旋转,那么我们经过划分、取比率显示后,可能会得到这样一个图:
○■○
○○■
○■○
■○○
■■■
那么这个数字应该是什么数字,我们需要使用排除法!排除所有不可能,在0123456789中,这个图不可能是013456789,他只能是 :2。
写过验证码识别的朋友可能已经明白了!是的,我们需要建立一个类似的数据库,也就是识别库,出现哪些图,他就属于那个数字。
再举一个例子:
○■○
■○○
■■■
■○■
○■○
    这是哪个数字呢??是6,没错
    我这里我需要再说明一下为什么要取5行,3列,15个块,因为块太多了你 的识别库就会很大,块太少了,就会出现很多分不清楚的块图。
另外你取的百分比也需要注意,不能太大也不能太小。
    好了,等做好自己的数据库,这时就可以识别大部分数字了。
最后还有一个问题,就是重复的问题,比如,图片上的数字,明明是 5,可由于它的字体不是常见的字体,且发生了旋转,最后得到这样一个图:
■■■
■○○
■■■
■○■
■■■
在我的数据库里,这个块图,是6,也是就说识别错误,怎么办?
我的解决方法是,在数据库里先把这条数据删除因为这个是错误的。
遇到这种情况,就需要进行二次处理,我的方法是:降低百分比,这时就得到了:
■■○
■○○
■■○
○○■
■■○
    OK,经过降低百分比,图片就由“6”又变为“5”了,呵呵~~~由于降低了百分比,我们需要再建立一个识别库的来存储这些数据。

好了,我的文章就写到这里,只是给大家提供一个思路,可能还有一些细节我没写出来,但主要的方法都提供出来了,希望能起到抛砖引玉的作用

(转)复制出IE临时文件夹内的SWF文件

复制出IE临时文件夹内的SWF文件,也可以是其他类型的文件,这里只是简单演示用FSO遍历文件夹
‘引用Microsoft Scripting RunTime
Dim m_objFSO As New FileSystemObject   ‘定义文件系统对象
Private Declare Function SHGetSpecialFolderLocation Lib "Shell32" (ByVal hwndOwner As Long, ByVal nFolder As Integer, ppidl As Long) As Long
Private Declare Function SHGetPathFromIDList Lib "Shell32" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal szPath As String) As Long
Const MAX_LEN = 200 ‘字符串最大长度
Const PAGETMP = &H20& ‘网页临时文件
Private Sub Command1_Click()
    [...]

自动注册(没有测试)

这个代码没有测试,代码中红色部分比我以前的方法好,所以记下来。
‘————————————–
Sub GotoHome()
‘先引用Microsoft Internet Controls
On Error Resume Next
Set IE = CreateObject("InternetExplorer.application")
IE.Navigate2 "http://www.officefans.net/cdb/logging.php?action=login&sid=mjeBXlv3"
IE.Visible = True
timeie = DateAdd("s", 60, Now())   ‘最久等待60秒
Do While IE.Busy And Not IE.readyState = READYSTATE_COMPLETE
   [...]

自动点网页中的JavaScript链接

‘点正常链接方法很多,这里介绍的是自动点JavaScript链接
Function RunJS(scripts)
‘VB 自动点网页中的Javascript链接
Dim Document
                On Error GoTo ErrHandle
                If scripts = "" Then Exit Function
Set Document = WebBrowser1.Document
                Document.ParentWindow.execScript scripts, "javascript"
                Exit Function
ErrHandle:
    MsgBox "Err"
End Function
‘——————
调用:Call RunJS(Javascript:jsfunci())

webbrowser控件中Navigate和Navigate2的用法有什么区别?

关于 Navigate 的定义:
Sub Navigate(URL As String, [Flags], [TargetFrameName], [PostData], [Headers])
SHDocVwCtl.WebBrowser 的成员
Navigates to a URL or file.
关于 Navigate2 的定义:
Sub Navigate2(URL, [Flags], [TargetFrameName], [PostData], [Headers])
SHDocVwCtl.WebBrowser 的成员
Navigates to a URL or file or pidl.
差别就在与一个 pidl
PIDL 就是 PathIDList,就是说 Navigate2 不仅具有 Navigate 所有的功能还可以通过 pidl 直接浏览文件夹。
平时我们将 pidl 转化为文件夹路径的时候都需要使用 SHGetPathFromIDList 函数,那么 Navigate2 就可以不用使用 SHGetPathFromIDList 函数了,可以直接压入一个 Long 值。
这也就显示上面 Navigate 中 URL 数据类型是 String,而 [...]

VB 显示网上的图片的两种方法

Private Declare Function OleLoadPicturePath Lib "oleaut32.dll" (ByVal szURLorPath As Long, ByVal punkCaller As Long, ByVal dwReserved As Long, ByVal clrReserved As OLE_COLOR, ByRef riid As TGUID, ByRef ppvRet As IPicture) As Long
Private Type TGUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End [...]

比尔盖茨嘴里吐出的十条“金玉良言”

关键字:比尔 盖茨 管理

TOM科技讯 据英国《金融时报》调查:全球25个国家的1000位CEO、基金经理认为:微软仍是最受尊敬的公司,并在企业创新、投资价值两项中排名第一。
调查结果发现:今天的比尔・盖茨成为最受尊敬的商界领袖,其地位和影响力仅次于世界管理学之父杜拉克。
以下为盖茨先生在一次讲话中给出的十条忠告。
盖茨的十条“金玉良言”
1、社会充满不公平现象。你先不要想去改造它,只能先适应它。(因为你管不了它)。
2、世界不会在意你的自尊,人们看的只是你的成就。在你没有成就以前,切勿过分强调自尊。(因为你越强调自尊,越对你不利)。
3、你只是中学毕业,通常不会成为CEO,直到你把CEO职位拿到手为止。(直到此时,人们才不会介意你只是中学毕业)。
4、当你陷入人为困境时,不要抱怨,你只能默默地吸取教训。(你要悄悄地振作起来,重新奋起)。
5、你要懂得:在没有你之前,你的父母并不像现在这样“乏味”。你应该想到,这是他们为了抚养你所付出的巨大代价。(你永远要感恩和孝敬他们,才是硬道理)。
6、在学校里,你考第几已不是那么重要,但进入社会却不然。不管你去到哪里,都要分等排名。(社会、公司要排名次,是常见的事,要鼓起勇气竞争才对)。
7、学校里有节假日,到公司打工则不然,你几乎不能休息,很少能轻松地过节假日。(否则你职业生涯中一起跑就落后了,甚至会让你永远落后)。
8、在学校,老师会帮助你学习,到公司却不会。如果你认为学校的老师要求你很严格,那是你还没有进入公司打工。因为,如果公司对你不严厉,你就要失业了。(你必须清醒地认识到:公司比学校更要严格要求自己)。
9、人们都喜欢看电视剧,但你不要看,那并不是你的生活。只要在公司工作,你是无暇看电视剧的。(奉劝你不要看,否则你走上看电视连续剧之路,而且看得津津有味,那你将失去成功的资格)。
10、永远不要在背后批评别人,尤其不能批评你的老板无知、刻薄和无能。(因为这样的心态,会使你走上坎坷艰难的成长之路)。

动态创建和删除VB控件

摘要:介绍在Visual Basic环境中利用动态创建和删除控件的方法,比较了两者异同,阐述了在实际应用中,Active X控件在程序运行时动态加载和删除的方法。
关键词:Visual Basic 6.0;控件;控件集合;控件数组;属性;Active X
1.概述
在使用Visual Basic 进行程序设计的过程中,如果能在运行时刻动态地创建和删除控件,可以极大地丰富界面的处理和变化。本人在设计网络监控系统时,需要在原理图与实物示意图间切换。切换的过程采用本文介绍控件的动态创建和删除来实现,有效地节省了系统资源,同时也有利于简化界面的维护。下面将就Visual Basic 6.0中的控件在运行时刻的创建和删除的两种方法——控件数组和控件集合作详细的阐述。
2.基于控件数组的动态控件的创建与删除
VB中的控件数组实际上也是一种数组,其中的每个控件具有相同的Name属性,但具有不同的Index属性,在这里Name属性类似于数组的名字,而Index属性类似于数组的下标。同时,控件数组也支持普通VBA数组的LBound 、UBound和Count方法,控件数组中的控件可以共享一个事件过程,便于代码的编写和集中处理,这正是使用控件数组的最大的理由。
但是控件数组与普通的数组并非完全一样,它不需要定义大小,只有这样我们才可以动态的扩展它。
下面给出利用Load命令动态添加控件和Unload命令动态删除控件的一般方法:
(1)         首先在窗体上放置一个TextBox,其Name属性设置为Text1,Index属性设置为0,这样我们就创建了一个TextBox控件数组,其中有一个成员。
(2)         在窗体上放置一个命令按钮Command1,在其Click事件中添加如下的代码:
Load Text1(1)
Text1(1).left=0
Text1(1).visible=true
(3)         在窗体上放置一个命令按钮Command2,在其Click事件中添加如下的代码:
Unload Text1(1)
(4)         运行。单击命令按钮Command1,窗体上会出现一个新的文本框;单击命令按钮Command2,窗体上刚出现的新的文本框就被删除。
需要注意的是:Load命令创建的控件Text1(1)与设计时已经放在窗体上的控件Text1(0)有完全相同的属性,也包括大小和位置等属性,例外的就是Index属性不一样,Visible属性默认为False,所以必须在Load方法执行之后,执行调整控件位置的语句,并把其Visible属性设置为True,以便在窗体上可见。Unload命令只能删除动态加载的控件,若删除设计时创建的控件会产生错误。
另外,利用上面提到的数组的一些方法,可以有效的简化代码的编写。以下的代码可以删除所有动态创建的Text1控件数组中的控件:
Do While Text1.Count>1
    Unload Text1(Text1.Ubound)
Loop
需要说明的是,菜单数组是控件数组的一种特殊的形式,只是它是在菜单编辑器中设置相应的Name和Index属性,而且要求一个菜单控件数组中的菜单项必须是同一级菜单,但是不能创建新的顶级菜单。而动态创建和删除菜单项的方法也使用Load和Unload方法,只是默认情况下其Visible属性是True,而且不用重新设置相应的位置。
3.基于控件集合的动态控件的创建与删除
VB中提供一个Controls集合,用以包含当前窗体中的所有的控件,这对于实现一些功能相对复杂的操作相当有好处。而且Controls集合也是集合的一种,它支持一般集合的Count等方法和相应的检索机制。以下两例就是利用这个控件集合的巧妙实现。
要清空当前窗体上的所有的文本框,可以如下实现:
Dim Ctl as Control
For Each Ctl in Controls
    If Typeof Ctl is Textbox then
        Ctl.Text=””
    Endif
Next Ctl
也可以利用集合的Count方法如下实现:
For i=0 To  Controls.Count-1
    If Typeof Ctl is TextBox
        Controls(i).Text=””
    Endif
Next i
当然,控件集合毕竟是一种特殊的集合,下面给出利用Add方法动态添加控件,Remove方法动态删除控件的一般方法:
(1)         Controls集合的Add方法
其语法格式为:
Set mycontrol = controld.Add(ProgId, Name, [Container])
在这里,mycontrol是一个自定义的控件对象,若需要新创建的控件对事件做出反应,还要再定义该对象时增加WithEvents关键字。
ProgId是库名.控件名形式的控件类的名字,ToolBox 中的控件一般具有类似于VB.CommandButton这样的形式。而Active X控件的形式则有所差别,比如若使用Windowless控件库中的控件一般具有类似于MsWless.WlText的形式。
Name参数是想赋给控件的名字,与控件的Name属性相对应。
Container参数是可选的,它代表欲放置控件的容器,默认情况下是放置在窗体上。
下例是在窗体上动态创建一个命令按钮,然后单击命令按钮时,执行相应的动作:
Dim WithEvents mycontrol As CommandButton
Private Sub Form_Load()
Set mycontrol = Controls.Add("VB.commandbutton", "mycontrol")
mycontrol.Left = [...]

最爱班得瑞

班得瑞中文网站可以在线听很多专辑,在工作累的时候听听这样的音乐真是一种享受!
1990年发迹瑞士的班得瑞,来自一群爱好生命的年轻作曲家、演奏家及音源采样工程师等等青年才俊。团长奥利弗史瓦兹是一位多才多艺的音乐人,不但专长多种乐器,更熟稳先进的录音工程。他的特别率先采用先进的数字采样技术,将自然界的声响,运用后期母带24bit数字录制,钜细糜遗地记录下来清晰无比音质。奥利弗史瓦兹更曾与为莎拉布莱曼制作“Timeto Say Good-bye”的天王制作人亚历士克里斯坦森合作,但挚爱新世纪音乐的他,最终选择将一身才华奉献给瑞士山林!
班得瑞闻名全球的独特之处
莫过于班得瑞每当执行音乐制作时,从头到尾,深居在阿尔卑斯山林中,坚持不掺杂一丝毫的人工混音,直到母带完成!置身在欧洲山野中,让班得瑞拥有源源不绝的创作灵感,也找寻到自然脱俗的音质。每一声虫声、鸟鸣、花落流水,都是深入山林、湖泊,走访瑞士的阿尔卑斯山,罗春湖畔、玫瑰峰山麓,少女峰等处实地纪录。
媲美国家地理杂志的专业精神
有时为了采集自然音效,上山下水、甚至露宿荒野,对班得瑞来说算是家常便饭。比如必须熟知每一种候鸟的季节性与飞行路径,有时为了数分钟的音效,往往在荒野守侯达数月之久!有时必须举着比人身还长的录音架往峡谷中采集风声,整个过程险象环生,但也因为如此,班得瑞才能将这些天然的音效栩栩如生地融合在专辑之中……
更胜Discovery的听觉新感受
班得瑞成功的将新世纪风格结合大自然音效,扩展了音乐深度,构成现今最具高临场感的大自然音乐!班得瑞的音乐,从头到尾只强调一种轻柔的绝对性,没有艰涩难懂的曲风,没有生硬的个人风格,不只是悦耳好听,同时也是最纯净、最一尘不染的新世纪音乐典范!
大自然的『心灵投手』要你好听
奥利费史瓦兹展现他独特的编曲手法,以清爽的配器架构出零压力,零负担的乐曲,加上长年的录音室经验,细酌每一轨声道的分辨率,全音场效果更具神秘的空灵感!奥利费史瓦兹说:“班得瑞的音乐是兼具视觉、触觉、与听觉的,我们从大自然中所得到的创作灵感,宛如物线般将一直延伸,飞向到地球另一端,它不只是新世纪音乐,更是淬炼自大自然的心灵投手!”
班得瑞音乐最强的3大特色:
1. 实地走访瑞士的罗春湖畔和玫瑰山簏、阿尔卑斯山收藏自然元音。
2. 主要强调一种轻柔的绝对性,是最纯净、最能安定人心的音乐处方签 。
3. 独特超广角音场、空灵缥缈的编曲构成最具高临场感的大自然音乐。
班得瑞中文网站 http://www.bandari.net/