- Add handleCreateData method to Java plugin to support creating new data - Add data type mapping to support common types like byte, word, dword, string - Implement delete_data functionality with graceful handling of missing data - Add proper error handling when conflicts are detected - Add comprehensive tests for both create_data and delete_data functionality
135 lines
4.8 KiB
Python
135 lines
4.8 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Test script to verify the create_data function works properly.
|
|
"""
|
|
import json
|
|
import logging
|
|
import sys
|
|
import requests
|
|
import time
|
|
|
|
# Setup logging
|
|
logging.basicConfig(level=logging.INFO)
|
|
logger = logging.getLogger("create_data_test")
|
|
|
|
def wait_for_program_loaded():
|
|
"""Wait for a Ghidra program to be loaded."""
|
|
for _ in range(10): # Try for ~20 seconds
|
|
try:
|
|
response = requests.get("http://localhost:8192/program")
|
|
if response.status_code == 200:
|
|
data = json.loads(response.text)
|
|
if data.get("success", False):
|
|
logger.info("Program loaded: " + data["result"]["name"])
|
|
return True
|
|
except Exception as e:
|
|
logger.warning(f"Error checking program status: {e}")
|
|
|
|
logger.info("Waiting for program to load...")
|
|
time.sleep(2)
|
|
|
|
logger.error("Timed out waiting for program to load")
|
|
return False
|
|
|
|
def test_create_data():
|
|
"""Test creating data at different addresses with different types."""
|
|
# First wait for a program to be loaded
|
|
if not wait_for_program_loaded():
|
|
logger.error("No program loaded, cannot test create_data")
|
|
return False
|
|
|
|
# First get the memory map to find addresses where we can create data
|
|
try:
|
|
response = requests.get("http://localhost:8192/memory")
|
|
memory_info = json.loads(response.text)
|
|
|
|
# Get valid addresses from an existing memory region
|
|
memory_blocks = memory_info.get("result", [])
|
|
|
|
# Find a valid memory block
|
|
valid_addresses = []
|
|
for block in memory_blocks:
|
|
if "start" in block and "name" in block:
|
|
# Get starting address of a RAM block
|
|
if "RAM" in block["name"].upper():
|
|
# Use the first 10 bytes of this RAM block
|
|
addr_base = int(block["start"], 16)
|
|
for i in range(10):
|
|
valid_addresses.append(f"{addr_base + i:08x}")
|
|
break
|
|
|
|
# If no RAM blocks, try any memory block
|
|
if not valid_addresses:
|
|
for block in memory_blocks:
|
|
if "start" in block:
|
|
# Use the first 10 bytes of this block
|
|
addr_base = int(block["start"], 16)
|
|
for i in range(10):
|
|
valid_addresses.append(f"{addr_base + i:08x}")
|
|
break
|
|
|
|
# Fallback to known addresses if still nothing
|
|
if not valid_addresses:
|
|
valid_addresses = ["08000100", "08000104", "08000108", "0800010c",
|
|
"08000110", "08000114", "08000118", "0800011c"]
|
|
|
|
logger.info(f"Will try using addresses: {valid_addresses[:3]}...")
|
|
addresses = valid_addresses
|
|
except Exception as e:
|
|
logger.error(f"Error getting memory map: {e}")
|
|
# Fallback to some addresses that might be valid
|
|
addresses = ["08000100", "08000104", "08000108", "0800010c",
|
|
"08000110", "08000114", "08000118", "0800011c"]
|
|
|
|
# Try data types
|
|
types_to_try = ["uint32_t", "int", "float", "byte", "char", "word", "dword", "string"]
|
|
|
|
success_count = 0
|
|
|
|
for i, data_type in enumerate(types_to_try):
|
|
address = addresses[i % len(addresses)]
|
|
logger.info(f"Testing data type: {data_type} at address {address}")
|
|
|
|
# First try direct HTTP API
|
|
url = f"http://localhost:8192/data"
|
|
payload = {
|
|
"address": address,
|
|
"type": data_type,
|
|
"newName": f"TEST_{data_type.upper()}"
|
|
}
|
|
|
|
# Add size for string types
|
|
if data_type.lower() == "string":
|
|
payload["size"] = 16
|
|
|
|
try:
|
|
response = requests.post(url, json=payload)
|
|
logger.info(f"HTTP API - Status: {response.status_code}")
|
|
logger.info(f"HTTP API - Response: {response.text}")
|
|
if response.status_code == 200 and json.loads(response.text).get("success", False):
|
|
success_count += 1
|
|
logger.info(f"HTTP API - Success with data type {data_type}")
|
|
else:
|
|
logger.warning(f"HTTP API - Failed with data type {data_type}")
|
|
except Exception as e:
|
|
logger.error(f"HTTP API - Error: {e}")
|
|
|
|
# Short delay between tests
|
|
time.sleep(0.5)
|
|
|
|
return success_count > 0
|
|
|
|
def main():
|
|
try:
|
|
result = test_create_data()
|
|
if result:
|
|
logger.info("Test successful!")
|
|
else:
|
|
logger.error("All test data types failed")
|
|
sys.exit(1)
|
|
except Exception as e:
|
|
logger.error(f"Unexpected error: {e}")
|
|
sys.exit(1)
|
|
|
|
if __name__ == "__main__":
|
|
main() |