事由:如题,我已经翻译了CrackZ文章,见:
http://bbs.pediy.com/showthread.php?s=&threadid=35082
其中有两个函数:_l_n36_buff与_l_n36_buf CrackZ没有解释怎么找到,也没有解释清楚。热心的orchid88首先指出问题,并提出他的见解。我所做的是给大家提供个参考。
申明:所有实验都是用IDA pro做的,标注也是IDA依据sig自动标注,没有我人工分析的成分。
最初由 orchid88 发布
不错,辛苦了。有一些笔误请修正,比如文中多次把_l_n36_buff()误为_l_buf_36()。这篇文章我很早的时候就看过英文原文,里面有一点没有说清楚的就是_l_n36_buff()函数是怎么找到的,其实就是_l_sg()函数中非零不跳转处那个调用过后可以用calc seed工具找出seed的地方。请大家注意,_l_n36_buff()和_l_n36_buf()是不同的两个函数,一个是加密,另一个是解密函数。
基于此,我用IDA pro找了个带ECC加密的flexlm,对这两个函数解释如下:
1)关于_l_n36_buf()
这个函数在liaoqian方法定位l_sg部分可以找到,相信大家看地懂下面的代码
.text:092534E6.text:09253478 ; *************** S U B R O U T I N E ***************************************
.text:09253478
.text:09253478 ; Attributes: bp-based frame
.text:09253478
.text:09253478 public l_sg
.text:09253478 l_sg proc near ; CODE XREF: l_good_lic_key+A3p
.text:09253478 ; l_good_lic_key+784p
.text:09253478 ; l_init+988p
.text:09253478 ; l_handshake+59p
.text:09253478
.text:09253478 var_34 = dword ptr -34h
.text:09253478 var_28 = dword ptr -28h
.text:09253478 var_24 = dword ptr -24h
.text:09253478 var_20 = dword ptr -20h
.text:09253478 var_1C = dword ptr -1Ch
.text:09253478 var_18 = dword ptr -18h
.text:09253478 var_14 = dword ptr -14h
.text:09253478 var_10 = dword ptr -10h
.text:09253478 var_C = dword ptr -0Ch
.text:09253478 var_8 = dword ptr -8
.text:09253478 arg_0 = dword ptr 8
.text:09253478 arg_4 = dword ptr 0Ch
.text:09253478 arg_8 = dword ptr 10h
.text:09253478
.text:09253478 push ebp
.text:09253479 mov ebp, esp
.text:0925347B sub esp, 28h
.text:0925347E push edi
.text:0925347F push esi
.text:09253480 push ebx
.text:09253481 mov [ebp+var_14], 0
.text:09253488 mov [ebp+var_18], 6F7330B8h =>这个很著名了,不懂的话看laoqian与newsearch的文章
.text:0925348F mov [ebp+var_1C], 0
.text:09253496 mov [ebp+var_20], 0
.text:0925349D mov [ebp+var_24], 3
.text:092534A4 mov eax, [ebp+arg_0]
.text:092534A7 mov edx, [eax+6Ch]
.text:092534AA mov ax, [edx+0F54h]
.text:092534B1 and eax, 0FFFF8000h
.text:092534B6 test ax, ax
.text:092534B9 jz short loc_92534E6
.text:092534B9
.text:092534BB cmp l_n36_buff, 0 =>l_n36_buff第一次
.text:092534C2 jz short loc_92534E6
.text:092534C2
.text:092534C4 mov eax, [ebp+arg_8]
.text:092534C7 push eax
.text:092534C8 mov eax, [ebp+arg_4]
.text:092534CB push eax
.text:092534CC mov eax, [ebp+arg_0]
.text:092534CF push eax
.text:092534D0 mov ebx, l_n36_buff =>l_n36_buff第二次
.text:092534D6 mov [ebp+var_28], ebx
.text:092534D9 mov edi, [ebp+var_28]
.text:092534DC call edi =>这个CALL很著名了
.text:092534DE add esp, 0Ch
.text:092534E1 jmp loc_9253628
.text:092534E1
.text:092534E6 ; ---------------------------------------------------------------------------
.text:092534E6
2)关于l_n36_buf函数,我依据CrackZ的文章,列个lc_new_job里的来说明吧
.text:0925D4F0
.text:0925D4F0 ; *************** S U B R O U T I N E ***************************************
.text:0925D4F0
.text:0925D4F0 ; Attributes: bp-based frame
.text:0925D4F0
.text:0925D4F0 public lc_new_job
.text:0925D4F0 lc_new_job proc near ; CODE XREF: sub_92241D0+60p
.text:0925D4F0
.text:0925D4F0 var_1C = dword ptr -1Ch
.text:0925D4F0 var_14 = dword ptr -14h
.text:0925D4F0 var_10 = dword ptr -10h
.text:0925D4F0 var_C = dword ptr -0Ch
.text:0925D4F0 arg_0 = dword ptr 8
.text:0925D4F0 arg_4 = dword ptr 0Ch
.text:0925D4F0 arg_8 = dword ptr 10h
.text:0925D4F0 arg_C = dword ptr 14h
.text:0925D4F0
.text:0925D4F0 push ebp
.text:0925D4F1 mov ebp, esp
.text:0925D4F3 sub esp, 14h
.text:0925D4F6 push esi
.text:0925D4F7 push ebx
.text:0925D4F8 mov eax, l_n36_buf =>这个是什么?
.text:0925D4FD mov [ebp+arg_4], eax
.text:0925D500 lea eax, [ebp+var_14]
.text:0925D503 push eax
.text:0925D504 push 0
.text:0925D506 push 0
.text:0925D508 push 0
.text:0925D50A mov eax, [ebp+arg_8]
.text:0925D50D push eax
.text:0925D50E lea eax, [ebp+var_C]
.text:0925D511 push eax
.text:0925D512 mov ebx, [ebp+arg_4]
.text:0925D515 call ebx =>这个呢?
.text:0925D517 add esp, 18h
.text:0925D51A push 0
.text:0925D51C push 0
.text:0925D51E push 0
.text:0925D520 push 0
.text:0925D522 push 0
.text:0925D524 push 0
.text:0925D526 mov ebx, [ebp+arg_4]
.text:0925D529 call ebx
.text:0925D52B add esp, 18h
.text:0925D52E mov eax, [ebp+arg_C]
.text:0925D531 push eax
.text:0925D532 mov eax, [ebp+arg_8]
.text:0925D535 push eax
.text:0925D536 lea eax, [ebp+var_C]
.text:0925D539 push eax
.text:0925D53A mov eax, [ebp+arg_0]
.text:0925D53D push eax
.text:0925D53E call lc_init
.text:0925D53E
.text:0925D543 add esp, 10h
.text:0925D546 mov eax, eax
.text:0925D548 mov [ebp+var_10], eax
.text:0925D54B cmp [ebp+var_10], 0
.text:0925D54F jnz loc_925D5F1
.text:0925D54F
.text:0925D555 mov eax, [ebp+arg_C]
.text:0925D558 mov edx, [eax]
.text:0925D55A mov eax, [edx+6Ch]
.text:0925D55D mov edx, [ebp+arg_C]
.text:0925D560 mov ecx, [edx]
.text:0925D562 mov edx, [ecx+6Ch]
.text:0925D565 mov esi, [edx+0F54h]
.text:0925D56B or esi, 8000h
.text:0925D571 mov [eax+0F54h], esi
.text:0925D577 mov eax, [ebp+arg_C]
.text:0925D57A mov edx, [eax]
.text:0925D57C mov eax, [ebp+arg_4]
.text:0925D57F mov [edx+618h], eax
.text:0925D585 mov eax, [ebp+arg_C]
.text:0925D588 mov edx, [eax]
.text:0925D58A cmp word ptr [edx+440h], 2655h
.text:0925D593 jnz short loc_925D5B1
.text:0925D593
.text:0925D595 push 0
.text:0925D597 push 0
.text:0925D599 push 0
.text:0925D59B push 2
.text:0925D59D push 0
.text:0925D59F push 0
.text:0925D5A1 mov ebx, [ebp+arg_4]
.text:0925D5A4 call ebx
.text:0925D5A6 add esp, 18h
.text:0925D5A9 mov eax, eax
.text:0925D5AB test eax, eax
.text:0925D5AD jnz short loc_925D5B1
.text:0925D5AD
.text:0925D5AF jmp short loc_925D5D3
.text:0925D5AF
.text:0925D5B1 ; ---------------------------------------------------------------------------
.text:0925D5B1
.text:0925D5B1 loc_925D5B1: ; CODE XREF: lc_new_job+A3j
.text:0925D5B1 ; lc_new_job+BDj
.text:0925D5B1 mov eax, [ebp+arg_C]
.text:0925D5B4 mov edx, [eax]
.text:0925D5B6 mov eax, [edx+6Ch]
.text:0925D5B9 mov edx, [ebp+arg_C]
.text:0925D5BC mov ecx, [edx]
.text:0925D5BE mov edx, [ecx+6Ch]
.text:0925D5C1 mov esi, [edx+0F54h]
.text:0925D5C7 or esi, 40000h
.text:0925D5CD mov [eax+0F54h], esi
.text:0925D5CD
.text:0925D5D3
.text:0925D5D3 loc_925D5D3: ; CODE XREF: lc_new_job+BFj
.text:0925D5D3 mov eax, [ebp+arg_C]
.text:0925D5D6 mov edx, [eax]
.text:0925D5D8 mov eax, [ebp+var_14]
.text:0925D5DB cmp eax, [edx+5D0h]
.text:0925D5E1 jle short loc_925D5F1
.text:0925D5E1
.text:0925D5E3 mov eax, [ebp+arg_C]
.text:0925D5E6 mov edx, [eax]
.text:0925D5E8 mov eax, [ebp+var_14]
.text:0925D5EB mov [edx+5D0h], eax
.text:0925D5EB
.text:0925D5F1
.text:0925D5F1 loc_925D5F1: ; CODE XREF: lc_new_job+5Fj
.text:0925D5F1 ; lc_new_job+F1j
.text:0925D5F1 mov edx, [ebp+var_10]
.text:0925D5F4 mov eax, edx
.text:0925D5F6 jmp short $+2
.text:0925D5F8 lea esp, [ebp-1Ch]
.text:0925D5FB pop ebx
.text:0925D5FC pop esi
.text:0925D5FD leave
.text:0925D5FE retn
.text:0925D5FE
.text:0925D5FE lc_new_job endp
.text:0925D5FE
.text:0925D5FE ; ---------------------------------------------------------------------------
.text:0925D5FF
希望对大家看CrackZ的文章有用。祝大家好运,我也算对文章的翻译有个交代。
这里感谢orchid88,感谢所有的人。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)