5A05375F
5A05375F loc_5A05375F: ; CODE XREF: _l_ckout_string_key+E43j
5A05375F ; _l_ckout_string_key+E4Cj
5A05375F push offset byte_5A0C5820
5A053764 call _our_encrypt ;the second encrypt
.
.
.
5A05384B mov ecx, [ebp+var_188]
5A053851 add ecx, 1
5A053854 mov [ebp+var_188], ecx
5A05385A
5A05385A loc_5A05385A: ; CODE XREF: _l_ckout_string_key+F47j
5A05385A mov edx, [ebp+var_188]
5A053860 cmp edx, [ebp+var_18C]
5A053866 jge loc_5A0539E0
5A05386C mov eax, [ebp+var_188]
5A053872 mov cl, [ebp+eax*2+var_168]
5A053879 mov [ebp+var_1CC], cl
5A05387F call ds:__p___mb_cur_max
5A053885 cmp dword ptr [eax], 1
.
.
.
5A0539CB xor eax, eax
5A0539CD mov al, byte_5A0C5820[edx] ; 最终 - 比较license
5A0539D3 cmp ecx, eax
5A0539D5 jz short loc_5A0539DB ;比较下一个byte
5A0539D7 xor eax, eax ;错误的key
5A0539D9 jmp short loc_5A053A01
5A0539DB ; ΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖ
5A0539DB
5A0539DB loc_5A0539DB: ; CODE XREF: _l_ckout_string_key+10D3j
5A0539DB jmp loc_5A05384B ;loop back
上面的循环与版本7中的有些类似(现在是7.2)。5A0C5820是产生真正的key的地方!这里有必要说明一下key的产生:如果没有license key,我们的license(格式正确)是混乱的,两者好像是通过addi function函数联系到一起的。所以现在程序的任务就是计算vendorseed,并在4个vendorkey的帮助下同混乱的license混合(可能是做某种运算^_^)。上面说得工作将在5A0C5820处完成。在5A0C5820处bpm,我们得到:
.
.
5A053334 mov byte_5A0C5820[ecx], al ;here we go
5A05333A jmp short loc_5A0532F9
5A05333C loc_5A05333C: ; CODE XREF: _l_ckout_string_key+A0Dj
5A05333C cmp [ebp+var_188], 0
从5A05333C处开始追踪,我们发现了计算seed的代码:
5A0533EA xor eax, ebx ;计算正确的seed
5A0533EC push eax ;入栈
5A0533ED call sub_5A053AD3
5A0533F2 add esp, 4
5A0533F5 mov [ebp+seed_one], eax
5A0533FB mov edx, [ebp+seed_one]
5A053401 and edx, 0FFh
.
.
5A0534C9 add eax, 1
5A0534CC mov [ebp+var_10], eax
5A0534CF mov [ebp+seed_one], 3D4DA1D6h ;隐藏seed
.
.
5A053548 push eax ;第二个seed入栈
5A053549 call sub_5A053AD3
5A05354E add esp, 4
5A053551 mov [ebp+seed_two], eax
5A053557 mov edx, [ebp+seed_two]
.
.
5A053628 mov [ebp+var_10], eax
5A05362B mov [ebp+seed_two], 3D4DA1D6h ;隐藏5A053635 jmp loc_5A053735
将seed隐藏能很好的防止内存dump工具将seed解出来。解seed的过程只能在特定位置并且是运行时才可以!
总结:
LC_CHECKOUT ---
|
|
_l_good_lic_key— /*加密的keys*/
|
|
_l_ckout_crypt---/*解密的keys*/
|
|
_real_crypt---
|
|
_l_ckout_string_key---
|
|
5A0533EA /*计算第一个seed*/
|
|
5A053547 /*计算第二个seed*/
|
|
5A0539DB <-
|
|
5A0539CD--- /*license比较*/
现在我们可以修改lm_code.h并且编译lmcrypt。使用3D4DA1D6h这样的字节模式,我们在AddInlm.dll中找类似的位置。其实我们只需要LC_CHECKOUT作为feature名。使用其他的模式能得到相应的位置(对于没有flexlm SDK的朋友来说,比较有用):
jutil.dll AddInlm.dll Selicwiz.exe
5A0533EC 046CAEDC 00428C6C
.
5A0539CD 046CB4BD 0042924D
The origin of the above code is the object lm_ckout.obj winthin the lmgr.lib library.(大体意思是上面的代码从那里来的)
|
|
5A0533EA /*计算第一个seed*/
|
5A053547 /*计算第二个seed*/
|
5A0539DB <-
| |
5A0539CD--- /*license比较*/
|
--
翻译得不好,大虾莫笑:P