any2bat

来源:互联网 发布:淘宝上的精油是真的吗 编辑:程序博客网 时间:2024/05/17 00:52

 曾经看过一篇文章,说是任意一个小于64K的文件都能转化成一个bat文件,并且能够正常运行。好奇之下,决定一探究竟。在看了一些汇编和debug相关知识后终于弄明白是怎么回事。代码如下:

  一下代码在Microsoft Visual C++ 6.0中调试成功

#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <string.h>
void main(int argc,char *argv[])
  char *p;
 int ch,i=0,n=256,z=0;
 double j;
 
 FILE *fp1,*fp2;
 if(argc<3)
 
  printf("此程序为命令行程序\n");
  printf("请输入正确的参数,如在cmd下输入:\n");
  printf("any2bat.exe c:\\File.exec:\\File.bat\n");
  getch();
  return;}
 p=argv[1]+strlen(argv[1])-1;
 while(*p!='\\')
 {p--;
 if(p==argv[1])
  {p=(argv[1]-1);
   break;}
 }

if((fp1=fopen(argv[1],"rb+"))==NULL)
             {
                 printf("File cannotbe   opened\n");
             }
if((fp2=fopen(argv[2],"wr+"))==NULL)
             {
                 printf("File cannotbe   opened\n");
             }
 
fprintf(fp2, "%s\n", "goto play");
while((ch=fgetc(fp1))!=EOF)
 
 {if (i==0)
  {fputc('\n',fp2);
  fputc('e',fp2);
  fputc(' ',fp2);
  fprintf(fp2, "%x", n);
  n=n+16;
 }

 fputc(' ',fp2); 
 if (int(j=(log(ch)/log(16)))==0)
  fputc('0',fp2);
 fprintf(fp2, "%x", ch);
 i++;
 z++;
 }
fputc('\n',fp2);
fputc('n',fp2);
fprintf(fp2, "%s\n", "abc");
fprintf(fp2, "%s\n", "rcx");
fprintf(fp2, "%x\n", z);
fprintf(fp2, "%s\n", "w");
fprintf(fp2, "%s\n", "q");

fprintf(fp2, "%s\n", ":play");
fprintf(fp2, "%s\n","debug<%0>nul");
fprintf(fp2, "%s", "ren abc ");
fprintf(fp2, "%s", ++p);
fclose(fp1);
fclose(fp2);

}

 

 简化版:

#include<iostream>


int main (int argc, const char * argv[])

 


    int ch,i=0;   

    FILE *fp1,*fp2;

    if(argc<3)

   

      printf("此程序为命令行程序\n");

      printf("请输入正确的参数,如在cmd下输入:\n");

      printf("any2bat.exec:\\File.exe c:\\File.bat\n");

       getchar();

       return 0;

    }

    if((fp1=fopen(argv[1],"rb+"))==NULL)

    {

      printf("File cannotbe    opened\n");

     

    if((fp2=fopen(argv[2],"wr+"))==NULL)

    {

      printf("File cannotbe    opened\n");

    }

   

    while((ch=fgetc(fp1))!=EOF     

     

       if (i== 0) {

          fputc('\n', fp2);

       }

       fputc('0', fp2);

       fputc('x', fp2);

       if(ch <16) {

          fputc('0', fp2);

       }

       fprintf(fp2, "%x", ch);

       fputc(',', fp2);

       i++;

       fputc('',fp2); 

       i = i %16;

    }

   

    fclose(fp1);

    fclose(fp2);

    return 0;

}

 

0 0
原创粉丝点击