My other answer is a nice solution for interactively looking at boxes, but in the comments, Mr.Wizard seems to be indicating that he's more interested in programmatic usage, and that he's definitely interested in seeing the box form after the FE has stripped non-semantic boxes to send to the kernel. So here's a totally different method for doing this which achieves those goals.
MathLink`CallFrontEnd[ FrontEnd`UndocumentedTestFEParserPacket["a*b c+d", True]] The first argument to UndocumentedTestFEParserPacket must be a string, so this solution precludes 2D input unless you formulate the 2D input using linear syntax. The second argument indicates whether the result should strip non-semantic boxes in the same way that the FE does at Shift+Enter time. True indicates that it should strip (note the return value does not include the space between b and c). Replacing it with False would leave the non-semantic boxes exactly as if they were being written to a notebook file.
If you're wondering what a non-semantic box is, this includes non-semantic spaces and several different boxesbox types if they have StripOnInput set to true. The list, and default values of StripOnInput options can be found in the Option Inspector (just search for StripOnInput). StyleBox also takes the StripOnInput option. By default, StyleBox is stripped in math but not in 2D or 3D graphics. Here's an example of StyleBox stripping.
MathLink`CallFrontEnd[ FrontEnd`UndocumentedTestFEParserPacket[ "\!\(\*StyleBox[\"x\",\"style\"]\)", True]] returns just the x while
MathLink`CallFrontEnd[ FrontEnd`UndocumentedTestFEParserPacket[ "\!\(\*StyleBox[\"x\",\"style\",StripOnInput->False]\)", True]] returns the full StyleBox.