| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3018 人关注过本帖, 1 人收藏
标题:2010年俺发的第一个程序——HTTPProxySend v0.4 (win32汇编)
只看楼主 加入收藏
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
结帖率:100%
收藏(1)
 问题点数:0 回复次数:16 
2010年俺发的第一个程序——HTTPProxySend v0.4 (win32汇编)
HTTP代理发送器 v0.4

程序介绍

本程序可以向指定地址发送指定数据包 通过构造数据包可实现刷访问量 恶意灌水等效果

支持界面隐藏 可按Windows键+H和Windows键+S控制界面的隐藏和显示 方便您的使用

默认的代理列表是PROXY.txt 里面的代理用 221.214.27.252:808 这样的形式 直接用记事本里的回车换行的形式输入多行数据 最大支持的代理数由代码中的 MAX_PROXY 指出

特别注意:请在代理列表的最后留一个空行 即在最后一个代理后打一个回车 只有这样才能保证列表读取正常!!!

同样 若要正确发送数据 也应在要发送的数据后加上两个空行 只有这样才能发送成功

在本说明文件后里随便列了一些世界各地的代理(其实代理很好找啦 大家自己找罢~~~~)

v0.4新增了自动运行的功能 加参数auto后可进入自动运行状态 程序会根据AUTO.txt的内容自动运行

AUTO.txt格式请见例子 从上到下各部分依次是 线程 发送间隔 发送目的IP和端口 内容

注意 程序会完全根据AUTO.txt的内容进行发送 且此过程无法自动停止 请慎重使用~


编写

本程序使用Win32汇编语言编写 IDE采用MasmPlus MasmPlus作者为Aogo 欢迎到www.下载MasmPlus

本程序界面采用USkin 作者的联系方式为 support@  http://www.

版权

本程序开放源码 为免费软件 允许自由转载 但请保留作者信息!

因使用本程序造成的一切后果与本人无关!请谨慎使用!



                                                                        zklhp
                                                                        2009.12.31

程序+代码

HTTPProxySend v04.rar (444.6 KB)




[ 本帖最后由 zklhp 于 2010-1-5 23:01 编辑 ]
搜索更多相关主题的帖子: 汇编 
2010-01-05 23:00
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
程序代码:

;MASMPlus 代码模板 - 以对话框做为主窗口的程序

;*****************************************************************************************************************
;作者:zklhp  
;Email:zklhp@
;QQ:493165744
;时间:2009.12.31
;版权所有    转载请保持完整
;*****************************************************************************************************************

.386
.Model Flat, StdCall
Option Casemap :None

Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc
include shell32.inc
include USkin.inc
Include WSock32.inc
include shlwapi.inc
;include libc.inc

includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
includelib shell32.lib
includelib USkin.lib
Includelib WSock32.Lib
includelib shlwapi.lib
includelib msvcrt.lib


include macro.asm
include _CmdLine.asm

    ;懒得自己写代码了 用了C的运行时库~
    atoi  proto C lpszString_IN:DWORD
    strchr  proto C lpszString_IN:DWORD,char_IN:DWORD
    fgets proto C lpBuf_OUT:DWORD,size_IN:DWORD,hFile_IN:DWORD
    sscanf proto C hFile_IN:DWORD,lpszFormat_IN:DWORD,var_OUT:VARARG
    fopen PROTO C lpszFileName_IN:DWORD,lpszMode_IN:DWORD
    fclose PROTO C hFile_IN:DWORD
    fread proto C lpBuf_OUT:DWORD,size_IN:DWORD,count_IN:DWORD,hFile_IN:DWORD
    ftell proto C hFile_IN:DWORD
    _filelength proto C hFile_IN:DWORD


include rsrc.inc

_stPROXY    struct
    _dwIP        dd ?
    _dwPort    dd ?
_stPROXY    ends

    DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
    
    ID_TIMER            equ 20
    ID_WINS            equ 10
    ID_WINH            equ 11
    F_STOP            equ 0FFFFFFFH
    MAX_PROXY        equ 512


.data
    szAbout    db 'HTTP代理发送器 v0.4',0dh,0ah,'By zklhp  Email:zklhp@',0dh,0ah,'版权所有    转载请保持完整',0
    
    x        FLOAT        210.0f
    y        FLOAT        1.0f
    
    szSend    db 'GET http://www2.ouc. HTTP/1.1',0dh,0ah
                db 'Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*',0dh,0ah
                db 'Accept-Language: zh-cn',0dh,0ah
                db 'Accept-Encoding: gzip, deflate',0dh,0ah
                db 'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',0dh,0ah
                db 'Host: www2.ouc.',0dh,0ah,0dh,0ah,0
    


.data?
    IsAuto        dd ?    ;若加参数 auto 则为自动模式
    hInstance    dd ?
    hWin            dd ?
    stProxy        _stPROXY MAX_PROXY dup(<>)
    stWSA            WSADATA <?>
    dwStop        dd ?
    dwTimeOut    dd ?
    szSendBuf    db 40960 dup(?)
    dwThreadID    dd ?

.CODE

_SendProc    proc uses ebx edi esi _Param:DWORD
    
    local @szBuf[2048]:BYTE
    local @stSin:sockaddr_in
    local    @hSocket:DWORD
    
    assume esi:ptr _stPROXY
    mov @stSin.sin_family,AF_INET
    
    invoke Sleep,_Param    ;这样把各个线程的发送错开 防止同一时间有很多链接
    
    ;每次循环检测停止标志位 若为F_STOP则线程停止
    .while dwStop != F_STOP
        lea esi,stProxy
        
        .while [esi]._dwIP
            @Begin:
            mov eax,[esi]._dwPort
            mov @stSin.sin_port,ax
            mov eax,[esi]._dwIP
            mov @stSin.sin_addr,eax
            invoke socket,AF_INET,SOCK_STREAM,0
            .if eax == INVALID_SOCKET
                invoke WSAGetLastError
                invoke wsprintf,addr @szBuf,CTXT('DeBug:socket fail  WSAGetLastError:%x',0dh,0ah),eax
                invoke SendDlgItemMessage,hWin,IDC_EDT3,EM_REPLACESEL,0,addr @szBuf
                jmp @Next
            .endif
            mov @hSocket,eax
            invoke connect,@hSocket,addr @stSin,sizeof @stSin
            .if eax == SOCKET_ERROR
                invoke WSAGetLastError
                invoke wsprintf,addr @szBuf,CTXT('DeBug:connect fail WSAGetLastError:%x',0dh,0ah),eax
                invoke SendDlgItemMessage,hWin,IDC_EDT3,EM_REPLACESEL,0,addr @szBuf
                invoke closesocket,@hSocket
                jmp @Next
            .endif
            invoke lstrlen,offset szSendBuf
            invoke send,@hSocket,offset szSendBuf,eax,0
            invoke closesocket,@hSocket
            invoke Sleep,dwTimeOut
            ;若出错 一般是代理服务器被关了 这样其实是连接超时 所以再睡没意义 应减少无效链接占用的时间
            @Next:
            add esi,sizeof _stPROXY
            
        .endw
    .endw
    assume esi:NOTHING
    
@ExitThread:
    xor eax,eax
    ret
    
_SendProc endp

START:

    invoke USkinInit,NULL,NULL,CTXT("VistaPerfection.msstyles")    ;初使化USkin
    invoke USkinApplyColorTheme,x,y
    ;判断模式
    invoke _argc
    .if eax == 2
        invoke _argv,1,offset szSendBuf,sizeof szSendBuf
        invoke lstrcmpi,offset szSendBuf,CTXT('auto')    ;自动模式
        .if eax != 0    ;不为0 正常
            mov IsAuto,FALSE
        .else                ;为0 自动模式
            mov IsAuto,TRUE
        .endif
    .endif
    
    invoke GetModuleHandle,NULL
    mov hInstance,eax
    invoke DialogBoxParam,hInstance,IDD_DLG1,0,offset DlgProc,0
    invoke USkinExit        ;退出USkin
    invoke ExitProcess,0

DlgProc proc hWnd,uMsg,wParam,lParam
    
    local @hFile:DWORD
    local @szBuf[256]:BYTE
    
    .if uMsg==WM_INITDIALOG
        
        invoke LoadIcon,hInstance,ICON_168
        invoke SendMessage,hWnd,WM_SETICON,ICON_SMALL,eax
        
        ;限制文字个数
        invoke SendDlgItemMessage,hWnd,IDC_EDT1,EM_LIMITTEXT,5,0
        invoke SendDlgItemMessage,hWnd,IDC_EDT6,EM_LIMITTEXT,sizeof szSendBuf,0
        
        ;注册热键
        invoke RegisterHotKey,hWnd,ID_WINS,MOD_WIN,VK_S
        invoke RegisterHotKey,hWnd,ID_WINH,MOD_WIN,VK_H
        
        push hWnd
        pop hWin
        
        invoke SendMessage,hWnd,WM_HOTKEY,ID_WINH,0
        
        ;输出信息
        invoke SendDlgItemMessage,hWnd,IDC_EDT3,EM_REPLACESEL,0,CTXT('欢迎使用HTTP代理发送程序 请先阅读说明文件 注意程序的要求 否则出错~',0dh,0ah)
        invoke SendDlgItemMessage,hWnd,IDC_EDT6,EM_REPLACESEL,0,offset szSend
        
        invoke WSAStartup,0202h,offset stWSA
        
        ;初始化地址列表
        assume esi:ptr _stPROXY
        lea esi,stProxy
        mov [esi]._dwIP,0
        assume esi:NOTHING
        
        .if IsAuto == TRUE
            invoke SetTimer,hWnd,ID_TIMER,3000d,0
        .endif
        
    .elseif uMsg==WM_COMMAND
        mov eax,wParam
        and eax,0ffffh
        .if eax==IDOK
            invoke SendMessage,hWnd,WM_COMMAND,IDC_BTN1,0
        .elseif eax==IDCANCEL
            invoke SendMessage,hWnd,WM_CLOSE,0,0    ;按ESC退出
        .elseif    eax==IDC_CHK1
                invoke IsDlgButtonChecked,hWnd,IDC_CHK1    ;看是否直接发送
                .if eax == BST_CHECKED
                    ;直接发送
                    invoke GetDlgItem,hWnd,IDC_EDT4
                    invoke EnableWindow,eax,TRUE
                    invoke GetDlgItem,hWnd,IDC_EDT7
                    invoke EnableWindow,eax,TRUE
                    assume esi:ptr _stPROXY
                    lea esi,stProxy
                    invoke GetDlgItemText,hWnd,IDC_EDT4,addr @szBuf,sizeof @szBuf
                    .if eax
                        invoke inet_addr,addr @szBuf
                        mov [esi]._dwIP,eax
                        invoke GetDlgItemInt,hWnd,IDC_EDT7,FALSE,FALSE
                        invoke htons,eax
                        mov [esi]._dwPort,eax
                        add esi,sizeof _stPROXY
                        mov [esi]._dwIP,0
                    .else
                        mov [esi]._dwIP,0
                    .endif
                    assume esi:NOTHING
                .else
                    ;使用代理列表
                    invoke GetDlgItem,hWnd,IDC_EDT4
                    invoke EnableWindow,eax,FALSE
                    invoke GetDlgItem,hWnd,IDC_EDT7
                    invoke EnableWindow,eax,FALSE
                    invoke SetDlgItemText,hWnd,IDC_EDT5,0    ;清空
                    ;用了C函数
                    invoke fopen,CTXT('PROXY.txt'),CTXT('r')
                    .if eax == INVALID_HANDLE_VALUE
                        invoke SendDlgItemMessage,hWnd,IDC_EDT3,EM_REPLACESEL,0,CTXT('fail to open PROXY.txt',0dh,0ah)
                        jmp @F
                    .endif
                    mov @hFile,eax
                    assume esi:ptr _stPROXY
                    lea esi,stProxy
                    .while TRUE
                        invoke fgets,addr @szBuf,sizeof @szBuf,@hFile
                        invoke lstrlen,eax
                        mov edi,eax
                        .break .if edi < 2    ;若按照要求的格式最后有一个空行 则最后一次此处得到的长度为1 是换行
                        dec edi
                        lea ecx,@szBuf
                        add ecx,edi
                        mov BYTE ptr [ecx],0    ;除去换行
                        invoke SendDlgItemMessage,hWin,IDC_EDT5,EM_REPLACESEL,0,addr @szBuf
                        invoke SendDlgItemMessage,hWin,IDC_EDT5,EM_REPLACESEL,0,CTXT(0dh,0ah)
                        ;找 : 之前为IP 之后为端口
                        xor eax,eax
                        mov al,':'
                        invoke strchr,addr @szBuf,eax
                        mov edi,eax
                        mov BYTE ptr [edi],0
                        invoke inet_addr,addr @szBuf
                        mov [esi]._dwIP,eax
                        inc edi
                        invoke atoi,edi
                        invoke htons,eax
                        mov [esi]._dwPort,eax
                        add esi,sizeof _stPROXY
                    .endw
                    
                    mov [esi]._dwIP,0
                @@:
                    invoke fclose,@hFile
                    assume esi:NOTHING
                .endif
        .elseif eax==IDC_BTN1
            ;发送
            invoke GetDlgItemText,hWnd,IDC_EDT6,offset szSendBuf,sizeof szSendBuf
            
            @@:
            invoke GetDlgItemInt,hWnd,IDC_EDT2,FALSE,FALSE
            .if eax
                mov dwTimeOut,eax
                invoke GetDlgItemInt,hWnd,IDC_EDT1,FALSE,FALSE
                .if eax
                    mov dwStop,0
                    mov edi,eax
                    xor ebx,ebx
                    .while ebx < edi
                        mov eax,ebx
                        imul dwTimeOut
                        ;这样把Sleep()放在线程函数开头比较好 避免界面没响应的现象
                        invoke CreateThread,0,0,offset _SendProc,eax,0,offset dwThreadID    ;启动线程
                        invoke CloseHandle,eax
                        inc ebx
                    .endw
                .endif
            .endif
            @@:
            assume esi:NOTHING
        .elseif eax==IDC_BTN2    ;取消
            mov dwStop,F_STOP        ;置标志位即可 线程会自动退出
        .elseif eax==IDC_BTN3
            invoke MessageBox,hWnd,offset szAbout,CTXT('关于'),0
        .elseif eax==IDC_BTN4
            invoke SendMessage,hWnd,WM_CLOSE,0,0
        .endif
    .elseif uMsg==WM_TIMER
        
        ;只执行一次 设置各参数 然后发送 不过没有一个办法让他停 这个就是方便新手 当然 也可以省点事啦~
        
        ;一定注意读取的格式
        invoke fopen,CTXT('AUTO.txt'),CTXT('r')
        .if eax == INVALID_HANDLE_VALUE
            invoke SendDlgItemMessage,hWnd,IDC_EDT3,EM_REPLACESEL,0,CTXT('fail to open AUTO.txt',0dh,0ah)
            invoke SendMessage,hWnd,WM_CLOSE,0,0    ;直接退出
        .endif
        mov @hFile,eax
        
        ;第一行 线程数
        invoke fgets,addr @szBuf,sizeof @szBuf,@hFile
        invoke SetDlgItemText,hWnd,IDC_EDT1,addr @szBuf
        
        ;第二行 发送间隔
        invoke fgets,addr @szBuf,sizeof @szBuf,@hFile
        invoke SetDlgItemText,hWnd,IDC_EDT2,addr @szBuf
        
        ;第三行开始 发送IP 这里不区分直接还是用代理 放什么就用什么发送
        
        invoke SetDlgItemText,hWnd,IDC_EDT5,0    ;清空
        
        assume esi:ptr _stPROXY
        lea esi,stProxy
        .while TRUE
            invoke fgets,addr @szBuf,sizeof @szBuf,@hFile
            invoke lstrlen,eax
            mov edi,eax
            .break .if edi < 2    ;若按照要求的格式最后有一个空行 则最后一次此处得到的长度为1 是换行
            dec edi
            lea ecx,@szBuf
            add ecx,edi
            mov BYTE ptr [ecx],0    ;除去换行
            invoke SendDlgItemMessage,hWin,IDC_EDT5,EM_REPLACESEL,0,addr @szBuf
            invoke SendDlgItemMessage,hWin,IDC_EDT5,EM_REPLACESEL,0,CTXT(0dh,0ah)
            ;找 : 之前为IP 之后为端口
            xor eax,eax
            mov al,':'
            invoke strchr,addr @szBuf,eax
            mov edi,eax
            mov BYTE ptr [edi],0
            invoke inet_addr,addr @szBuf
            mov [esi]._dwIP,eax
            inc edi
            invoke atoi,edi
            invoke htons,eax
            mov [esi]._dwPort,eax
            add esi,sizeof _stPROXY
        .endw
        
        mov [esi]._dwIP,0
        
        assume esi:NOTHING
        
        ;最后 内容 缓冲区足够大了
        
        invoke SetDlgItemText,hWnd,IDC_EDT6,0    ;清空
        
        .while TRUE
            invoke fgets,offset szSendBuf,sizeof szSendBuf,@hFile
            invoke lstrlen,eax
            mov edi,eax
            .break .if edi < 2    ;若按照要求的格式最后有一个空行 则最后一次此处得到的长度为1 是换行
            dec edi
            lea ecx,szSendBuf
            add ecx,edi
            mov BYTE ptr [ecx],0
            invoke SendDlgItemMessage,hWin,IDC_EDT6,EM_REPLACESEL,0,offset szSendBuf
            invoke SendDlgItemMessage,hWin,IDC_EDT6,EM_REPLACESEL,0,CTXT(0dh,0ah)
        .endw
        
        invoke SendDlgItemMessage,hWin,IDC_EDT6,EM_REPLACESEL,0,CTXT(0dh,0ah)
        invoke SendDlgItemMessage,hWin,IDC_EDT6,EM_REPLACESEL,0,CTXT(0dh,0ah)
        
        invoke SendMessage,hWnd,WM_COMMAND,IDC_BTN1,0    ;相当于点发送
        
        invoke KillTimer,hWnd,ID_TIMER
    .elseif uMsg==WM_HOTKEY
        .if wParam==ID_WINS
            invoke ShowWindow,hWnd,SW_SHOW
        .elseif wParam==ID_WINH
            invoke AnimateWindow,hWnd,1000,AW_BLEND or AW_HIDE        ;渐变退出
            invoke ShowWindow,hWnd,SW_HIDE
        .endif
    .elseif uMsg==WM_CLOSE
        invoke AnimateWindow,hWnd,1000,AW_BLEND or AW_HIDE            ;渐变退出
        ;取消热键
        invoke UnregisterHotKey,hWnd,ID_WINS
        invoke UnregisterHotKey,hWnd,ID_WINH
        invoke EndDialog,hWnd,wParam
        invoke WSACleanup
    .else
        mov eax,FALSE
        ret
    .endif
    mov eax,TRUE
    ret
DlgProc endp

END START


[ 本帖最后由 zklhp 于 2010-2-11 20:32 编辑 ]
2010-01-05 23:02
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
这个 现在服务器是不是在外国啊

现在学校的网上不去bccn~~~~~
2010-01-05 23:03
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
我学了三四年汇编 写程序还停留在例子程序的水平~~~

失败啊
2010-01-06 12:00
onepc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:223
专家分:569
注 册:2009-8-27
收藏
得分:0 
很不错啊。,,不过偶暂时还没学网络编程方面的。所以记号先。
2010-01-06 16:00
阳小子
Rank: 1
等 级:新手上路
帖 子:26
专家分:6
注 册:2008-8-19
收藏
得分:0 
以下是引用zklhp在2010-1-6 12:00:30的发言:

我学了三四年汇编 写程序还停留在例子程序的水平~~~

失败啊
基本功尤为重要啊,当你编写的东西越多积累的代码/经验也就越多,以后随便编个什么来都容易的多。
2010-01-08 19:38
wxl249424820
Rank: 2
等 级:论坛游民
帖 子:17
专家分:14
注 册:2010-2-6
收藏
得分:0 
你太强悍了,,我崇拜你啊..虽然我一个都没看得懂

我只是只菜鸟,,来学习的
2010-02-06 22:34
静夜思
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:济南的冬天
等 级:管理员
威 望:11
帖 子:8913
专家分:2567
注 册:2004-3-25
收藏
得分:0 
服务器是在国外,过了年再转回来

PS:试试代码着色

程序代码:
;MASMPlus 代码模板 - 以对话框做为主窗口的程序

;*****************************************************************************************************************
;作者:zklhp  
;Email:zklhp@
;QQ:493165744
;时间:2009.12.31
;版权所有    转载请保持完整
;*****************************************************************************************************************

.386
.Model Flat, StdCall
Option Casemap :None

Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc
include shell32.inc
include USkin.inc
Include WSock32.inc
include shlwapi.inc
;include libc.inc

includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
includelib shell32.lib
includelib USkin.lib
Includelib WSock32.Lib
includelib shlwapi.lib
includelib msvcrt.lib


include macro.asm
include _CmdLine.asm

    ;懒得自己写代码了 用了C的运行时库~
    atoi  proto C lpszString_IN:DWORD
    strchr  proto C lpszString_IN:DWORD,char_IN:DWORD
    fgets proto C lpBuf_OUT:DWORD,size_IN:DWORD,hFile_IN:DWORD
    sscanf proto C hFile_IN:DWORD,lpszFormat_IN:DWORD,var_OUT:VARARG
    fopen PROTO C lpszFileName_IN:DWORD,lpszMode_IN:DWORD
    fclose PROTO C hFile_IN:DWORD
    fread proto C lpBuf_OUT:DWORD,size_IN:DWORD,count_IN:DWORD,hFile_IN:DWORD
    ftell proto C hFile_IN:DWORD
    _filelength proto C hFile_IN:DWORD


include rsrc.inc

_stPROXY    struct
    _dwIP        dd ?
    _dwPort    dd ?
_stPROXY    ends

    DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
    
    ID_TIMER            equ 20
    ID_WINS            equ 10
    ID_WINH            equ 11
    F_STOP            equ 0FFFFFFFH
    MAX_PROXY        equ 512


.data
    szAbout    db 'HTTP代理发送器 v0.4',0dh,0ah,'By zklhp  Email:zklhp@',0dh,0ah,'版权所有    转载请保持完整',0
    
    x        FLOAT        210.0f
    y        FLOAT        1.0f
    
    szSend    db 'GET http://www2.ouc. HTTP/1.1',0dh,0ah
                db 'Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*',0dh,0ah
                db 'Accept-Language: zh-cn',0dh,0ah
                db 'Accept-Encoding: gzip, deflate',0dh,0ah
                db 'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',0dh,0ah
                db 'Host: www2.ouc.',0dh,0ah,0dh,0ah,0
    


.data?
    IsAuto        dd ?    ;若加参数 auto 则为自动模式
    hInstance    dd ?
    hWin            dd ?
    stProxy        _stPROXY MAX_PROXY dup(<>)
    stWSA            WSADATA <?>
    dwStop        dd ?
    dwTimeOut    dd ?
    szSendBuf    db 40960 dup(?)
    dwThreadID    dd ?

.CODE

_SendProc    proc uses ebx edi esi _Param:DWORD
    
    local @szBuf[2048]:BYTE
    local @stSin:sockaddr_in
    local    @hSocket:DWORD
    
    assume esi:ptr _stPROXY
    mov @stSin.sin_family,AF_INET
    
    invoke Sleep,_Param    ;这样把各个线程的发送错开 防止同一时间有很多链接
    
    ;每次循环检测停止标志位 若为F_STOP则线程停止
    .while dwStop != F_STOP
        lea esi,stProxy
        
        .while [esi]._dwIP
            @Begin:
            mov eax,[esi]._dwPort
            mov @stSin.sin_port,ax
            mov eax,[esi]._dwIP
            mov @stSin.sin_addr,eax
            invoke socket,AF_INET,SOCK_STREAM,0
            .if eax == INVALID_SOCKET
                invoke WSAGetLastError
                invoke wsprintf,addr @szBuf,CTXT('DeBug:socket fail  WSAGetLastError:%x',0dh,0ah),eax
                invoke SendDlgItemMessage,hWin,IDC_EDT3,EM_REPLACESEL,0,addr @szBuf
                jmp @Next
            .endif
            mov @hSocket,eax
            invoke connect,@hSocket,addr @stSin,sizeof @stSin
            .if eax == SOCKET_ERROR
                invoke WSAGetLastError
                invoke wsprintf,addr @szBuf,CTXT('DeBug:connect fail WSAGetLastError:%x',0dh,0ah),eax
                invoke SendDlgItemMessage,hWin,IDC_EDT3,EM_REPLACESEL,0,addr @szBuf
                invoke closesocket,@hSocket
                jmp @Next
            .endif
            invoke lstrlen,offset szSendBuf
            invoke send,@hSocket,offset szSendBuf,eax,0
            invoke closesocket,@hSocket
            invoke Sleep,dwTimeOut
            ;若出错 一般是代理服务器被关了 这样其实是连接超时 所以再睡没意义 应减少无效链接占用的时间
            @Next:
            add esi,sizeof _stPROXY
            
        .endw
    .endw
    assume esi:NOTHING
    
@ExitThread:
    xor eax,eax
    ret
    
_SendProc endp

START:

    invoke USkinInit,NULL,NULL,CTXT("VistaPerfection.msstyles")    ;初使化USkin
    invoke USkinApplyColorTheme,x,y
    ;判断模式
    invoke _argc
    .if eax == 2
        invoke _argv,1,offset szSendBuf,sizeof szSendBuf
        invoke lstrcmpi,offset szSendBuf,CTXT('auto')    ;自动模式
        .if eax != 0    ;不为0 正常
            mov IsAuto,FALSE
        .else                ;为0 自动模式
            mov IsAuto,TRUE
        .endif
    .endif
    
    invoke GetModuleHandle,NULL
    mov hInstance,eax
    invoke DialogBoxParam,hInstance,IDD_DLG1,0,offset DlgProc,0
    invoke USkinExit        ;退出USkin
    invoke ExitProcess,0

DlgProc proc hWnd,uMsg,wParam,lParam
    
    local @hFile:DWORD
    local @szBuf[256]:BYTE
    
    .if uMsg==WM_INITDIALOG
        
        invoke LoadIcon,hInstance,ICON_168
        invoke SendMessage,hWnd,WM_SETICON,ICON_SMALL,eax
        
        ;限制文字个数
        invoke SendDlgItemMessage,hWnd,IDC_EDT1,EM_LIMITTEXT,5,0
        invoke SendDlgItemMessage,hWnd,IDC_EDT6,EM_LIMITTEXT,sizeof szSendBuf,0
        
        ;注册热键
        invoke RegisterHotKey,hWnd,ID_WINS,MOD_WIN,VK_S
        invoke RegisterHotKey,hWnd,ID_WINH,MOD_WIN,VK_H
        
        push hWnd
        pop hWin
        
        invoke SendMessage,hWnd,WM_HOTKEY,ID_WINH,0
        
        ;输出信息
        invoke SendDlgItemMessage,hWnd,IDC_EDT3,EM_REPLACESEL,0,CTXT('欢迎使用HTTP代理发送程序 请先阅读说明文件 注意程序的要求 否则出错~',0dh,0ah)
        invoke SendDlgItemMessage,hWnd,IDC_EDT6,EM_REPLACESEL,0,offset szSend
        
        invoke WSAStartup,0202h,offset stWSA
        
        ;初始化地址列表
        assume esi:ptr _stPROXY
        lea esi,stProxy
        mov [esi]._dwIP,0
        assume esi:NOTHING
        
        .if IsAuto == TRUE
            invoke SetTimer,hWnd,ID_TIMER,3000d,0
        .endif
        
    .elseif uMsg==WM_COMMAND
        mov eax,wParam
        and eax,0ffffh
        .if eax==IDOK
            invoke SendMessage,hWnd,WM_COMMAND,IDC_BTN1,0
        .elseif eax==IDCANCEL
            invoke SendMessage,hWnd,WM_CLOSE,0,0    ;按ESC退出
        .elseif    eax==IDC_CHK1
                invoke IsDlgButtonChecked,hWnd,IDC_CHK1    ;看是否直接发送
                .if eax == BST_CHECKED
                    ;直接发送
                    invoke GetDlgItem,hWnd,IDC_EDT4
                    invoke EnableWindow,eax,TRUE
                    invoke GetDlgItem,hWnd,IDC_EDT7
                    invoke EnableWindow,eax,TRUE
                    assume esi:ptr _stPROXY
                    lea esi,stProxy
                    invoke GetDlgItemText,hWnd,IDC_EDT4,addr @szBuf,sizeof @szBuf
                    .if eax
                        invoke inet_addr,addr @szBuf
                        mov [esi]._dwIP,eax
                        invoke GetDlgItemInt,hWnd,IDC_EDT7,FALSE,FALSE
                        invoke htons,eax
                        mov [esi]._dwPort,eax
                        add esi,sizeof _stPROXY
                        mov [esi]._dwIP,0
                    .else
                        mov [esi]._dwIP,0
                    .endif
                    assume esi:NOTHING
                .else
                    ;使用代理列表
                    invoke GetDlgItem,hWnd,IDC_EDT4
                    invoke EnableWindow,eax,FALSE
                    invoke GetDlgItem,hWnd,IDC_EDT7
                    invoke EnableWindow,eax,FALSE
                    invoke SetDlgItemText,hWnd,IDC_EDT5,0    ;清空
                    ;用了C函数
                    invoke fopen,CTXT('PROXY.txt'),CTXT('r')
                    .if eax == INVALID_HANDLE_VALUE
                        invoke SendDlgItemMessage,hWnd,IDC_EDT3,EM_REPLACESEL,0,CTXT('fail to open PROXY.txt',0dh,0ah)
                        jmp @F
                    .endif
                    mov @hFile,eax
                    assume esi:ptr _stPROXY
                    lea esi,stProxy
                    .while TRUE
                        invoke fgets,addr @szBuf,sizeof @szBuf,@hFile
                        invoke lstrlen,eax
                        mov edi,eax
                        .break .if edi < 2    ;若按照要求的格式最后有一个空行 则最后一次此处得到的长度为1 是换行
                        dec edi
                        lea ecx,@szBuf
                        add ecx,edi
                        mov BYTE ptr [ecx],0    ;除去换行
                        invoke SendDlgItemMessage,hWin,IDC_EDT5,EM_REPLACESEL,0,addr @szBuf
                        invoke SendDlgItemMessage,hWin,IDC_EDT5,EM_REPLACESEL,0,CTXT(0dh,0ah)
                        ;找 : 之前为IP 之后为端口
                        xor eax,eax
                        mov al,':'
                        invoke strchr,addr @szBuf,eax
                        mov edi,eax
                        mov BYTE ptr [edi],0
                        invoke inet_addr,addr @szBuf
                        mov [esi]._dwIP,eax
                        inc edi
                        invoke atoi,edi
                        invoke htons,eax
                        mov [esi]._dwPort,eax
                        add esi,sizeof _stPROXY
                    .endw
                    
                    mov [esi]._dwIP,0
                @@:
                    invoke fclose,@hFile
                    assume esi:NOTHING
                .endif
        .elseif eax==IDC_BTN1
            ;发送
            invoke GetDlgItemText,hWnd,IDC_EDT6,offset szSendBuf,sizeof szSendBuf
            
            @@:
            invoke GetDlgItemInt,hWnd,IDC_EDT2,FALSE,FALSE
            .if eax
                mov dwTimeOut,eax
                invoke GetDlgItemInt,hWnd,IDC_EDT1,FALSE,FALSE
                .if eax
                    mov dwStop,0
                    mov edi,eax
                    xor ebx,ebx
                    .while ebx < edi
                        mov eax,ebx
                        imul dwTimeOut
                        ;这样把Sleep()放在线程函数开头比较好 避免界面没响应的现象
                        invoke CreateThread,0,0,offset _SendProc,eax,0,offset dwThreadID    ;启动线程
                        invoke CloseHandle,eax
                        inc ebx
                    .endw
                .endif
            .endif
            @@:
            assume esi:NOTHING
        .elseif eax==IDC_BTN2    ;取消
            mov dwStop,F_STOP        ;置标志位即可 线程会自动退出
        .elseif eax==IDC_BTN3
            invoke MessageBox,hWnd,offset szAbout,CTXT('关于'),0
        .elseif eax==IDC_BTN4
            invoke SendMessage,hWnd,WM_CLOSE,0,0
        .endif
    .elseif uMsg==WM_TIMER
        
        ;只执行一次 设置各参数 然后发送 不过没有一个办法让他停 这个就是方便新手 当然 也可以省点事啦~
        
        ;一定注意读取的格式
        invoke fopen,CTXT('AUTO.txt'),CTXT('r')
        .if eax == INVALID_HANDLE_VALUE
            invoke SendDlgItemMessage,hWnd,IDC_EDT3,EM_REPLACESEL,0,CTXT('fail to open AUTO.txt',0dh,0ah)
            invoke SendMessage,hWnd,WM_CLOSE,0,0    ;直接退出
        .endif
        mov @hFile,eax
        
        ;第一行 线程数
        invoke fgets,addr @szBuf,sizeof @szBuf,@hFile
        invoke SetDlgItemText,hWnd,IDC_EDT1,addr @szBuf
        
        ;第二行 发送间隔
        invoke fgets,addr @szBuf,sizeof @szBuf,@hFile
        invoke SetDlgItemText,hWnd,IDC_EDT2,addr @szBuf
        
        ;第三行开始 发送IP 这里不区分直接还是用代理 放什么就用什么发送
        
        invoke SetDlgItemText,hWnd,IDC_EDT5,0    ;清空
        
        assume esi:ptr _stPROXY
        lea esi,stProxy
        .while TRUE
            invoke fgets,addr @szBuf,sizeof @szBuf,@hFile
            invoke lstrlen,eax
            mov edi,eax
            .break .if edi < 2    ;若按照要求的格式最后有一个空行 则最后一次此处得到的长度为1 是换行
            dec edi
            lea ecx,@szBuf
            add ecx,edi
            mov BYTE ptr [ecx],0    ;除去换行
            invoke SendDlgItemMessage,hWin,IDC_EDT5,EM_REPLACESEL,0,addr @szBuf
            invoke SendDlgItemMessage,hWin,IDC_EDT5,EM_REPLACESEL,0,CTXT(0dh,0ah)
            ;找 : 之前为IP 之后为端口
            xor eax,eax
            mov al,':'
            invoke strchr,addr @szBuf,eax
            mov edi,eax
            mov BYTE ptr [edi],0
            invoke inet_addr,addr @szBuf
            mov [esi]._dwIP,eax
            inc edi
            invoke atoi,edi
            invoke htons,eax
            mov [esi]._dwPort,eax
            add esi,sizeof _stPROXY
        .endw
        
        mov [esi]._dwIP,0
        
        assume esi:NOTHING
        
        ;最后 内容 缓冲区足够大了
        
        invoke SetDlgItemText,hWnd,IDC_EDT6,0    ;清空
        
        .while TRUE
            invoke fgets,offset szSendBuf,sizeof szSendBuf,@hFile
            invoke lstrlen,eax
            mov edi,eax
            .break .if edi < 2    ;若按照要求的格式最后有一个空行 则最后一次此处得到的长度为1 是换行
            dec edi
            lea ecx,szSendBuf
            add ecx,edi
            mov BYTE ptr [ecx],0
            invoke SendDlgItemMessage,hWin,IDC_EDT6,EM_REPLACESEL,0,offset szSendBuf
            invoke SendDlgItemMessage,hWin,IDC_EDT6,EM_REPLACESEL,0,CTXT(0dh,0ah)
        .endw
        
        invoke SendDlgItemMessage,hWin,IDC_EDT6,EM_REPLACESEL,0,CTXT(0dh,0ah)
        invoke SendDlgItemMessage,hWin,IDC_EDT6,EM_REPLACESEL,0,CTXT(0dh,0ah)
        
        invoke SendMessage,hWnd,WM_COMMAND,IDC_BTN1,0    ;相当于点发送
        
        invoke KillTimer,hWnd,ID_TIMER
    .elseif uMsg==WM_HOTKEY
        .if wParam==ID_WINS
            invoke ShowWindow,hWnd,SW_SHOW
        .elseif wParam==ID_WINH
            invoke AnimateWindow,hWnd,1000,AW_BLEND or AW_HIDE        ;渐变退出
            invoke ShowWindow,hWnd,SW_HIDE
        .endif
    .elseif uMsg==WM_CLOSE
        invoke AnimateWindow,hWnd,1000,AW_BLEND or AW_HIDE            ;渐变退出
        ;取消热键
        invoke UnregisterHotKey,hWnd,ID_WINS
        invoke UnregisterHotKey,hWnd,ID_WINH
        invoke EndDialog,hWnd,wParam
        invoke WSACleanup
    .else
        mov eax,FALSE
        ret
    .endif
    mov eax,TRUE
    ret
DlgProc endp

END START


畅所欲言
2010-02-11 10:02
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用静夜思在2010-2-11 10:02:32的发言:

服务器是在国外,过了年再转回来

PS:试试代码着色

;MASMPlus 代码模板 - 以对话框做为主窗口的程序
 
;**************************************************************************************************** ...

怎么弄的~~  论坛有这个功能吗~
2010-02-11 13:21
静夜思
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:济南的冬天
等 级:管理员
威 望:11
帖 子:8913
专家分:2567
注 册:2004-3-25
收藏
得分:0 
回复 9楼 zklhp
刚加上的,发程序代码的时候自动着色

畅所欲言
2010-02-11 16:44
快速回复:2010年俺发的第一个程序——HTTPProxySend v0.4 (win32汇编)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.060706 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved