any2bat

  曾經看過一篇文章,說是任意一個小於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.exe c:\\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 cannot be    opened\n");
              }
if((fp2=fopen(argv[2],"wr+"))==NULL)
              {
                  printf("File cannot be    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.exe c:\\File.exe c:\\File.bat\n");

       getchar();

       return 0;

    }

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

    {

        printf("File cannot be    opened\n");

    }    

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

    {

        printf("File cannot be    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;

}

 

發佈了28 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章