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; }
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; }
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; }
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; }
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; }
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; } }