const Codes FullChecker::ChkCoding(const unsigned char *input_string,unsigned int length){ unsigned char *pin = (unsigned char *)input_string; unsigned int codings[5] = {0,0,0,0,0}; for(unsigned int cc = 0;cc<length;cc++){ if((*pin == 0x00) || (*pin == 0xFF)){ //Unicodeのみに現れるコード codings[_UNIC]++; codings[_EUC] -= 100; codings[_SJIS] -= 100; codings[_JIS] -= 100; codings[_UTF8] -= 100; } if((*pin <= 0x7F) && ((0x80 <= *(pin+1)) && (*(pin+1) <= 0xBF))) //単独のUnicode trailerバイトは減点対象 codings[_UTF8] -= 100; if((0xC0 <= *pin) && (*pin <= 0xDF)){ //UTF8の2バイトコード if((0x80 <= *(pin+1)) && (*(pin+1) <= 0xBF)) codings[_UTF8] += 1; else codings[_UTF8] -= 100; } if((0xC0 <= *pin) && (*pin <= 0xDF)){ //UTF8の3バイトコード if(((0x80 <= *(pin+1)) && (*(pin+1) <= 0xBF)) && ((0x80 <= *(pin+2)) && (*(pin+2) <= 0xBF))) codings[_UTF8] += 1; else codings[_UTF8] -= 100; } if((0x80 <= *pin) && (*pin <= 0xFF)) //JISには現れないコードは減点 codings[_JIS] -= 100; if(isAscii(*pin)) if(isJisInOut(pin)) codings[_JIS]++; if((*pin == 0x8E) && isHankana(*(pin+1))) codings[_EUC]++; if((0x81 <= *pin) && (*pin <= 0x9F)) codings[_SJIS]++; if(isHankana(*pin)){ pin++; if((0x80 <= *pin) && (*pin <= 0x9F)) codings[_SJIS]++; if((0xF0 <= *pin) && (*pin <= 0xFE)) codings[_EUC]++; } if((0xFD <= *pin) && (*pin <= 0xFE)) codings[_EUC]++; pin++; } if(codings[_UNIC] > 0) return(_UNIC); if(codings[_UTF8] > 0) return(_UTF8); Codes max=Codes(0); for(int c=0;c<3;c++){ if(codings[c] >= codings[max]) max=Codes(c); } return(max); }
int _load_defaults(void){ PyObject *DefModule,*DefDict; // PyObject *defin,*defout; DefModule = PyImport_ImportModule("defaults"); DefDict = PyModule_GetDict(DefModule); _DEFAULT_INPUT_CODING = Codes(PyInt_AsLong(PyDict_GetItemString(DefDict,"DEFAULT_INPUT_CODING"))); _DEFAULT_OUTPUT_CODING = Codes(PyInt_AsLong(PyDict_GetItemString(DefDict,"DEFAULT_OUTPUT_CODING"))); _DEFAULT_BREAKLINE_CODE = Blcs(PyInt_AsLong(PyDict_GetItemString(DefDict,"DEFALUT_BREAKLINE_CODE"))); _DEFAULT_CHECK_MODE = ChkMode(PyInt_AsLong(PyDict_GetItemString(DefDict,"DEFAULT_CHECK_MODE"))); Py_XDECREF(DefDict); Py_XDECREF(DefModule); return(0); }
cDiseqc::eDiseqcActions cDiseqc::Execute(const char **CurrentAction) const { if (!*CurrentAction) *CurrentAction = commands; while (*CurrentAction && **CurrentAction) { switch (*(*CurrentAction)++) { case ' ': break; case 't': return daToneOff; case 'T': return daToneOn; case 'v': return daVoltage13; case 'V': return daVoltage18; case 'A': return daMiniA; case 'B': return daMiniB; case 'W': *CurrentAction = Wait(*CurrentAction); break; case '[': *CurrentAction = Codes(*CurrentAction); return *CurrentAction ? daCodes : daNone; default: return daNone; } } return daNone; }
void CR_ModuleEx::CreateFlowGraph64(CR_Addr64 entrance) { auto cf = Info64()->CodeFuncFromAddr(entrance); assert(cf); CR_Addr64Set leaders; leaders.insert(entrance); // insert jumpees auto& jumpees = cf->Jumpees(); leaders.insert(jumpees.begin(), jumpees.end()); // insert exits' next auto& exits = cf->Exits(); for (auto addr : exits) { auto op_code = Info64()->OpCodeFromAddr(addr); auto size = op_code->Codes().size(); auto next_addr = static_cast<CR_Addr64>(addr + size); leaders.insert(next_addr); } // insert jumpers' next auto& jumpers = cf->Jumpers(); for (auto addr : jumpers) { auto op_code = Info64()->OpCodeFromAddr(addr); auto size = op_code->Codes().size(); auto next_addr = static_cast<CR_Addr64>(addr + size); leaders.insert(next_addr); } // sort std::vector<CR_Addr64> vecLeaders(leaders.begin(), leaders.end()); std::sort(vecLeaders.begin(), vecLeaders.end()); // store leaders cf->Leaders() = std::move(leaders); const size_t size = vecLeaders.size() - 1; for (size_t i = 0; i < size; ++i) { // for every pair of two adjacent leaders auto addr1 = vecLeaders[i], addr2 = vecLeaders[i + 1]; // prepare a basic block CR_BasicBlock64 block; block.m_addr = addr1; CR_Addr64 next_addr = cr_invalid_addr64; for (auto addr = addr1; addr < addr2; ) { if (cf->Leaders().count(addr)) { // set label at each leader block.AddLeaderLabel(addr); } // op.code from addr auto op_code = Info64()->OpCodeFromAddr(addr); if (op_code == NULL) { break; } auto type = op_code->OpCodeType(); if (type == cr_OCT_JMP) { // jump auto oper = op_code->Operand(0); if (oper->GetOperandType() == cr_DF_IMM) { block.m_jump_to = oper->Value64(); // jump to } next_addr = cr_invalid_addr64; } else if (type == cr_OCT_RETURN) { next_addr = cr_invalid_addr64; } else if (type == cr_OCT_JCC || type == cr_OCT_LOOP) { // conditional jump or loop auto oper = op_code->Operand(0); if (oper->GetOperandType() == cr_DF_IMM) { block.m_jump_to = oper->Value64(); // jump to } block.m_cond_code = op_code->CondCode(); next_addr = static_cast<CR_Addr64>(addr + op_code->Codes().size()); } else { next_addr = static_cast<CR_Addr64>(addr + op_code->Codes().size()); } // add op.code block.m_stmts.emplace_back(*op_code); // go to next addr addr += static_cast<CR_Addr64>(op_code->Codes().size()); } // add label at last block.AddLeaderLabel(addr2); // set next addr block.m_next_addr = next_addr; // add block cf->BasicBlocks().emplace_back(block); } } // CR_ModuleEx::CreateFlowGraph64
BOOL CR_ModuleEx::_DisAsmAddr64(CR_Addr64 func, CR_Addr64 va) { if (!IsModuleLoaded() || !Is64Bit()) return FALSE; // calculate int len; char outbuf[256]; CR_Addr64 addr; // add or retrieve the code function auto cf = Info64()->CodeFuncFromAddr(func); if (cf == NULL) { Info64()->MapAddrToCodeFunc().emplace(func, make_shared<CR_CodeFunc64>()); cf = Info64()->CodeFuncFromAddr(func); } assert(cf); if (func == va) { cf->Addr() = func; } auto pCode = CodeSectionHeader(); assert(pCode); DWORD rva = RVAFromVA64(va); LPBYTE input = m_pLoadedImage + rva; LPBYTE iend = m_pLoadedImage + pCode->RVA + pCode->SizeOfRawData; while (input < iend) { // add or retrieve op.code auto oc = Info64()->OpCodeFromAddr(va); if (oc == NULL) { Info64()->MapAddrToOpCode().emplace(va, make_shared<CR_OpCode64>()); oc = Info64()->OpCodeFromAddr(va); // set op.code address oc->Addr() = va; } assert(oc); if (oc->FuncAddrs().count(func) > 0) break; // add function address for this op.code oc->FuncAddrs().emplace(func); if (oc->FuncAddrs().size() > 1) { cf->FuncFlags() |= cr_FF_FUNCINFUNC; // function in function } if (oc->Codes().empty()) { // disassemble len = disasm(input, outbuf, sizeof(outbuf), 64, va, false, 0); // parse insn if (!len || input + len > iend) { len = 1; oc->Name() = "???"; oc->OpCodeType() = cr_OCT_UNKNOWN; // don't decompile if any unknown instruction. cf->FuncFlags() |= cr_FF_INVALID; } else { oc->Parse(outbuf); } // complement operand size oc->DeductOperandSizes(); // add asm codes to op.code oc->Codes().insert(oc->Codes().end(), input, &input[len]); } else { len = int(oc->Codes().size()); } BOOL bBreak = FALSE; switch (oc->OpCodeType()) { case cr_OCT_JCC: // conditional jump switch (oc->Operand(0)->GetOperandType()) { case cr_DF_IMM: addr = oc->Operand(0)->Value64(); cf->Jumpers().emplace(va); cf->Jumpees().emplace(addr); break; default: break; } break; case cr_OCT_JMP: // jump switch (oc->Operand(0)->GetOperandType()) { case cr_DF_IMM: if (func == va) { // func is jumper cf->FuncFlags() |= cr_FF_JUMPERFUNC; addr = oc->Operand(0)->Value64(); Info64()->Entrances().emplace(addr); cf->Callers().emplace(addr); auto newcf = Info64()->CodeFuncFromAddr(addr); if (newcf == NULL) { Info64()->MapAddrToCodeFunc().emplace( addr, make_shared<CR_CodeFunc64>()); newcf = Info64()->CodeFuncFromAddr(addr); } newcf->Addr() = addr; newcf->Callees().emplace(func); } else { addr = oc->Operand(0)->Value64(); cf->Jumpers().emplace(va); cf->Jumpees().emplace(addr); } break; case cr_DF_MEMIMM: if (func == va) { // func is jumper cf->FuncFlags() |= cr_FF_JUMPERFUNC; bBreak = TRUE; } break; default: break; } bBreak = TRUE; break; case cr_OCT_CALL: // call switch (oc->Operand(0)->GetOperandType()) { case cr_DF_IMM: // function call addr = oc->Operand(0)->Value64(); Info64()->Entrances().emplace(addr); cf->Callees().emplace(addr); { auto newcf = Info64()->CodeFuncFromAddr(addr); if (newcf == NULL) { Info64()->MapAddrToCodeFunc().emplace( addr, make_shared<CR_CodeFunc64>()); newcf = Info64()->CodeFuncFromAddr(addr); } newcf->Addr() = addr; newcf->Callers().emplace(func); } break; default: break; } break; case cr_OCT_RETURN: // return if (oc->Operands().size() && oc->Operand(0)->GetOperandType() == cr_DF_IMM) { cf->StackArgSizeRange().Set(oc->Operand(0)->Value64()); } else { if (func == va) { cf->FuncFlags() |= cr_FF_RETURNONLY; } } cf->Exits().insert(va); bBreak = TRUE; break; default: break; } if (bBreak) break; // move to next position input += len; va += len; } return TRUE; } // CR_ModuleEx::_DisAsmAddr64