mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-05-30 06:29:45 +08:00
GP-4198: Distribute Trace RMI clients (python).
ASIDE: Fix terminal buffer overflow.
This commit is contained in:
@@ -18,14 +18,17 @@
|
|||||||
@echo off
|
@echo off
|
||||||
|
|
||||||
if exist "%GHIDRA_HOME%\ghidra\.git\" (
|
if exist "%GHIDRA_HOME%\ghidra\.git\" (
|
||||||
set PYTHONPATH=%GHIDRA_HOME%\ghidra\Ghidra\Debug\Debugger-agent-dbgeng\build\pypkg\src;%GHIDRA_HOME%\ghidra\Ghidra\Debug\Debugger-rmi-trace\build\pypkg\src;%PYTHONPATH%
|
set PYTHONPATH=%GHIDRA_HOME%\ghidra\Ghidra\Debug\Debugger-agent-dbgeng\build\pypkg\src;%PYTHONPATH%
|
||||||
|
set PYTHONPATH=%GHIDRA_HOME%\ghidra\Ghidra\Debug\Debugger-rmi-trace\build\pypkg\src;%PYTHONPATH%
|
||||||
) else if exist "%GHIDRA_HOME%\.git\" (
|
) else if exist "%GHIDRA_HOME%\.git\" (
|
||||||
set PYTHONPATH=%GHIDRA_HOME%\Ghidra\Debug\Debugger-agent-dbgeng\build\pypkg\src;%GHIDRA_HOME%\Ghidra\Debug\Debugger-rmi-trace\build\pypkg\src;%PYTHONPATH%
|
set PYTHONPATH=%GHIDRA_HOME%\Ghidra\Debug\Debugger-agent-dbgeng\build\pypkg\src;%PYTHONPATH%
|
||||||
|
set PYTHONPATH=%GHIDRA_HOME%\Ghidra\Debug\Debugger-rmi-trace\build\pypkg\src;%PYTHONPATH%
|
||||||
) else (
|
) else (
|
||||||
set PYTHONPATH=%GHIDRA_HOME%\Ghidra\Debug\Debugger-agent-dbgeng\pypkg\src;%GHIDRA_HOME%\Ghidra\Debug\Debugger-rmi-trace\pypkg\src;%PYTHONPATH%
|
set PYTHONPATH=%GHIDRA_HOME%\Ghidra\Debug\Debugger-agent-dbgeng\pypkg\src;%PYTHONPATH%
|
||||||
|
set PYTHONPATH=%GHIDRA_HOME%\Ghidra\Debug\Debugger-rmi-trace\pypkg\src;%PYTHONPATH%
|
||||||
)
|
)
|
||||||
|
|
||||||
echo PYTHONPATH is %PYTHONPATH%
|
echo PYTHONPATH is %PYTHONPATH%
|
||||||
echo bat OPT_TARGET_IMG is [%OPT_TARGET_IMG%]
|
echo OPT_TARGET_IMG is [%OPT_TARGET_IMG%]
|
||||||
|
|
||||||
"%OPT_PYTHON_EXE%" -i ..\support\local-dbgeng.py
|
"%OPT_PYTHON_EXE%" -i ..\support\local-dbgeng.py
|
||||||
|
|||||||
@@ -33,12 +33,15 @@
|
|||||||
|
|
||||||
if [ -d ${GHIDRA_HOME}/ghidra/.git ]
|
if [ -d ${GHIDRA_HOME}/ghidra/.git ]
|
||||||
then
|
then
|
||||||
export PYTHONPATH=$GHIDRA_HOME/ghidra/Ghidra/Debug/Debugger-agent-gdb/build/pypkg/src:$GHIDRA_HOME/ghidra/Ghidra/Debug/Debugger-rmi-trace/build/pypkg/src:$PYTHONPATH
|
export PYTHONPATH=$GHIDRA_HOME/ghidra/Ghidra/Debug/Debugger-agent-gdb/build/pypkg/src:$PYTHONPATH
|
||||||
|
export PYTHONPATH=$GHIDRA_HOME/ghidra/Ghidra/Debug/Debugger-rmi-trace/build/pypkg/src:$PYTHONPATH
|
||||||
elif [ -d ${GHIDRA_HOME}/.git ]
|
elif [ -d ${GHIDRA_HOME}/.git ]
|
||||||
then
|
then
|
||||||
export PYTHONPATH=$GHIDRA_HOME/Ghidra/Debug/Debugger-agent-gdb/build/pypkg/src:$GHIDRA_HOME/Ghidra/Debug/Debugger-rmi-trace/build/pypkg/src:$PYTHONPATH
|
export PYTHONPATH=$GHIDRA_HOME/Ghidra/Debug/Debugger-agent-gdb/build/pypkg/src:$PYTHONPATH
|
||||||
|
export PYTHONPATH=$GHIDRA_HOME/Ghidra/Debug/Debugger-rmi-trace/build/pypkg/src:$PYTHONPATH
|
||||||
else
|
else
|
||||||
export PYTHONPATH=$GHIDRA_HOME/Ghidra/Debug/Debugger-agent-gdb/pypkg/src:$GHIDRA_HOME/Ghidra/Debug/Debugger-rmi-trace/build/pypkg/src:$PYTHONPATH
|
export PYTHONPATH=$GHIDRA_HOME/Ghidra/Debug/Debugger-agent-gdb/pypkg/src:$PYTHONPATH
|
||||||
|
export PYTHONPATH=$GHIDRA_HOME/Ghidra/Debug/Debugger-rmi-trace/pypkg/src:$PYTHONPATH
|
||||||
fi
|
fi
|
||||||
|
|
||||||
target_image="$1"
|
target_image="$1"
|
||||||
|
|||||||
+11
-6
@@ -86,8 +86,8 @@ public class ThreadedTerminal extends DefaultTerminal {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void pump() {
|
protected void pump() {
|
||||||
try {
|
while (!closed) {
|
||||||
while (!closed) {
|
try {
|
||||||
if (-1 == in.read(buffer) || closed) {
|
if (-1 == in.read(buffer) || closed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -98,10 +98,15 @@ public class ThreadedTerminal extends DefaultTerminal {
|
|||||||
}
|
}
|
||||||
buffer.clear();
|
buffer.clear();
|
||||||
}
|
}
|
||||||
}
|
catch (IOException e) {
|
||||||
catch (IOException e) {
|
Msg.error(this, "Console input closed unexpectedly: " + e);
|
||||||
Msg.error(this, "Console input closed unexpectedly: " + e);
|
closed = true;
|
||||||
closed = true;
|
return;
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
Msg.error(this, "Unexpected error processing terminal input", e);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,6 +43,49 @@ public class VtParser {
|
|||||||
this.handler = handler;
|
this.handler = handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static ByteBuffer copyDoubledCapacity(ByteBuffer oldBuf) {
|
||||||
|
ByteBuffer newBuf = ByteBuffer.allocate(oldBuf.capacity() * 2);
|
||||||
|
oldBuf.flip();
|
||||||
|
newBuf.put(oldBuf);
|
||||||
|
return newBuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Append a byte to {@link #csiParam}, resizing if necessary
|
||||||
|
*
|
||||||
|
* @param b the byte
|
||||||
|
*/
|
||||||
|
protected void putCsiParamByte(byte b) {
|
||||||
|
if (!csiParam.hasRemaining()) {
|
||||||
|
csiParam = copyDoubledCapacity(csiParam);
|
||||||
|
}
|
||||||
|
csiParam.put(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Append a byte to {@link #csiInter}, resizing if necessary
|
||||||
|
*
|
||||||
|
* @param b the byte
|
||||||
|
*/
|
||||||
|
protected void putCsiInterByte(byte b) {
|
||||||
|
if (!csiInter.hasRemaining()) {
|
||||||
|
csiInter = copyDoubledCapacity(csiInter);
|
||||||
|
}
|
||||||
|
csiInter.put(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Append a byte to {@link #oscParam}, resizing if necessary
|
||||||
|
*
|
||||||
|
* @param b the byte
|
||||||
|
*/
|
||||||
|
protected void putOscParamByte(byte b) {
|
||||||
|
if (!oscParam.hasRemaining()) {
|
||||||
|
oscParam = copyDoubledCapacity(oscParam);
|
||||||
|
}
|
||||||
|
oscParam.put(b);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a copy of the CSI buffers, reconstructed as they were in the original stream.
|
* Create a copy of the CSI buffers, reconstructed as they were in the original stream.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -226,11 +226,11 @@ public enum VtState {
|
|||||||
@Override
|
@Override
|
||||||
protected VtState handleNext(byte b, VtParser parser, VtHandler handler) {
|
protected VtState handleNext(byte b, VtParser parser, VtHandler handler) {
|
||||||
if (0x30 <= b && b <= 0x3f) {
|
if (0x30 <= b && b <= 0x3f) {
|
||||||
parser.csiParam.put(b);
|
parser.putCsiParamByte(b);
|
||||||
return CSI_PARAM;
|
return CSI_PARAM;
|
||||||
}
|
}
|
||||||
if (0x20 <= b && b <= 0x2f) {
|
if (0x20 <= b && b <= 0x2f) {
|
||||||
parser.csiInter.put(b);
|
parser.putCsiInterByte(b);
|
||||||
return CSI_INTER;
|
return CSI_INTER;
|
||||||
}
|
}
|
||||||
if (0x40 <= b && b <= 0x7e) {
|
if (0x40 <= b && b <= 0x7e) {
|
||||||
@@ -249,7 +249,7 @@ public enum VtState {
|
|||||||
@Override
|
@Override
|
||||||
protected VtState handleNext(byte b, VtParser parser, VtHandler handler) {
|
protected VtState handleNext(byte b, VtParser parser, VtHandler handler) {
|
||||||
if (0x20 <= b && b <= 0x2f) {
|
if (0x20 <= b && b <= 0x2f) {
|
||||||
parser.csiInter.put(b);
|
parser.putCsiInterByte(b);
|
||||||
return CSI_INTER;
|
return CSI_INTER;
|
||||||
}
|
}
|
||||||
if (0x40 <= b && b <= 0x7e) {
|
if (0x40 <= b && b <= 0x7e) {
|
||||||
@@ -269,7 +269,7 @@ public enum VtState {
|
|||||||
protected VtState handleNext(byte b, VtParser parser, VtHandler handler) {
|
protected VtState handleNext(byte b, VtParser parser, VtHandler handler) {
|
||||||
// For whatever reason, Windows includes the null terminator in titles
|
// For whatever reason, Windows includes the null terminator in titles
|
||||||
if (0x20 <= b && b <= 0x7f || b == 0) {
|
if (0x20 <= b && b <= 0x7f || b == 0) {
|
||||||
parser.oscParam.put(b);
|
parser.putOscParamByte(b);
|
||||||
return OSC_PARAM;
|
return OSC_PARAM;
|
||||||
}
|
}
|
||||||
if (b == 0x07) {
|
if (b == 0x07) {
|
||||||
|
|||||||
@@ -25,5 +25,19 @@ task buildPyPackage(type: Exec) {
|
|||||||
outputs.dir(dist)
|
outputs.dir(dist)
|
||||||
|
|
||||||
workingDir { "build/pypkg" }
|
workingDir { "build/pypkg" }
|
||||||
commandLine "python", "-m", "build"
|
commandLine "python3", "-m", "build"
|
||||||
|
}
|
||||||
|
|
||||||
|
// At the moment, any module with a python package also distributes it.
|
||||||
|
// We can separate this into `distributePythonPackage` later, if necessary.
|
||||||
|
|
||||||
|
rootProject.assembleDistribution {
|
||||||
|
def p = this.project
|
||||||
|
def zipPath = getZipPath(p)
|
||||||
|
from (p.assemblePyPackage) {
|
||||||
|
exclude '**/*.pyc'
|
||||||
|
exclude '**/*.pyo'
|
||||||
|
exclude '**/__pycache__/**'
|
||||||
|
into { zipPath + "/pypkg" }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user