If our field is the one with two elements, $F_2$, then $C_k$ is a direct product of several copies of $F_2$, which means that so are $ker(\partial_k)$, $im(\partial_{k+1})$ and $ker(\partial_k)/im(\partial_{k+1})$. This means that the only data you could really want from $H_k$ is its dimension as a vector space over $F_2$: $$dim(H_k)= dim(ker(\partial_k)) - dim(im(\partial_{k+1}))$$ If $M_k$ and $M_{k+1}$ are matrix representations of $\partial_k$ and $\partial_{k+1}$ then the dimension of the image is the rank of the matrix representation, and the dimension of the kernel is, I think, the number of columns minus the rank. This means that: $$dim(H_k)=numCols(M_k)-rank(M_k)-rank(M_{k+1})$$ Which should be all the data desired from $H_k(X, F_2)$. This shouldn't give negative numbers because the constraint $im(M_{k+1})\subseteq ker(M_k)$ should imply that $rank(M_{k+1})\leq numCols(M_k)-rank(M_k)$. That is, if I'm right about $dim(ker(M_k))=numCols(M_k)-rank(M_k)$.
This seems like a trivial conclusion to me, but I'm writing code for computing simplicial (and eventually persistent) homology over $\mathbb{Z}$ and $F_2$. Obviously, the same reasoning won't work for homology over $\mathbb{Z}$, but when I tried to use this to find the dimensions of $F_2$ homology groups I got some negative numbers...so I thought I would check here in case I'm wasting my time debugging the functions for getting the rank of a matrix over $F_2$.