So for example, I have this.
Failed to find pattern for LEA_1407afc81. Pattern: 4C 8D 05 ?? ?? ?? ?? 8B 4A ??
I search for 4C 8D 05 ?? ?? ?? ?? 8B 4A ?? pattern in older ghidra project (for version 1.0.3b) (search memory or S hotkey), and find it (image 1).
So I go to the start of the function and make a sig for it (with a makesig ghidra script, don't know if you have it). I search for that sig in the new version, and can't find it. Too bad. I find usages of that function in the old version, go to the first one. Can't find a pattern for it or the instruction either, but, close to the function call that I can't find, there's a use of a string "Participate::PrepareSkill" (image 2).
In the old version, there's only one usage of this string, so figures it's the same in the new one. Find the string (Search > For Strings), find the one that has a usage, go to where it's used, and here we are - similar code (image 3).
Now, find that code in the old version of the function and in the new one (with the help of the decompiled code, for example). As you can see (image 4 and 5), the code is pretty similar overall, but still a little different, which is why it was unable to find the pattern.
Now, in my case, I use the address to make a simple assembly hook that replaces the address for the LEA instruction. I create an assembly hook for this address that looks like this:
"use64",
$"mov r8, {(ulong)pActiveSkillData}"
So, seeing as the instruction I'm searching for didn't actually change (it's still LEA and the register is still R8), all I need to do here it to replace my old pattern with the newly generated one.
Now repeat for.. 79 other addresses.. ugh.