My cohomology is a bit rusty, so I'm sorry for any mistakes or for being sketchy. It may also be that my suggestion is too close to the singular cohomology solution you want to avoid, although I'll be using Cech cohomology instead.
Let's first make a covering $\mathcal{U}=(U_j)_{j\in I}$ of $M$ where all $U_j$, as well as $U_J=\cap_{j\in J} U_j$ for $J\subset I$, are contractible (or empty).
The basic idea is to use the double complex
$$
\begin{array}{ccccccccc}
&&0&\rightarrow&C^0(\mathbb{R})&\rightarrow&C^1(\mathbb{R})
&\rightarrow&\cdots\\
&&\downarrow&&\downarrow&&\downarrow&&\downarrow\\
0&\rightarrow&\Omega^0&\rightarrow&C^0(\Omega^0)&\rightarrow&C^1(\Omega^0)
&\rightarrow&\cdots\\
&&\downarrow&&\downarrow&&\downarrow&&\downarrow\\
0&\rightarrow&\Omega^1&\rightarrow&C^0(\Omega^1)&\rightarrow&C^1(\Omega^1)
&\rightarrow&\cdots\\
&&\downarrow&&\downarrow&&\downarrow&&\downarrow\\
\end{array}
$$
where $C^q(\Omega^p)=C^q(\mathcal{U},\Omega^p)$ consists of $(\omega_J)_{J\in I_p}$ where $I_p$ is the set of size $p+1$ subsets of $I$ and $\omega_J\in\Omega^p(U_J)$: i.e. the setup for defining the Cech cohomology.
We then have maps $\delta:C^q(\Omega^p)\rightarrow C^{q+1}(\Omega^p)$,
and $d:C^q(\Omega^p)\rightarrow C^q(\Omega^q)$.
For convenience, I'll pretend $C^q(\Omega^{-1})=C^q(\mathbb{R})$ and $C^{-1}(\Omega^p)=\Omega^p$ (i.e. global $p$-form which I should probably have denoted $\Gamma(\Omega^p)$ instead of just $\Omega^p$).
Note that $H^p(C^q(\Omega^\bullet))=0$ for $p\ge 0$ since closed forms are exact on all the contractible sets $U_J$.
The proof that $H^k(M)=H^k(\Omega^\bullet)$ is equal to $H^k(M;\mathbb{R})=H^k(C^k(\mathbb{R}))$ is then done by diagram chasing.
Start with $\omega\in\Omega^k$ with $d\omega=0$. This maps to $(\omega^{(0)}_J)_{J\in I_0}\in C^0(\Omega^k)$ by restriction of $\omega$ to each $U_J$, $J\in I_0$. Since $d\omega^{(0)}_J=0$, we have $\omega^{(0)}_J=d\upsilon^{(0)}_J$ for some $\upsilon^{(0)}_J\in\Omega^{k-1}(U_J)$. This $(\upsilon^{(0)}_J)$ is then mapped to $\omega^{(1)}\in C^1(\omega^{k-1})$. And so we go, alternatingly moving up and right, until we get an element of $C^k(\mathbb{R})$.
Similar diagram chasing is used to show that this mapping is one-to-one module the images $d\Omega^{k-1}$ and $\delta C^{k-1}(\mathbb{R})$. (Assuming I haven't mixed things up here.)
A $k$-form $\omega$ is integral in $H^k(M)\equiv H^k(M;\mathbb{R})$ if it can be mapped by the above procedure to an element in $C^k(\mathbb{Z})$.
So, here's the trick. Let $\omega$ and $\nu$ be closed $p$- and $q$-forms resp. corresponding to integral cohomology classes. We can then replicate the entire diagram chasing for $\omega$, but apply it to $\omega\wedge\nu$ where through each step we leave $\nu$ unchanged, finally mapping $\omega$ to an element of $\omega^{(-1)}\in C^p(\mathbb{Z})$. This should result in an element of $C^p(\Omega^q)$ where $nu$ restricted to $U_J$ sets are multiplied by the integer values of $\omega^{(q)}_J$.
Afterwards, we continue to do the same with $\nu$:
the $\omega^{(p)}=(\omega^{(p)}_J)_{J\in I_p}$ part now consist of just constants by which the forms are multiplied.
As I warned, my cohomoloogy is somewhat rusty, so I may quite likely have missed a number of technical issues. However, I think this basic approach should work. And it should be a good excercise in diagram chasing.