2012-04-11 17 views
15

Dọc theo dòng "băng này sẽ tự hủy trong năm giây. Chúc may mắn, Jim" ...tự huỷ đơn

Nó sẽ có thể cho một ứng dụng để xóa nó (hoặc đó là thực thi hình thức bao bọc) sau khi đã đạt được thời gian sử dụng hoặc điều kiện khác được đặt trước?

Ngoài ra, cách tiếp cận nào khác có thể được sử dụng để làm cho ứng dụng trở nên vô dụng?

Mục đích ở đây là để hết hạn bản beta, mời người dùng tải xuống phiên bản cập nhật hơn.

+2

chắc chắn điều đó là có thể. Giả sử rằng bạn đã triển khai ứng dụng của mình trong jar, bạn có thể lấy classpath thông qua các thuộc tính hệ thống, tìm jar và xóa nó (giả sử Java đang chạy với đủ đặc quyền) và hệ điều hành cho phép bạn xóa một jar khi đang sử dụng. – ControlAltDel

+1

Một cách khác để thực hiện việc này là lưu trữ ngày sử dụng ban đầu trong hệ thống tệp hoặc trong hệ thống đăng ký. – ControlAltDel

+1

Có một số câu hỏi về stackoverflow về cách tạo một bản demo/phiên bản thử nghiệm/đánh giá. – mbatchkarov

Trả lời

8

Có thể. Để có được xung quanh khóa trên tệp JAR, ứng dụng của bạn có thể cần phải sinh ra một quá trình nền chờ cho đến khi JVM đã thoát trước khi xóa nội dung.

Tuy nhiên, đây không phải là chống bom. Ai đó có thể cài đặt ứng dụng và sau đó làm cho các tệp và thư mục đã cài đặt chỉ đọc để ứng dụng của bạn không thể xóa chính nó. Người dùng (hoặc quản trị viên của họ) thông qua hệ thống kiểm soát truy cập của OS có thông báo cuối cùng về những tệp được tạo và xóa.

+0

Bạn nói đúng. Điều này cũng sẽ đánh bại bất kỳ sự ghi đè hay sửa đổi nào theo đề xuất của @PeterMmm. Làm thế nào về yêu cầu truy cập vào internet? Nó sẽ tách một số logic điều khiển. –

+0

Điều đó có thể bị đánh bại bằng cách vô hiệu hóa mã có liên quan trong ứng dụng. Obfuscation sẽ không ngăn chặn điều đó ... chỉ làm cho nó mất nhiều thời gian hơn. –

+4

Đưa một timebomb của bất kỳ loại vào ứng dụng của bạn là một bất lợi cho khách hàng tiềm năng trong tương lai của bạn. Hãy thuyết phục họ nâng cấp bằng cách cung cấp cho họ sản phẩm tốt hơn là làm tê liệt sản phẩm hiện tại của bạn. –

-1

nó là khá có thể tôi đoán. có thể bạn có thể xóa cái lọ như thế này và đảm bảo rằng ứng dụng biến mất khi bạn có quyền.

File jar = new File(".\\app.jar"); 
jar.deleteOnExit(); 
System.exit(0); 

cũng sử dụng cái gì đó như Nullsoft Scriptable Install System cho phép bạn viết trình cài đặt/trình gỡ cài đặt của riêng bạn sẽ giúp ích.

+1

Bổ sung bạn có thể ghi đè lên tập tin với dữ liệu ngẫu nhiên để được shure nó sẽ không phục hồi. – PeterMmm

+0

Chỉ cần thử nó, dường như không hoạt động. – Reg

+0

@PeterMmm Đó là một khả năng tôi đã cân nhắc. Cảm ơn bạn đã ghi nhớ lại. –

5

Nếu bạn kiểm soát nơi thử nghiệm tải về ứng dụng của bạn, bạn có thể sử dụng một hệ thống tự động xây dựng (ví dụ Jenkins) mà bạn có thể tạo ra một phiên bản beta mới mỗi đêm mà có một thời hạn sử dụng mã hóa cứng:

private static final Date EXPIRY_DATE = <90 days in the future from build date>; 

ngày trên được tự động chèn vào bởi quá trình xây dựng

if (EXPIRY_DATE.before(new Date()) { 
    System.out.println("Get a new beta version, please"); 
    System.exit(1); 
} 

Mix rằng với signed and sealed jars, đặt chướng ngại vật theo cách của decompiling bytecode và cung cấp một thực hiện thay thế mà không bao gồm t mã mũ, bạn có thể phát hành bản beta mã thời gian hết hạn.

Hệ thống xây dựng tự động có thể được định cấu hình để tự động tải lên phiên bản beta lên máy chủ lưu trữ phiên bản tải xuống.

+1

Cảm ơn bạn đã đề cập đến Jenkins. Bạn có biết nếu điều này được làm việc xung quanh bằng cách thay đổi ngày hệ thống? –

+1

Nó có thể là có, nhưng không có biện pháp an ninh là hoàn toàn chống nứt. Ví dụ: nếu bạn kiểm tra thời gian đối với dịch vụ web, điều đó có thể bị phá vỡ bằng cách chặn cuộc gọi dịch vụ, v.v. và tôi nghĩ rằng các bánh quy được xác định sẽ nhận được bất kỳ thứ gì. Tuy nhiên, tôi không nghĩ rằng một người dùng bình thường muốn thay đổi thời gian của hệ thống vì nó có thể ảnh hưởng đến các công cụ khác (ví dụ: lịch). – beny23

+1

Không cần phải là một cracker ở đây, chỉ cần thay đổi thời gian hệ thống. – atamanroman

0

Kể từ khi Windows khóa JAR tập tin trong khi nó đang chạy, bạn không thể xóa nó từ mã Java của riêng bạn do đó bạn cần một tập tin Batch:

private static void selfDestructWindowsJARFile() throws Exception 
{ 
    String resourceName = "self-destruct.bat"; 
    File scriptFile = File.createTempFile(FilenameUtils.getBaseName(resourceName), "." + FilenameUtils.getExtension(resourceName)); 

    try (FileWriter fileWriter = new FileWriter(scriptFile); 
     PrintWriter printWriter = new PrintWriter(fileWriter)) 
    { 
     printWriter.println("taskkill /F /IM \"java.exe\""); 
     printWriter.println("DEL /F \"" + ProgramDirectoryUtilities.getCurrentJARFilePath() + "\""); 
     printWriter.println("start /b \"\" cmd /c del \"%~f0\"&exit /b"); 
    } 

    Desktop.getDesktop().open(scriptFile); 
} 

public static void selfDestructJARFile() throws Exception 
{ 
    if (SystemUtils.IS_OS_WINDOWS) 
    { 
     selfDestructWindowsJARFile(); 
    } else 
    { 
     // Unix does not lock the JAR file so we can just delete it 
     File directoryFilePath = ProgramDirectoryUtilities.getCurrentJARFilePath(); 
     Files.delete(directoryFilePath.toPath()); 
    } 

    System.exit(0); 
} 

ProgramDirectoryUtilities lớp:

public class ProgramDirectoryUtilities 
{ 
    private static String getJarName() 
    { 
     return new File(ProgramDirectoryUtilities.class.getProtectionDomain() 
       .getCodeSource() 
       .getLocation() 
       .getPath()) 
       .getName(); 
    } 

    public static boolean isRunningFromJAR() 
    { 
     String jarName = getJarName(); 
     return jarName.contains(".jar"); 
    } 

    public static String getProgramDirectory() 
    { 
     if (isRunningFromJAR()) 
     { 
      return getCurrentJARDirectory(); 
     } else 
     { 
      return getCurrentProjectDirectory(); 
     } 
    } 

    private static String getCurrentProjectDirectory() 
    { 
     return new File("").getAbsolutePath(); 
    } 

    public static String getCurrentJARDirectory() 
    { 
     try 
     { 
      return getCurrentJARFilePath().getParent(); 
     } catch (URISyntaxException exception) 
     { 
      exception.printStackTrace(); 
     } 

     throw new IllegalStateException("Unexpected null JAR path"); 
    } 

    public static File getCurrentJARFilePath() throws URISyntaxException 
    { 
     return new File(ProgramDirectoryUtilities.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()); 
    } 
} 

Solution cảm hứng theo số this câu hỏi.


Đây là một phương pháp tốt hơn cho Windows:

private static void selfDestructWindowsJARFile() throws Exception 
{ 
    String currentJARFilePath = ProgramDirectoryUtilities.getCurrentJARFilePath().toString(); 
    Runtime runtime = Runtime.getRuntime(); 
    runtime.exec("cmd /c ping localhost -n 2 > nul && del \"" + currentJARFilePath + "\""); 
} 

Here là câu trả lời ban đầu.

Các vấn đề liên quan