Exemple #1
0
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);
}
Exemple #2
0
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);
}
Exemple #3
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;
}
Exemple #4
0
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
Exemple #5
0
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