LnsOpcServer.exe
加密方式:序列号,
输入注册码后点Valid licence。
限制:没有注册在主界面显示。
工具:Ollydbg, IDA4.5, PEEditor,UltraEdit
分析:初步分析,发现限制都在他的一个serialShield.dll里,调用了serialShield.dll,里面有个antiDebugging函数需要注意。而且还使用了很多花指令。
系统调用SerialShield.dll是使用loadlibraryw,而不是loadlibrarya,要注意,有一个函数,GetFuncOfSerialDll
里面得到所有的seraildll里的函数,这是个突破口。可以通过这个函数得到地址。
getFuncOfSerialDll
0043C1B0 >/$ 68 A 89C4500 push LnsOpcSe.00459CA8 ; /FileName =
"SerialShield.dll"
0043C1B5 |. FF15 54714400 call dword ptr ds:[<&KERNEL32.LoadLibraryW>] ; /LoadLibraryW
0043C1BB |. 85C0 test eax,eax
0043C1BD |. A3 34A74500 mov dword ptr ds:[ 45A734],eax
0043C 1C2 |. 0F84 53010000 je LnsOpcSe .0043C31B
0043C 1C8 |. 56 push esi
0043C 1C9 |. 8B 35 C8704400 mov esi,dword ptr ds:[<&KERNEL32.GetProcAddress>] ; kernel32.GetProcAddress
0043C1CF |. 68 989C4500 push LnsOpcSe .00459C98 ; /ProcNameOrOrdinal =
"GetHardwardID"
0043C1D4 |. 50 push eax ; |hModule
0043C1D5 |. FFD6 call esi ; /GetProcAddress
0043C1D7 |. A3 30A74500 mov dword ptr ds:[ 45A730],eax
0043C1DC |. A1 34A74500 mov eax,dword ptr ds:[ 45A734]
0043C1E1 |. 68 909C4500 push LnsOpcSe .00459C90 ; /ProcNameOrOrdinal =
分析校验的地方,来到这里,从这里看出,调用了SerialSh.SSUser,然后判断返回值是否等于4,发现这个函数在启动的时候也判断了这里,所以修改返回值等于4。另外还有一个ss_trialMode函数也很重要,不过暂时还没用到。估计是判断是否是试用版本的。
0040A72E |> /8B55 D4 mov edx,dword ptr ss:[ebp -2C]
0040A731 |. 68 6CA14500 push LnsOpcSe .0045A 16C
0040A736 |. 52 push edx
0040A737 |. 56 push esi
0040A738 |. FF15 2CA74500 call dword ptr ds:[ 45A 72C] ; SerialSh.SSUser 非常关键的函数
0040A73E |. 83F8 04 cmp eax,4 <-------------很关键,必须等于4
0040A741 |. /75 0B jnz short LnsOpcSe .0040A74E
0040A743 |. |66:C705 3AA74>mov word ptr ds:[ 45A 73A],1
0040A 74C |. |EB 13 jmp short LnsOpcSe .0040A761
0040A74E |> /66:833D 3AA74>cmp word ptr ds:[ 45A 73A],1
0040A756 |. 75 09 jnz short LnsOpcSe .0040A761
0040A758 |. 66:C705 3AA74>mov word ptr ds:[ 45A 73A],0
0040A761 |> E8 CA1B0300 call LnsOpcSe .0043C330 <---------freelibrary