The joy of shared instructions! Here are a couple of ideas for you to consider, both of which I'm going to be using Cheat Engine to demonstrate, because it's fast becoming the superior dynamic analysis tool for game-hacking.
Something else you can do from that list of addresses is hit Ctrl + R to view the contents of registers. There, you can usually find a register containing a different value between all addresses (you'll want to look for a differing value that's NOT a dynamic memory addressesaddress, because that value will change when restarting the game).
'S' lets youryou view the stack. There, you can look for values to differentiate. 'F' lets you view the contents of the FPU, and XMM registers. Sometimes, the latter can be helpful because, say, the FPU might have been used ONLY for health and not for any other values that shared instruction is writing to.
label(customCode)
label(restoreFlags)
label(originalCode)
label(return)
customCode:
pushf //Preserve flags register by pushing onto the stack
cmp ebx,2B //Does ebx contain the offsetvalue you're interested in?
jne restoreFlags //If not, restore flags register and resume normal execution
mov eax,(float)100 //If so, move a custom health value into eax for originalCode
//Execution flow from here moves to restoreFlags
restoreFlags:
popf //Restore flags register
//Execution flow from here moves to originalCode
originalCode:
mov [edx+0C],eax //eax contains either value from normal execution, or custom health
jmp return //Return to the point we injected and resume normal execution