2016-05-05 11 views
2

コマンドラインでファイルパスを引数として受け取り、そのコピーを作成するCでプログラムを作成しようとしています。これが私の情報源です。Cでコピーされたファイルが動作しない

#include <stdio.h> 
#include <stdlib.h> 


int main(int args, char* argv[]) 
{ 
    if (args != 2) 
    { 
      printf("Error: Wrong number of arguments.\n"); 
      printf("Enter the path of the file to be copied as the only argument.\n"); 
      system("PAUSE"); 
      return 1; 
    } 
    FILE *fsource; 
    FILE *fshellcode; 

    if((fsource = fopen(argv[1],"rb")) == NULL) 
    { 
      printf("Error: Could not open source file. Either the path is wrong or the file is corrupted.\n"); 
      system("PAUSE"); 
      return 2; 
    } 

    if((fshellcode = fopen("shellcode.exe","wb")) == NULL) 
    { 
      printf("Error: Could not create shellcode.exe file.\n"); 
      system("PAUSE"); 
      return 3; 
    } 

    char c; 
    while ((c = fgetc(fsource) != EOF)) 
    { 
     fputc(c,fshellcode); 
    } 
    fclose(fsource); 
    fclise(fshellcode; 
    return 0; 
} 

私はプログラムが正しくそれにソースexeファイルからのすべてのバイトshellcode.exeとコピーを作成し、引数として働いてexeファイルのパスを入力します。私は新しいexeファイルを実行しようとすると、私は次のエラーメッセージを取得考えた:どのように

The version of this file is not compatible with the version of Windows you're running. 

をソースexeファイルは私の64ビット版のWindows 7システム上で正常に動作しているときに可能ということでしょうか?

+2

'fclise(fshellcode;'は間違っています。 _true_コードを切り取り、貼り付けます。 – chux

+0

ファイルにはデータとは別の属性があります。おそらく、特定の権限も必要になるでしょう。 – chux

+0

'fgetc()'を使ってバイト単位でソースファイルを取得し、EOFをチェックすることは正しく動作しません。 fseek(fp、0、SEEK_SET)、fseek(fp、0、SEEK_END)次に、frees()、fwrite(fp、 )転送されたバイトの総数がbytesInFileに等しくなるまで。関数の戻り値を常にチェックしてエラーをキャッチしてください – user3629249

答えて

5

一つの問題は、あなたがどのようにそれが違いを作ることができる

int c; 

を宣言する必要があるということですか?さて、値0xffで読んだ最初のバイト(exeのようなバイナリファイルでかなりすぐに起こります)は-1に符号拡張され、EOFのように見えます。したがって、ファイル全体をコピーしていない可能性があります。

そして第二の問題は、あなたがなるように、コンパイラが

while (c = (fgetc(fsource) != EOF)) 

としてこれを解釈するよう!=の優先順位は、=より高い

while ((c = fgetc(fsource) != EOF)) 

に面白いタイプミスを持っているということですあなたがEOF以外の文字を読む限り、cは1に設定されます。

while ((c = (fgetc(fsource)) != EOF) 

(それでも差はありませんが、getcputcを使用する必要があります。これであなたはfgetcfputcを使用していた理由は?)

+0

shellcode.exeはsource.exeと同じサイズですが、意味は分かります。私はintとして宣言しましたが、私はまだ同じ問題を抱えています。私はいつもfgetcとfputcがファイルIOで使うのに適切な機能だと思っていました。 – exophrenik

+1

fgetcとfputcが好きです –

+0

@exophrenik 'fgetc()'と 'fputc()'はうまく使えます。 – chux

1
  • 使用ながら、((C =(はfgetc(FSOURCE))!= EOF)
  • は、まずそれがから値を取得しますがありましたファイルとEOFと比較し、それが変数(C)にコピーよりEOFされていない場合。

  • 読むOperator precedence in c

関連する問題