Hello LOPAN,
First of all, I see that you are registered on Feb 2010. A YEAR ago. Minimum. At least by now, you should know that it is imperative on this board, to tell us what you have done about it.
Yes, it is appreciated that you have gone so far as to find out that serial number is being called 'n' times, but we need code, snippets, tools and your thoughts on this process.
Having said that, let this not be a discouragement to you. Reversing is not a skill easily acquired, and if you keep on giving up, just because you did not get an answer, or you felt dissed, pretty soon you'll run out of steam. Don't give up.
Now, to your problem:
The best thing here, is to think like a programmer. You see, the serial number verification takes (assume so) around 20 or so lines (in whatever language the programmer deems fit). Now, IF the serial number verification has to be called EVERYTIME a menu item is selected (an example, that is), this means, for EVERY MENU ITEM, the programmer will have to include 20 or so lines.
Programmers are not taught to code that way. Instead they will follow BEST PRACTICES, and enter the serial number verification in a function. This function, may be invoked a ZILLION times from THOUSANDS of places in the program. But the verification function itself, is just one.
Here is an example:
Print()
{
... blah blah lots of lines;
Serialverify(xxx.xxx);
...blah blah lots of lines;
}
ShowPrettyGraphics()
{
... blah blah lots of lines;
Serialverify(xxx.xxx);
...blah blah lots of lines;
}
ConnectForUpdate()
{
... blah blah lots of lines;
Serialverify(xxx.xxx);
...blah blah lots of lines;
}
HaveSex() // whatever !
{
... blah blah lots of lines;
Serialverify(xxx.xxx);
...blah blah lots of lines;
}
The point here is, trying to correct the jmp/jnz/jz/flags for EACH of the function, will make you old before your time. Instead, the attack point is not:
Print(),
ShowPrettyGraphics()
ConnectForUpdate()
HaveSex()
Instead, the correct way is to open the function:
Serialverify(xxx.xxx);
and ensure that it returns 1/0 per the response required!
This ensures that EVEN if you have missed out another zillion routines where the verification is called, the routine itself will always pass that its registered.
The idea is, don't try and crack all instances of where this routine is called. Instead, delve INSIDE the verification routine, and return what is expected.
Of course, some programmers are aware so they will try to:
1. Hide this function (some apps do it VERY well)
2. Make junk calls to make you give up in frustration
3. Sometimes, very rarely, but it happens, that the programmer creates 2-3 such routines: Serialverify(xxx,xxx), Serialverify_1(xxx,xxx) and Serialverify_2(xxx,xxx). In this case, he randomly allocates the verification routines to different functions. So, if you have patched the serial verification routine and it still does not work, assume that there is another check that you need to patch. And while this seems like too much work, patching 3 functions is better than patching a zillion.
If, however, this is NOT what the software is doing, then you need to tell us WHAT you are seeing (see? that is why we ask that you tell us your problem specifically)
Best of luck with your cracking. I'd also suggest IDA 6.1 and MyNav python plugin as a first lookover solution. Helps you tone down the noise. It actually acts as a very rough coverage profiler.
Finally, learn to rephrase the questions in a more specific manner. That'll get you a lot of responses, rather than angry outbursts. (I mean, if you think Woody was tough, you're lucky you didn't get JMI !!! ) :O
Let us know how it goes. We *would* really like to help you.
Have Phun