From 11affdd5f0e9ca33b832dd874cf4e1068d5c71bf Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Sun, 2 Aug 2015 18:13:55 +0200 Subject: [PATCH] DBG: resolved issue #355 (truncated strings in disassembly and with string search) --- x64_dbg_dbg/disasm_helper.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/x64_dbg_dbg/disasm_helper.cpp b/x64_dbg_dbg/disasm_helper.cpp index 7257f24c..c4b7f7c1 100644 --- a/x64_dbg_dbg/disasm_helper.cpp +++ b/x64_dbg_dbg/disasm_helper.cpp @@ -311,10 +311,11 @@ bool disasmgetstringat(uint addr, STRING_TYPE* type, char* ascii, char* unicode, if(type) *type = str_ascii; - int asciiLength = min(static_cast(strlen(asciiData)), maxlen); + // Escape the string + String escaped = StringUtils::Escape(asciiData); // Copy data back to outgoing parameter - strncpy_s(ascii, asciiLength, StringUtils::Escape(asciiData).c_str(), _TRUNCATE); + strncpy_s(ascii, min(int(escaped.length()) + 1, maxlen), escaped.c_str(), _TRUNCATE); return true; } @@ -324,17 +325,20 @@ bool disasmgetstringat(uint addr, STRING_TYPE* type, char* ascii, char* unicode, *type = str_unicode; // Determine string length only once, limited to output buffer size - int unicodeLength = min(static_cast(wcslen(unicodeData)), maxlen); + int unicodeLength = min(int(wcslen(unicodeData)), maxlen); // Truncate each wchar_t to char for(int i = 0; i < unicodeLength; i++) - asciiData[i] = (char)(unicodeData[i] & 0xFF); + asciiData[i] = char(unicodeData[i] & 0xFF); // Fix the null terminator (data len = maxlen + 1) asciiData[unicodeLength] = '\0'; + // Escape the string + String escaped = StringUtils::Escape(asciiData); + // Copy data back to outgoing parameter - strncpy_s(unicode, unicodeLength, StringUtils::Escape(asciiData).c_str(), _TRUNCATE); + strncpy_s(unicode, min(int(escaped.length()) +1, maxlen), escaped.c_str(), _TRUNCATE); return true; }