From 81651e1efff7deb137884bce6064eb6eac653d86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leon=20Wei=C3=9F?= <leon.weiss@rub.de> Date: Fri, 25 Aug 2023 09:13:30 +0200 Subject: [PATCH] Search for (almost) all variants of the register (except ah, bh, ...) --- irdb-libs/ir_builders/fill_in_indtargs.cpp | 34 ++++++++++++++-------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/irdb-libs/ir_builders/fill_in_indtargs.cpp b/irdb-libs/ir_builders/fill_in_indtargs.cpp index 508de9de9..31f272e16 100644 --- a/irdb-libs/ir_builders/fill_in_indtargs.cpp +++ b/irdb-libs/ir_builders/fill_in_indtargs.cpp @@ -2502,11 +2502,14 @@ V2: return; index_reg_no = d6->getOperand(1)->getIndexRegister(); const auto index_reg_64bit = regNoToX8664Reg(index_reg_no); - const auto index_reg_32bit = regNoToX8632Reg(index_reg_no); + const auto index_reg_32bit = regNoToX8632Reg(index_reg_no); + const auto index_reg_16bit = regNoToX8616Reg(index_reg_no); + const auto index_reg_8bit = regNoToX868Reg(index_reg_no); - cmp_str = "cmp " + index_reg_32bit + "|cmp " + index_reg_64bit; - bound_stopif = "^" + index_reg_32bit + "$|^" + index_reg_64bit + "$"; - and_str = "and " + index_reg_32bit + "|and " + index_reg_64bit; + + cmp_str = "cmp (" + index_reg_8bit + "|" + index_reg_16bit + "|" + index_reg_32bit + "|" + index_reg_64bit + ")"; + bound_stopif = "^(" + index_reg_8bit + "|" + index_reg_16bit + "|" + index_reg_32bit + "|" + index_reg_64bit + ")$"; + and_str = "and (" + index_reg_8bit + "|" + index_reg_16bit + "|" + index_reg_32bit + "|" + index_reg_64bit + ")"; lea_string1 += base_reg; if (d6->getOperand(1)->getScaleValue() == 1) lea_string2 = "lea " + index_reg_64bit; @@ -2808,6 +2811,8 @@ V2: const auto index_reg_32bit = regNoToX8632Reg(index_reg_no); const auto temp_index_reg_64bit = regNoToX8664Reg(decoded_instr->getOperand(1)->getRegNumber()); const auto temp_index_reg_32bit = regNoToX8632Reg(decoded_instr->getOperand(1)->getRegNumber()); + const auto temp_index_reg_16bit = regNoToX8616Reg(decoded_instr->getOperand(1)->getRegNumber()); + const auto temp_index_reg_8bit = regNoToX868Reg(decoded_instr->getOperand(1)->getRegNumber()); if(index_reg_32bit.empty() || index_reg_64bit.empty()){ cout << "WARNING: Could not detect index register for table load at " << hex << table_load_instruction->getAddress()->getVirtualOffset() << endl; @@ -2815,19 +2820,24 @@ V2: cout << "WARNING: Could not detect new temporary index register for move into index reg at " << hex << intermediate_write_instr->getAddress()->getVirtualOffset() << endl; } else { + auto to_replace = "\\([^()]*" + index_reg_32bit + "\\|" + index_reg_64bit + "\\)"; + auto to_replace_regex = std::regex(to_replace); + auto replace_with = "(" + temp_index_reg_8bit + "|" + temp_index_reg_16bit + "|" + temp_index_reg_32bit + "|" + temp_index_reg_64bit + ")"; if (getenv("IB_VERBOSE") || getenv("DEBUG")) { - cout << "DEBUG: replacing index reg " << index_reg_64bit << "/" << index_reg_32bit << " with " - << temp_index_reg_64bit << "/" << temp_index_reg_32bit << " because of instruction '" + cout << "DEBUG: replacing index reg " << to_replace << " with " << replace_with << " because of instruction '" << intermediate_write_instr->getDisassembly() << "' @ 0x" << hex << intermediate_write_instr->getAddress()->getVirtualOffset() << endl; } - cmp_str = std::regex_replace(cmp_str, std::regex(index_reg_64bit), temp_index_reg_64bit); - cmp_str = std::regex_replace(cmp_str, std::regex(index_reg_32bit), temp_index_reg_32bit); - bound_stopif = std::regex_replace(bound_stopif, std::regex(index_reg_64bit), temp_index_reg_64bit); - bound_stopif = std::regex_replace(bound_stopif, std::regex(index_reg_32bit), temp_index_reg_32bit); - and_str = std::regex_replace(and_str, std::regex(index_reg_64bit), temp_index_reg_64bit); - and_str = std::regex_replace(and_str, std::regex(index_reg_32bit), temp_index_reg_32bit); + + cmp_str = std::regex_replace(cmp_str, to_replace_regex, replace_with); + bound_stopif = std::regex_replace(bound_stopif, to_replace_regex, replace_with); + and_str = std::regex_replace(and_str, to_replace_regex, replace_with); + + if (getenv("IB_VERBOSE") || getenv("DEBUG")) { + cout << "After replacement:" << endl << cmp_str << endl << bound_stopif << endl << and_str + << endl; + } } } else { if (getenv("IB_VERBOSE") || getenv("DEBUG")) { -- GitLab