👨🏿‍🦱 dnxl2019
关注数: 23 粉丝数: 115 发帖数: 5,313 关注贴吧数: 37
一段VB6找色源码 速度 1920*1080全屏,从左上到右下找色,找到的点靠近右下角时耗时 40-70毫秒,按键精灵的findcolorex稳定30+ 有没有大手子再优化一下, 最耗时的地方就是BitBlt载图和GetDIBits拷贝到数组,这俩货花30+毫秒 Option Explicit Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long Private Declare Function BitBlt Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal opCode As Long) As Long Private Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hdc As Long) As Long Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long Private Declare Function GetDIBits Lib "gdi32" (ByVal hdc As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long Private Declare Sub GetMem4 Lib "msvbvm60.dll" (ptr As Any, src As Any) Private Const HORZRES As Integer = 8 Private Const VERTRES As Integer = 10 Private Type BITMAPINFOHEADER biSize As Long biWidth As Long biHeight As Long biPlanes As Integer biBitCount As Integer biCompression As Long biSizeImage As Long biXPelsPerMeter As Double biClrUsed As Double End Type Private Type RGBQUAD rgbBlue As Byte rgbGreen As Byte rgbRed As Byte rgbReserved As Byte End Type Private Type BITMAPINFO bmiHeader As BITMAPINFOHEADER bmiColors As RGBQUAD End Type Private Const BI_RGB = 0& Private Const DIB_RGB_COLORS = 0 Public Function FindColor(x As Long, y As Long, x1 As Long, y1 As Long, nColor As Long, Rgboffset As Byte, rx As Long, ry As Long) As Boolean '参数:左上角X,左上角Y,右下角X,右下角Y,10进制色值,色差值,返回X,返回Y Dim hdc As Long Dim hDcmem As Long Dim hBmp As Long Dim oldBmp As Long Dim bmi As BITMAPINFO Dim bits() As RGBQUAD Dim width As Long Dim height As Long Dim Red As Long Dim Blue As Long Dim Green As Long Dim col As RGBQUAD Dim off As Long width = x1 - x height = y1 - y If width > Screen.width \ Screen.TwipsPerPixelX Then width = Screen.width \ Screen.TwipsPerPixelX If height > Screen.height \ Screen.TwipsPerPixelY Then height = Screen.height \ Screen.TwipsPerPixelY ReDim bits(width * height) hdc = GetDC(0) hDcmem = CreateCompatibleDC(0) hBmp = CreateCompatibleBitmap(hdc, width, height) oldBmp = SelectObject(hDcmem, hBmp) bmi.bmiHeader.biBitCount = 32 bmi.bmiHeader.biCompression = BI_RGB bmi.bmiHeader.biPlanes = 1 bmi.bmiHeader.biWidth = width bmi.bmiHeader.biHeight = -height bmi.bmiHeader.biSize = Len(bmi.bmiHeader) Call BitBlt(hDcmem, 0, 0, width, height, hdc, x, y, vbSrcCopy) Call GetDIBits(hDcmem, hBmp, 0, height, bits(0), bmi, DIB_RGB_COLORS) Call SelectObject(hDcmem, oldBmp) Call DeleteObject(hBmp) Call DeleteDC(hDcmem) Call ReleaseDC(0, hdc) Call GetMem4(ByVal VarPtr(nColor), ByVal VarPtr(col)) For rx = 0 To width - 1 For ry = 0 To height - 1 off = rx + ry * width Red = bits(off).rgbRed Green = bits(off).rgbGreen Blue = bits(off).rgbBlue If Abs(Red - col.rgbBlue) <= Rgboffset And Abs(Green - col.rgbGreen) <= Rgboffset And Abs(Blue - col.rgbRed) <= Rgboffset Then rx = rx + x: ry = ry + y FindColor = True Exit Function End If Next Next rx = -1 ry = -1 End Function
不按套路 VB6拦截64位进程函数调用 起因是看到1年前的一个帖子 https://tieba.baidu.com/p/7278136876?pid=138522633377&cid=138557358445#138557358445 最近是闲的蛋痛,来验证一下我当时的回复 目标进程是64位,纯用VB6写是不可能使用DLL,本应该DLL干的活现在只能用64位汇编构建 开始是想用jmp跳转,结果发现很多地方不好下手,因指令字节限制,写跳转指令太麻烦 最后干脆一步到位 硬件断点+VEH异常处理 拦截原理, 在目标进程注册一个用汇编构建的VEH异常处理函数,在需要拦截的地址下硬件断点,目标代码执行到断点地址线程中断,进入VEH异常处理函数执行 VEH函数内并不处理异常,而是通过sendmessage把参数指针发给我们的VB6程序,同时sendmessage函数会堵塞当前线程等待结果返回才会继续运行。 VB6程序在收到消息后接管目标进程的异常处理,通过sendmessage发过来的参数指针从目标进程读出中断处的信息,包括CONTEXT(线程上下文) 有了这个线程上下文,就能拿到目标线程中断处所有继存器的值,如果是函数头下断,这里面包括函数调用的各种信息,参数,返回地址什么的 可以读出来,也可以修改再写回去,处理完后返回,让目标进程继续运行,这样拦截不需要修改原机器码,传说中的无痕HOOK,而且是垮进程处理异常也没谁了 下面是一些关键代码
网络验证的实现原理 经常看到有人在问,脚本弄好了怎么限制使用,最近比较闲就随便说说网络验证这块的简单实现方法。 说简单,需要的知识面也是有点复杂,服务器搭建,数据库的使用等等,说难也不难,现成的东西一堆,组装一下就可以用。只不过租用服务器要花钱,不过现在便宜的云服务器也就几十块一年,真正需要的也不会在乎这个。 话说回来,咱现在是学习阶段,不需要花钱去租服务器,自己搭建一个本地的就行。入门就从简单的开始,网络访问协议:HTTP,服务器动态脚本:ASP(熟悉按键语法,用ASP是最适合的,都跟VBS同系),数据库,古懂级:ACCESS, 首先搭建本地环境,现在大多人使用的系统为WIN10,很多老的东西不兼容,比如ACCESS我就找不到能在WIN10 X64上面运行的版本,见意装个虚拟机,系统为WIN7以下,WIN7 XP 都行,(搞软件开发的,很多时候都需测试系统的兼容性,如果只有一台电脑装个虚拟机没错),装上OFFICE(如果是系统之家的GHOST系统基本上都自带有),然后再装ACCESS,如果是WIN7系统,跳过以上步骤。 接下来,网上找个简单ASP服务器,(有条件你也可以配置WINDOW的IIS,不过一般家用系统都不带)。 我这是装了个WIN7虚拟机,下载解压后如上图 然后新建个主文件如下新建ACCESS数据库改名为data.mdb,直接双击打开,创建一个表右键设计视图,表名改为table1然后编辑字段保存退出,数据库存已经完成 ==先去吃个饭,晚点再来更后面的内容
1 下一页