Q&A

  • 실행중인 파일 덮어쓰기? (꼭 부탁)
실행중인 파일을 덥어쓰는 방법이 있습니까?



2  COMMENTS
  • Profile
    남충희 2001.03.20 06:06
    팁모아에서 본건데요 수정, 삭제가 가능하다고 하네요...

    제가 테스트 해보진 않았지만 될 것 같아요...



    program SelfModifier; (* Looks for a const and alters it *)

    (* Puts paramstr(1) into Name *)



    const

    Name : string = 'Fix me up'; {get 256 bytes to play with}

    type

    Buffer = array[0..$3fff] of byte;

    var

    ExeFile : file;

    P : ^Buffer;

    N,I,O : word;

    NStr : string;



    begin

    begin

    new(P); {get mem for our buffer}

    assign(ExeFile,paramstr(0)); {get myself}

    reset(ExeFile,1);

    blockread(ExeFile,P^,sizeof(Buffer),N);

    close(ExeFile); {got it into Buf, now close it}

    O:=(dseg-cseg+word(P^[8])) shl 4; {start of data seg in exe file}

    writeln('Name: ',Name);

    NStr := paramstr(1); {new string to put in Name}

    inc(O,ofs(Name)); {where Name is located}

    move(NStr[0],P^[O],length(NStr)+1); {move string incl. length byte}

    rewrite(ExeFile,1); {create new version}

    blockwrite(ExeFile,P^,N); {write it}

    close(ExeFile); {close it...}

    dispose(P) {...and release mem}

    end

    end.





    procedure DeleteMe;

    var

    BatchFile: TextFile;

    BatchFileName: string;

    ProcessInfo: TProcessInformation;

    StartUpInfo: TStartupInfo;

    begin

    { create a batchfile in the applications directory }

    BatchFileName := ExtractFilePath(ParamStr(0)) + '$$336699.bat';



    { open and write the file }

    AssignFile(BatchFile, BatchFileName);

    Rewrite(BatchFile);



    Writeln(BatchFile, ':try');

    Writeln(BatchFile, 'del "' + ParamStr(0) + '"');

    Writeln(BatchFile,

    'if exist "' + ParamStr(0) + '"' + ' goto try');

    Writeln(BatchFile, 'del "' + BatchFileName + '"');

    CloseFile(BatchFile);



    FillChar(StartUpInfo, SizeOf(StartUpInfo), $00);

    StartUpInfo.dwFlags := STARTF_USESHOWWINDOW;

    StartUpInfo.wShowWindow := SW_HIDE;



    if CreateProcess(nil, PChar(BatchFileName), nil, nil,

    False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo,

    ProcessInfo) then

    begin

    CloseHandle(ProcessInfo.hThread);

    CloseHandle(ProcessInfo.hProcess);

    end;

    end;







    델사랑 wrote:

    > 실행중인 파일을 덥어쓰는 방법이 있습니까?

    >

  • Profile
    서성호 2001.03.17 18:14
    델사랑 wrote:

    > 실행중인 파일을 덥어쓰는 방법이 있습니까?

    >



    윈도우즈 시스템은 공유된 파일이 많습니다.

    즉, 하나의 프로그램 혹은 Dll등을 같이 사용하는 것이죠...



    컴 시스템 내에 해당 프로그램이 사용중이면 사용중인 수 만큼 카운터를 갖고 있어서 그 값이 0일때 삭제등이 가능하죠...



    제 생각엔 되지 않을 거라고 생각되네요...



    아니면 어셈으로 시스템을 건드리거나.... 근데 어셈으로 될까요?쩝.