コード例 #1
0
BOOL CCmdDlg::Cmd_DB()
{
	ULONG_PTR addr;
	if (GetParamCount() >= 2) {

		ULONG_PTR addr = xtol(GetParam(1));
		if (!IsValidPtr(addr)) {

			PrintLine(_T("invalid address: %p"), addr );
			return TRUE;
		}
	} else
		addr = m_dumpAddr;

	BYTE buf[1024];
	size_t len = 0x10;

	if (GetParamCount() > 2) {
		len = atol(GetParam(2));
		if (len == 0)
			len = 1;

		if (len > sizeof(buf))
			len = sizeof(buf);
	}
        
	size_t readlen = g_dbgEng->ReadMemory((PVOID )addr, buf, len);
	len = readlen;

	size_t n = 0;
	while (n < len) {

		Print("%p\t", addr + n);

		for (int i = 0; i < 0x10; i ++) {
			if (n + i < len)
				Print("%02X ", buf[n + i]);
			else
				Print("   ");
		}

		Print("|");

		for (int i = 0; i < 0x10 && n + i < len; i ++) {
			BYTE c = buf[n + i];

#define IsVisableChar(C)		( (C) < 0x20 )

			Print("%c", IsVisableChar(c) ? '.' : c);
		}
        
		Print(CRLF);

		n += 0x10;
	}

	m_dumpAddr = addr + len;

	return TRUE;
}
コード例 #2
0
BOOL CCmdDlg::Cmd_E()
{
	if (GetParamCount() != 2) {

		PrintLine(_T("invalid command"));
		return TRUE;
	}

	ULONG_PTR addr = xtol(GetParam(1));
	if (!IsValidPtr(addr)) {

		PrintLine(_T("invalid address: %p"), addr );
		return TRUE;
	}

	CBinModifyDlg dlg;
	if (dlg.DoModal() != IDOK)
		return TRUE;

	DWORD n;
	WCHAR* wstr;
	size_t len;

	bool result = false;

	USES_CONVERSION;

	switch(dlg.m_type) {
		case 0: // BYTE
		case 1: // WORD
		case 2:	// DWORD
			if (dlg.m_hex)
				_stscanf((LPCTSTR )dlg.m_strWhat, "%x", &n);
			else
				_stscanf((LPCTSTR )dlg.m_strWhat, "%d", &n);

			result = ModifyMem(addr, (BYTE* )&n, dlg.m_type == 0 ? 1 : dlg.m_type * 2);
			break;

		case 3: // ASCII
			result = ModifyMem(addr, (BYTE* )(LPCSTR )dlg.m_strWhat, dlg.m_strWhat.GetLength());
			break;

		case 4: // UNICODE
			wstr = T2W((LPCSTR )dlg.m_strWhat);
			len = wcslen(wstr) * 2;

			result = ModifyMem(addr, (BYTE* )wstr, len);
			break;
	}

	if (!result)
		MessageBox(_T("modification failed."), NULL);

	return TRUE;
}
コード例 #3
0
BOOL CCmdDlg::Cmd_U()
{
	ULONG_PTR addr;
	if (GetParamCount() >= 2) {

		addr = xtol(GetParam(1));
		if (!IsValidPtr(addr)) {

			PrintLine(_T("invalid address: %p"), addr );
			return TRUE;
		}
	} else
		addr = m_disasmAddr;

	BYTE buf[1024];
	size_t len = 0x10;

	if (GetParamCount() > 2) {
		len = atol(GetParam(2));
		if (len == 0)
			len = 1;

		if (len > sizeof(buf))
			len = sizeof(buf);
	}

	size_t readlen = g_dbgEng->ReadMemory((PVOID )addr, buf, len);
	len = readlen;

	t_disasm da;
	memset(&da, 0, sizeof(da));

	// ulong l = Disasm(code, len, (ulong )addr, &da, DISASM_SIZE);
	ULONG pos = 0;
	ulong l;

	m_disasmAddr = addr;

	while (pos <= len) {

		l = Disasm((char* )&buf[pos], len - pos, (ulong )addr + pos, &da, DISASM_CODE);
		if (l == 0)
			break;

		m_disasmAddr += l;
	    
		PrintLine(" %p | %3i  %-24s  %-24s\n", addr + pos, l, da.dump, da.result);

		pos += l;
	}
	
	return TRUE;
}
コード例 #4
0
BOOL CCmdDlg::Cmd_RTTI()
{
	if (GetParamCount() != 2) {

		PrintLine(_T("invalid command"));
		return TRUE;
	}

	ULONG_PTR addr = xtol(GetParam(1));
	if (!IsValidPtr(addr)) {

		PrintLine(_T("invalid address: %p"), addr );
		return TRUE;
	}

	ULONG_PTR vtablePtr = 0;
	g_dbgEng->ReadMemory((PVOID )addr, (PBYTE )&vtablePtr, sizeof(vtablePtr));	

	ULONG_PTR rttiPtr = vtablePtr - sizeof(ULONG_PTR);
	ULONG_PTR rtti;
	g_dbgEng->ReadMemory((PVOID )rttiPtr, (PBYTE )&rtti, sizeof(rtti));

	ULONG_PTR typeDescPtrPtr = rtti + offsetof(RTTICompleteObjectLocator, pTypeDescriptor);
	ULONG_PTR typeDescPtr;

	g_dbgEng->ReadMemory((PVOID )typeDescPtrPtr, (PBYTE )&typeDescPtr, sizeof(typeDescPtr));

	TypeDescriptor typeDesc;
	memset(&typeDesc, 0 , sizeof(typeDesc));

	g_dbgEng->ReadMemory((PVOID )typeDescPtr, (PBYTE )&typeDesc, sizeof(typeDesc));

	PrintLine("class name: %s", typeDesc.name);

	ULONG_PTR vtable[32];
	memset(vtable, 0 , sizeof(vtable));
	g_dbgEng->ReadMemory((PVOID )vtablePtr, (PBYTE )vtable, sizeof(vtable));

	PrintLine("vtable: %p", vtablePtr);
	for (int i = 0; i < 32; i ++) {
		if (!IsValidPtr(vtable[i]))
			break;
		PrintLine("\t%d\t%p", i, vtable[i]);
	}
	
	return TRUE;
}
コード例 #5
0
BOOL CCmdDlg::Cmd_DD()
{
	ULONG_PTR addr;
	if (GetParamCount() >= 2) {

		ULONG_PTR addr = xtol(GetParam(1));
		if (!IsValidPtr(addr)) {

			PrintLine(_T("invalid address: %p"), addr );
			return TRUE;
		}
	} else
		addr = m_dumpAddr;

	BYTE buf[1024];
	size_t len = 0x10 / sizeof(DWORD);

	if (GetParamCount() > 2) {
		len = atol(GetParam(2));
		if (len == 0)
			len = 1;

		if (len > sizeof(buf) / sizeof(DWORD))
			len = sizeof(buf) / sizeof(DWORD);
	}

	size_t readlen = g_dbgEng->ReadMemory((PVOID )addr, buf, len * sizeof(DWORD));
	len = readlen / sizeof(DWORD);

	size_t n = 0;
	while (n < len) {

		Print("%p\t", addr + n * sizeof(DWORD));

		for (int i = 0; i < 0x10 && n < len; i ++, n ++) {
			Print("%08X ", *(DWORD* )&buf[n * sizeof(DWORD)]);
		}

		Print(CRLF);
	}

	m_dumpAddr = addr + len * sizeof(DWORD);

	return TRUE;
}
コード例 #6
0
ファイル: Parser.cpp プロジェクト: Banbury/starshatter-open
Term*
Parser::ParseTermBase()
{
    Token    t = lexer->Get();
    int      n = 0;
    double   d = 0.0;
    
    switch (t.type()) {
    case Token::IntLiteral: {
        if (dump_tokens)
            Print("%s", t.symbol().data());

        char nstr[256], *p = nstr;
        for (int i = 0; i < (int) t.symbol().length(); i++)
            if (t.symbol()[i] != '_')
                *p++ = t.symbol()[i];
        *p++ = '\0';
        
        // handle hex notation:
        if (nstr[1] == 'x')
            n = xtol(nstr+2);

        else
            n = atol(nstr);

        return new(__FILE__, __LINE__) TermNumber(n);
        }

    case Token::FloatLiteral: {
        if (dump_tokens)
            Print("%s", t.symbol().data());

        char nstr[256], *p = nstr;
        for (int i = 0; i < (int) t.symbol().length(); i++)
            if (t.symbol()[i] != '_')
                *p++ = t.symbol()[i];
        *p++ = '\0';
        
        d = atof(nstr);
        return new(__FILE__, __LINE__) TermNumber(d);
        }

    case Token::StringLiteral:
        if (dump_tokens)
            Print("%s", t.symbol().data());

        return new(__FILE__, __LINE__) TermText(t.symbol()(1, t.symbol().length()-2));

    case Token::AlphaIdent:
        if (dump_tokens)
            Print("%s", t.symbol().data());

        return new(__FILE__, __LINE__) TermText(t.symbol());

    case Token::Keyword:
        if (dump_tokens)
            Print("%s", t.symbol().data());

        switch (t.key()) {
        case KEY_FALSE:   return new(__FILE__, __LINE__) TermBool(0);
        case KEY_TRUE:    return new(__FILE__, __LINE__) TermBool(1);
        
        case KEY_MINUS: {
                Token next = lexer->Get();
                if (next.type() == Token::IntLiteral) {
                    if (dump_tokens)
                        Print("%s", next.symbol().data());

                    char nstr[256], *p = nstr;
                    for (int i = 0; i < (int) next.symbol().length(); i++)
                        if (next.symbol()[i] != '_')
                            *p++ = next.symbol()[i];
                    *p++ = '\0';
                    
                    n = -1 * atol(nstr);
                    return new(__FILE__, __LINE__) TermNumber(n);
                }
                else if (next.type() == Token::FloatLiteral) {
                    if (dump_tokens)
                        Print("%s", next.symbol().data());

                    char nstr[256], *p = nstr;
                    for (int i = 0; i < (int) next.symbol().length(); i++)
                        if (next.symbol()[i] != '_')
                            *p++ = next.symbol()[i];
                    *p++ = '\0';
                    
                    d = -1.0 * atof(nstr);
                    return new(__FILE__, __LINE__) TermNumber(d);
                }
                else {
                    lexer->PutBack();
                    return error("(Parse) illegal token '-': number expected", next);
                }
            }
            break;
        
        default:
            lexer->PutBack();
            return 0;
        }

    case Token::LParen:  return ParseArray();

    case Token::LBrace:  return ParseStruct();

    case Token::CharLiteral:
        return error("(Parse) illegal token ", t);

    default:
        lexer->PutBack();
        return 0;
    }
}