![]() |
#2
zklhp2011-08-06 22:30
本来想发贴吧给更多的人看 但根本发不出来 还是发这里罢 毕竟是自己的地盘。。
![]() ;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 |
;*****************************************************************************************************************
;作者: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工程文件
只有本站会员才能查看附件,请 登录
[ 本帖最后由 zklhp 于 2011-8-6 22:30 编辑 ]