1) Open up an image editor that can create PCX files.

2) Create a new 64x64-pixel 8-bit 256-color image with black background.

3) Design your crosshair using white and shades of gray.

4) Save it as a PCX file (the image must have only 1 layer).

4) Open up any version of UnrealEd.  In the Textures Window, select File => Import..., then open up the image.

5) Enter the texture's package (will also be the texture filename), group, and name (your own preference; make note of what they are), check Masked and uncheck Generate MipMaps.

6) Save the texture as a UTX file in the UT2004 Textures folder. Exit UnrealEd.

7) Go into the UT2004 System folder and open up User.ini with a text editor.  Under every [XWeapons*] and [Onslaught*] heading, you can set the weapon/vehicle's crosshair.  For example, if package=genxhairs, group=new, name=cross:

[XWeapons.ShockRifle]
bUseOldWeaponMesh=False
ExchangeFireModes=0
Priority=9
CustomCrosshair=0
CustomCrossHairColor=(B=255,G=255,R=0,A=255)
CustomCrossHairScale=2.250000
CustomCrossHairTextureName=genxhairs.new.cross
	~or just...
CustomCrossHairTextureName=genxhairs.cross
	~if no group exists, or...
CustomCrossHairTextureName=genxhairs.new
	~if all the frames in the "new" group belong to one crosshair

[Onslaught.ONSAttackCraft]
CrossHairColor=(B=0,G=0,R=255,A=255)
CrosshairX=32.000000
CrosshairY=32.000000
CrosshairTexture=Texture'genxhairs.new.cross'
bDesiredBehindView=True
TPCamDistance=500.000000

8) Save User.ini.  Now you should be able to see that crosshair whenever you use that weapon/vehicle!!