| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7466 人关注过本帖, 1 人收藏
标题:"世界编程大赛第一"已死——小程序让你做出debug形式的程序(修改重发版) ...
只看楼主 加入收藏
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
结帖率:100%
收藏(1)
 问题点数:0 回复次数:9 
"世界编程大赛第一"已死——小程序让你做出debug形式的程序(修改重发版)
"世界编程大赛第一"已死——小程序让你做出debug形式的程序(修改重发版)

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

以下内容与原帖(https://bbs.bccn.net/thread-332487-1-1.html)类似

楔子

很久很久以前 可能有一个"世界编程大赛" 比赛中有一个程序得了一等奖。。。

这个程序采用的是用debug运行程序的方式(不好描述 只能这么叫)

因为程序效果很好 噱头多 十多年来一直在互联网上不断转载 且被冠以【世界编程大赛第一】的称号

但我觉得 多年来 对这个程序的认识一直是有偏差 主要问题在程序的形式

由于程序作者的故弄玄虚(可以这么说) 作品以debug的e命令填充于内存中并执行 看起来就像是往电脑中输入机器码(当然 确实是往电脑中输入机器码。。)

于是 有些不懂装懂的跟风者就说 啊 这是牛人的程序 世界第一 是手写机器码得到的、、、

这个程序是不是手写机器码得出的不得而知 但是 很明确的一点是 不能根据这个程序呈现的形式臆断它是用手写机器码得出的

事实上 这种3D展示的比赛经常有 网络上也有很多64K 96K的精彩demo 但 貌似这些都不是用的手写机器码做的罢 有些就是用的C语言+Upx壳、、

近年来这种故弄玄虚的作品可谓层出不穷 有些程序直接借用了这个【世界编程大赛第一】的形式 做成debug运行的形式 误导广大群众 混淆视听以达致其不可告人的目的。。

于是 写了个小程序 目的 就是破这个世界编程大赛第一的神话 嘿嘿 你不是说是牛人的东西么 我让大家都能做出来 都能当世界第一

程序功能:将任意文件(大小有限制 太大的不会成功)转换成如下的形式并生成一个bat文件 运行即可还原被转换文件的原貌并打开该文件

图片附件: 游客没有浏览图片的权限,请 登录注册


已知问题:

太大的文件不会成功 这是受debug程序的限制

不甚可靠 一方面我写的程序的可靠性不强 另一方面是这种方法的可靠性也不咋的

Bat文件的排版不大好看 不如世界第一好。。

用处:炫耀。。 入@#¥@侵的时候可能也有用罢 也可以用来保密 因为文件被转化为一个Bat了

程序+源码+MasmPlus工程文件

Bin2Bat(v5版).zip (18.91 KB)


[ 本帖最后由 zklhp 于 2011-8-6 22:30 编辑 ]
搜索更多相关主题的帖子: 编程 版权 Email 
2011-08-06 22:27
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
本来想发贴吧给更多的人看 但根本发不出来 还是发这里罢 毕竟是自己的地盘。。

程序代码:

;MASMPlus 代码模板 - 以对话框做为主窗口的程序
;*****************************************************************************************************************
;作者:zklhp  
;Email:zklhp@
;QQ:493165744
;Last Update:2011.8.6
;版权所有    转载请保持完整
;*****************************************************************************************************************
.386
.Model Flat, StdCall
Option Casemap :None

Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc
Include shell32.inc

Includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
Includelib shell32.lib

include macro.asm
include rsrc.inc
    
    DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
    
.const
    DLG_MAIN equ 100
    
.data
    szAbout    db '故弄玄虚众的最爱',0dh,0ah,'Bat转换器 可将任意文件转换为Bat格式并打开',0dh,0ah
                db '用法:拖拽想要转换的文件到窗口 按Go就好了',0dh,0ah
                db '默认输出到本程序当前目录的output.bat中',0dh,0ah
                db '由于受限于debug 被转换的文件不能太大 太大的文件会有失败的提示',0dh,0ah
                db 'By zklhp  Email:zklhp@',0dh,0ah,'版权所有    转载请保持完整',0
    szStart1    db '@echo off & chcp 437>nul&graftabl 936>nul',0dh,0ah
                db 'more +2 "%~0"|debug >nul&ren ',0
    szStart2    db '&start ',0
    szStart3 db '&exit',0dh,0ah,0
    
    szEnd1    db 'r bx',0dh,0ah,0
    szEnd2    db 'r cx',0dh,0ah,0
    szEnd3    db 'n ',0
    szEnd4    db 'w',0dh,0ah,'q',0dh,0ah,0
    
.data?
    hInstance        dd ?
    szBuf                db 264 dup(?)
    
.CODE
START:
    invoke GetModuleHandle,NULL
    mov hInstance,eax
    invoke DialogBoxParam,hInstance,IDD_DLG1,0,offset DlgProc,0
    invoke ExitProcess,0

_ToBat proc uses esi edi ebx _lpPath
    local @hSrc:DWORD
    local @hDst:DWORD
    local @szBuf[8]:BYTE
    local @szFileName[32]:BYTE
    local @szName[32]:BYTE    ;文件名
    local @ReadBuf[20]:BYTE
    local @WriteBuf[64]:BYTE
    local @ReadNum:DWORD
    
    ;分离得到原始文件的文件名
    mov esi,_lpPath
    invoke lstrlen,esi
    mov ebx,eax
    dec eax
    add esi,eax    ;结尾
    xor edi,edi
    ;从后往前找第一个\
    .while edi < ebx
        mov al,BYTE ptr [esi]
        .break .if al == '\'
        dec esi
        inc edi
    .endw
    inc esi    ;指向文件名第一个字符
    invoke lstrcpy,addr @szFileName,esi
    
    invoke lstrcpy,addr @szName,addr @szFileName
    invoke lstrlen,addr @szName
    mov ebx,eax
    xor edi,edi
    lea esi,@szName
    ;从后往前找第一个.置为0
    .while edi < ebx
        mov al,BYTE ptr [esi]
        .break .if al == '.'
        inc esi
        inc edi
    .endw
    
    .if al == '.'
        xor eax,eax
        mov BYTE ptr [esi],al
    .endif
    invoke lstrcat,addr @szName,CTXT('.bin ')    ;在n里面带空格是可以的 省得上面ren要加空格。。
    
    mov ecx,_lpPath
    invoke CreateFile,ecx,GENERIC_ALL,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
    .if eax != INVALID_HANDLE_VALUE
        mov @hSrc,eax
    .endif
    invoke CreateFile,CTXT('output.bat'),GENERIC_ALL,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
    .if eax != INVALID_HANDLE_VALUE
        mov @hDst,eax
    .endif
    
    ;就是构造了这样一个头。。
    ;@echo off & chcp 437>nul&graftabl 936>nul
    ;more +2 "%~0"|debug >nul&ren Layer.bin Layer.exe&start Layer.exe&exit
    
    ;用的一个技巧是在堆栈中返回实际写入的长度 因为我们不关心这个值
    invoke lstrlen,offset szStart1
    push ecx
    mov edx,esp
    mov ecx,@hDst
    invoke WriteFile,ecx,offset szStart1,eax,edx,0
    pop ecx
    ;@echo off & chcp 437>nul&graftabl 936>nul
    ;more +2 "%~0"|debug >nul&ren 
    
    invoke lstrlen,addr @szName
    push ecx
    mov edx,esp
    mov ecx,@hDst
    invoke WriteFile,ecx,addr @szName,eax,edx,0
    pop ecx
    
    invoke lstrlen,addr @szFileName
    push ecx
    mov edx,esp
    mov ecx,@hDst
    invoke WriteFile,ecx,addr @szFileName,eax,edx,0
    pop ecx
    ;@echo off & chcp 437>nul&graftabl 936>nul
    ;more +2 "%~0"|debug >nul&ren Layer.bin Layer.exe
    
    invoke lstrlen,offset szStart2
    push ecx
    mov edx,esp
    mov ecx,@hDst
    invoke WriteFile,ecx,offset szStart2,eax,edx,0
    pop ecx
    ;@echo off & chcp 437>nul&graftabl 936>nul
    ;more +2 "%~0"|debug >nul&ren Layer.bin Layer.exe&start 
    
    invoke lstrlen,addr @szFileName
    push ecx
    mov edx,esp
    mov ecx,@hDst
    invoke WriteFile,ecx,addr @szFileName,eax,edx,0
    pop ecx
    
    invoke lstrlen,offset szStart3
    push ecx
    mov edx,esp
    mov ecx,@hDst
    invoke WriteFile,ecx,offset szStart3,eax,edx,0
    pop ecx
    ;到这里开头结束了
    
    ;重点在这里
    ;根据debug要求 要从100H开始 且在一个段内 也就是说 最大长度是0ffffH-100H
    mov ebx,0100H
    .while TRUE
        lea edx,@ReadNum
        mov ecx,@hSrc
        invoke ReadFile,ecx,addr @ReadBuf,16,edx,0
        invoke wsprintf,addr @WriteBuf,CTXT('e %04lx '),ebx
        xor esi,esi
        lea edi,@ReadBuf
        .while esi < 16
            xor eax,eax
            mov al,BYTE ptr[edi+esi]
            invoke wsprintf,addr @szBuf,CTXT('%02lx '),eax
            invoke lstrcat,addr @WriteBuf,addr @szBuf
            inc esi
        .endw
        invoke lstrcat,addr @WriteBuf,CTXT(0dh,0ah)
        invoke lstrlen,addr @WriteBuf
        mov ecx,@hDst
        push ecx
        mov edx,esp
        invoke WriteFile,ecx,addr @WriteBuf,eax,edx,0
        pop eax
        add ebx,16
        .if ebx>0fff0h
            invoke MessageBox,0,CTXT('已超过debug允许的最大长度 无法转换诶。。'),CTXT('失败。。。'),0
            mov ecx,@hSrc
            invoke CloseHandle,ecx
            
            mov ecx,@hDst
            invoke CloseHandle,ecx
            ret
        .endif
        mov ecx,@ReadNum
        .break .if ecx<16    ;完了
    .endw
    
    ;获取源文件大小
    mov ecx,@hSrc
    push ecx
    mov edx,esp
    invoke GetFileSize,ecx,edx
    pop ecx
    mov esi,eax    ;高16位
    mov edi,eax    ;低16位
    and esi,0FFFF0000H
    shr esi,16
    and edi,0FFFFH
    
    invoke lstrlen,offset szEnd1
    push ecx
    mov edx,esp
    mov ecx,@hDst
    invoke WriteFile,ecx,offset szEnd1,eax,edx,0
    pop ecx
    
    invoke wsprintf,addr @WriteBuf,CTXT('%lx',0dh,0ah),esi
    
    invoke lstrlen,addr @WriteBuf
    push ecx
    mov edx,esp
    mov ecx,@hDst
    invoke WriteFile,ecx,addr @WriteBuf,eax,edx,0
    pop ecx
    
    invoke lstrlen,offset szEnd2
    push ecx
    mov edx,esp
    mov ecx,@hDst
    invoke WriteFile,ecx,offset szEnd2,eax,edx,0
    pop ecx
    
    invoke wsprintf,addr @WriteBuf,CTXT('%lx',0dh,0ah),edi
    
    invoke lstrlen,addr @WriteBuf
    push ecx
    mov edx,esp
    mov ecx,@hDst
    invoke WriteFile,ecx,addr @WriteBuf,eax,edx,0
    pop ecx
    
    invoke lstrlen,offset szEnd3
    push ecx
    mov edx,esp
    mov ecx,@hDst
    invoke WriteFile,ecx,offset szEnd3,eax,edx,0
    pop ecx
    
    invoke lstrcat,addr @szName,CTXT(0dh,0ah)
    invoke lstrlen,addr @szName
    push ecx
    mov edx,esp
    mov ecx,@hDst
    invoke WriteFile,ecx,addr @szName,eax,edx,0
    pop ecx
    
    invoke lstrlen,offset szEnd4
    push ecx
    mov edx,esp
    mov ecx,@hDst
    invoke WriteFile,ecx,offset szEnd4,eax,edx,0
    pop ecx
    
    mov ecx,@hSrc
    invoke CloseHandle,ecx
    
    mov ecx,@hDst
    invoke CloseHandle,ecx
    
    ret
_ToBat endp

DlgProc proc hWnd,uMsg,wParam,lParam
    .if uMsg==WM_INITDIALOG
        invoke DragAcceptFiles,hWnd,TRUE    ;支持拖拽
    .elseif uMsg==WM_COMMAND
        mov eax,wParam
        and eax,0ffffh
        .if eax==IDC_BTN1
            invoke lstrlen,offset szBuf
            .if eax != 0
                invoke _ToBat,offset szBuf
            .endif
        .elseif eax==IDC_BTN2
            invoke MessageBox,hWnd,offset szAbout,CTXT('About'),0
        .endif
    .elseif uMsg==WM_DROPFILES
        invoke DragQueryFile,wParam,0,offset szBuf,sizeof szBuf
        invoke SetDlgItemText,hWnd,IDC_EDT1,offset szBuf
    .elseif uMsg==WM_CLOSE
        invoke EndDialog,hWnd,wParam
    .else
        mov eax,FALSE
        ret
    .endif
    mov eax,TRUE
    ret
DlgProc endp

END START

2011-08-06 22:30
kamuli
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2008-12-8
收藏
得分:0 
这种牛力级的东东,没敢挑战过,看大大的口气,
偶也来瞧瞧咋回事
2011-08-08 11:33
Alar30
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:10
帖 子:988
专家分:1627
注 册:2009-9-8
收藏
得分:0 
谢谢Z版了
确实这些年看到这类噱头看烦了
2011-08-08 22:08
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用kamuli在2011-8-8 11:33:42的发言:

这种牛力级的东东,没敢挑战过,看大大的口气,
偶也来瞧瞧咋回事

我BS的是故弄玄虚的人 而不是那个【世界编程大赛第一的程序】本身
2011-08-08 22:16
jptiancai
Rank: 2
等 级:论坛游民
帖 子:13
专家分:40
注 册:2011-8-4
收藏
得分:0 
是啊  世界第一是否是真? 我们不必细心考证
   重要的使我们要追求技术!!
2011-08-20 22:49
gaoyueh0ng
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-8-20
收藏
得分:0 
高手啊~~ 学习了~
2011-08-23 23:54
caimingbing
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-12-1
收藏
得分:0 
2楼那是什么意思,不懂啊。新手来着?
2011-08-24 12:34
coolbosyen
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-11-17
收藏
得分:0 
高手啊,没看见这篇文章还真不敢相信 去运行一下试试
2012-11-17 00:33
shenghuiys
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2016-7-11
收藏
得分:0 
666666
2016-07-11 13:10
快速回复:"世界编程大赛第一"已死——小程序让你做出debug形式的程序(修改重发版 ...
数据加载中...
 
   



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

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