Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 89 additions & 5 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,89 @@
/out/
/target
/.idea
/*.iml
dependency-reduced-pom.xml
# Compiled class files
*.class

# Package Files
*.jar
*.war
*.ear
*.zip
*.tar.gz
*.rar

# Log files
*.log
logs/
target/*.log

# Maven temporary files
# Generated by Maven
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
.mvn/wrapper/maven-wrapper.jar # Maven wrapper executable, often downloaded by users

# Eclipse IDE
.classpath
.project
.settings/
*.launch
.metadata
.lock

# IntelliJ IDEA
.idea/
*.iws
*.iml
*.ipr
*.burp
out/

# VS Code
.vscode/

# NetBeans IDE
nbproject/private/
build/
nbbuild/
dist/
nbdist/
.nb-gradle/
.nb-maven/

# OS generated files
.DS_Store # Mac
Thumbs.db # Windows
ehthumbs.db # Windows
Desktop.ini # Windows

# ReSharper files
_ReSharper*/
*.user
*.bak

# Temporary files (often hidden)
*~
#*#
.#*
%*
._*

# SCM Files (like Mercurial's .hg)
.hg/
.hgignore
.hgtags

# Gradle (if also used with Maven)
.gradle/
build/

# Github Copilot
.github/

# Apple DS_Store
.DS_Store
Empty file added BurpCrypto.ldb/testfile
Empty file.
8 changes: 4 additions & 4 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,11 @@
</plugins>
</build>
<dependencies>
<!-- https://mvnrepository.com/artifact/net.portswigger.burp.extender/burp-extender-api -->
<!-- Montoya API for Burp Suite -->
<dependency>
<groupId>net.portswigger.burp.extender</groupId>
<artifactId>burp-extender-api</artifactId>
<version>1.7.22</version>
<groupId>net.portswigger.burp.extensions</groupId>
<artifactId>montoya-api</artifactId>
<version>2025.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.iq80.leveldb/leveldb -->
<dependency>
Expand Down
148 changes: 94 additions & 54 deletions src/main/java/burp/BurpExtender.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import burp.sm3.SM3UIHandler;
import burp.sm4.SM4UIHandler;
import burp.utils.BurpCryptoMenuFactory;
import burp.utils.BurpStateListener;
import burp.utils.DictLogManager;
import burp.utils.Utils;
import burp.zuc.ZUCUIHandler;
Expand All @@ -21,86 +20,88 @@
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;

import static org.iq80.leveldb.impl.Iq80DBFactory.factory;
import burp.api.montoya.MontoyaApi;
import burp.api.montoya.BurpExtension;
import burp.api.montoya.core.Registration;
import burp.api.montoya.intruder.PayloadProcessor;

public class BurpExtender implements IBurpExtender, ITab {
import static org.iq80.leveldb.impl.Iq80DBFactory.factory;

public IExtensionHelpers helpers;
public IBurpExtenderCallbacks callbacks;
public class BurpExtender implements BurpExtension {
public MontoyaApi api;
public PrintWriter stdout;
public PrintWriter stderr;
public DB store;
public DictLogManager dict;
public String version = "0.1.9.1";
public HashMap<String, IIntruderPayloadProcessor> IPProcessors = new HashMap<>();

public HashMap<String, PayloadProcessor> IPProcessors = new HashMap<>();
public JTabbedPane mainPanel;

public JPanel aesPanel;
public AesUIHandler AesUI;


public JPanel rsaPanel;
public RsaUIHandler RsaUI;

public JPanel desPanel;
public DesUIHandler DesUI;

public JPanel execJsPanel;
public JsUIHandler JsUI;

public JPanel sm3Panel;
public SM3UIHandler SM3UI;

public JPanel sm4Panel;
public SM4UIHandler SM4UI;

public JPanel zucPanel;
public ZUCUIHandler ZUCUI;

public JPanel pbkdf2Panel;
public PBKDF2UIHandler PBKDF2UI;
public String ldbFolderName;

public boolean RegIPProcessor(String extName, IIntruderPayloadProcessor processor) {
if (IPProcessors.containsKey(extName)) {
JOptionPane.showMessageDialog(mainPanel, "This name already exist!");
return false;
}
callbacks.registerIntruderPayloadProcessor(processor);
IPProcessors.put(extName, processor);
return true;
}

public void RemoveIPProcessor(String extName) {
if (IPProcessors.containsKey(extName)) {
IIntruderPayloadProcessor processor = IPProcessors.get(extName);
callbacks.removeIntruderPayloadProcessor(processor);
IPProcessors.remove(extName);
}
}

// Montoya BurpExtension API required method
@Override
public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
public void initialize(MontoyaApi api) {
this.api = api;
SecureUtil.disableBouncyCastle();
this.callbacks = callbacks;
this.helpers = callbacks.getHelpers();
Utils.stdout = this.stdout = new PrintWriter(callbacks.getStdout(), true);
Utils.stderr = this.stderr = new PrintWriter(callbacks.getStderr(), true);
callbacks.setExtensionName("BurpCrypto v" + version);
callbacks.registerExtensionStateListener(new BurpStateListener(this));
callbacks.registerContextMenuFactory(new BurpCryptoMenuFactory(this));
Options options = new Options();
Utils.stdout = this.stdout = new PrintWriter(System.out, true);
Utils.stderr = this.stderr = new PrintWriter(System.err, true);
// 使用唯一 ldb 文件夹名
ldbFolderName = "BurpCrypto_" + System.currentTimeMillis() + ".ldb";
File ldbFile = new File(ldbFolderName);
// 初始化前如有 ldb 文件夹则递归删除
if (ldbFile.exists()) {
try {
java.nio.file.Files.walk(ldbFile.toPath())
.sorted((a, b) -> b.compareTo(a))
.forEach(p -> {
try { java.nio.file.Files.delete(p); } catch (IOException ignored) {}
});
if (stdout != null) stdout.println("[BurpCrypto] Old LevelDB folder deleted before init.");
} catch (IOException e) {
if (stdout != null) stdout.println("[BurpCrypto] Failed to delete old LevelDB folder before init: " + e.getMessage());
}
}
if (this.store != null) {
try {
this.store.close();
} catch (IOException e) {
api.logging().logToError("LevelDb close failed! error message: " + e.getMessage());
}
this.store = null;
}
api.extension().setName("BurpCrypto v" + version);
api.userInterface().registerContextMenuItemsProvider(new BurpCryptoMenuFactory(this));
org.iq80.leveldb.Options options = new org.iq80.leveldb.Options();
options.createIfMissing(true);
try {
this.store = factory.open(new File("BurpCrypto.ldb"), options);
this.store = org.iq80.leveldb.impl.Iq80DBFactory.factory.open(ldbFile, options);
this.dict = new DictLogManager(this);
callbacks.issueAlert("LevelDb init success!");
api.logging().logToOutput("LevelDb init success! Path: " + ldbFile.getAbsolutePath());
} catch (IOException e) {
callbacks.issueAlert("LevelDb init failed! error message: " + e.getMessage());
api.logging().logToError("LevelDb init failed! error message: " + e.getMessage());
}

stdout.println("BurpCrypto loaded successfully!\r\n");
stdout.println("Anthor: Whwlsfb");
stdout.println("Email: whwlsfb@wanghw.cn");
Expand Down Expand Up @@ -136,17 +137,56 @@ private void InitUi() {
bthis.mainPanel.addTab("PBKDF2", bthis.pbkdf2Panel);
bthis.execJsPanel = JsUI.getPanel();
bthis.mainPanel.addTab("Exec Js", bthis.execJsPanel);
bthis.callbacks.addSuiteTab(bthis);
api.userInterface().registerSuiteTab("BurpCrypto", bthis.mainPanel);
});
}

@Override
public String getTabCaption() {
return "BurpCrypto";
/**
* 注册 Intruder PayloadProcessor
*/
public void regIPProcessor(String name, PayloadProcessor processor) {
if (!IPProcessors.containsKey(name)) {
IPProcessors.put(name, processor);
api.intruder().registerPayloadProcessor(processor);
if (stdout != null) stdout.println("[BurpCrypto] 注册PayloadProcessor: " + name);
}
}

@Override
public Component getUiComponent() {
return this.mainPanel;
/**
* 移除 Intruder PayloadProcessor(仅移除本地引用,Burp API 无法主动注销)
*/
public void removeIPProcessor(String name) {
if (IPProcessors.containsKey(name)) {
IPProcessors.remove(name);
if (stdout != null) stdout.println("[BurpCrypto] 移除PayloadProcessor: " + name);
}
}

public void extensionUnloaded() {
try {
if (this.store != null) this.store.close();
} catch (IOException e) {
e.printStackTrace();
}
this.store = null;
System.gc();
try { Thread.sleep(1500); } catch (InterruptedException ignored) {}
// 卸载时删除本次唯一 ldb 文件夹
if (ldbFolderName != null) {
File ldbFile = new File(ldbFolderName);
if (ldbFile.exists()) {
try {
java.nio.file.Files.walk(ldbFile.toPath())
.sorted((a, b) -> b.compareTo(a))
.forEach(p -> {
try { java.nio.file.Files.delete(p); } catch (IOException ignored) {}
});
if (stdout != null) stdout.println("[BurpCrypto] LevelDB folder deleted on extension unload: " + ldbFolderName);
} catch (IOException e) {
if (stdout != null) stdout.println("[BurpCrypto] Failed to delete LevelDB folder on extension unload: " + e.getMessage());
}
}
}
if (stdout != null) stdout.println("[BurpCrypto] Extension unloaded, LevelDB closed.");
}
}
23 changes: 12 additions & 11 deletions src/main/java/burp/aes/AesIntruderPayloadProcessor.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package burp.aes;

import burp.BurpExtender;
import burp.IIntruderPayloadProcessor;
import burp.api.montoya.core.ByteArray;
import burp.api.montoya.intruder.PayloadData;
import burp.api.montoya.intruder.PayloadProcessingResult;
import burp.api.montoya.intruder.PayloadProcessor;

public class AesIntruderPayloadProcessor implements IIntruderPayloadProcessor {
public class AesIntruderPayloadProcessor implements PayloadProcessor {
private BurpExtender parent;
private final String extName;
private final AesUtil AesUtil;
Expand All @@ -16,21 +19,19 @@ public AesIntruderPayloadProcessor(final BurpExtender newParent, String extName,
}

@Override
public String getProcessorName() {
public String displayName() {
return "BurpCrypto - AES Encrypt - " + extName;
}

@Override
public byte[] processPayload(final byte[] currentPayload, final byte[] originalPayload, final byte[] baseValue) {
public PayloadProcessingResult processPayload(PayloadData data) {
try {
byte[] result = AesUtil.encrypt(currentPayload).getBytes("UTF-8");
parent.dict.Log(result, originalPayload);
return result;
byte[] result = AesUtil.encrypt(data.currentPayload().getBytes()).getBytes("UTF-8");
parent.dict.Log(result, data.originalPayload().getBytes());
return PayloadProcessingResult.usePayload(ByteArray.byteArray(result));
} catch (Exception e) {
this.parent.callbacks.issueAlert(e.toString());
this.parent.stderr.println();
e.printStackTrace(this.parent.stderr);
return null;
// 可选:parent.api.logging().logToError(e.toString());
return PayloadProcessingResult.skipPayload();
}
}
}
Loading