Block level data for the 2000 Census is included in the Summary File 1 (SF1) release here: https://www2.census.gov/census_2000/datasets/Summary_File_1/ The rather impenetrable technical docs for the SF1 release can be found here.
Each state has a "geoheader" file and 39 segmented files which together contain all of the tables for all of the geographies in a state. Details can be found in documentation on that server, although some of the URLs in documentation are no longer available. Within these state-level files, the rows can be joined using the "LOGRECNO" column (the 5th column in the data files, 7th column in the geoheaders), although note that the LOGRECNO values are only unique within each state folder. My first time working with Census 2000 data, I thought they were true unique IDs for the place associated with estimates in a row.
For population counts, you want table P1, which is in file segment 1; for housing unit counts, you want table H1, which is in file segment 37. I'm pretty sure that you just need the first six columns of each of the two segment files -- the first five would be for joining with the geoheaders, and the sixth would be the single data column, for P1 or H1 depending on which segment file you had.
Newcomers to 2000 census data may benefit from a tool called
csvkit, which has a program,
in2csv which is useful for parsing fixed-width files like the geoheader file. A suitable "schema" for the 2000 census can be downloaded from github.