坛子里有一篇精华LabWindows CVI 8.0的文章,看完试着调试了一下,经验与大家共享,写给自己看的,有点老,
1. od载入cvi.dll
2.右键search for ->All referenced text strings, 右键search for 输入lm_ckout.c,
找到两处lm_ckout.c,一个是两个连着的,一个7个连着的。记住cvi.dll是flexnet 10.1.0版本的。
两个连着的是正确的,地址是1061ef33,7个连着的地址是1061f029,这两个连着的字串lm_ckout.c属于大名鼎鼎的lc_checkout函数。lc_checkout函数比较短,它调用_l_checkout函数,而那七个字串lm_ckout.c属于_lc_check_key函数,扯远了。
用od载入cvi.dll,设下断点,bp 1061ef38或F2,或直接双击第二栏代码栏就可以下断点。然后退出。
od载入cvi.exe,F9运行,中间按几次shift+F9,应该可以断下来,看堆栈
0023debc | 0023e928 | ASCII"CVI_FDS"
0023deC0 | 0023e95C | ASCII"8.0100"
可以知道
FEATURE的版本为8.01
FEATURE的名字是CVI_FDS
还缺少vendor name,也就是我们常说的守护进程的程序名。
od载入cvi.dll
右键search for-> constant, 右键search for 输入87654321,一般只有两个,形式如下的是正确的。
10617A76 |. E8 F4B00000 CALL <cvi._l_sg> ; \cvi.10622B6F
10617A7B |. 83C4 0C ADD ESP,0C
10617A7E |. 81BD 84FDFFFF >CMP DWORD PTR SS:[EBP-27C],87654321 ;找到这儿,!!!
10617A88 |. 74 0C JE SHORT cvi.10617A96
10617A8A |. 81BD 88FDFFFF >CMP DWORD PTR SS:[EBP-278],12345678
10617A94 |. 75 5D JNZ SHORT cvi.10617AF3
就是前一句是add esp,0c 后一句是je跳转。同时这个87654321也能确定大名鼎鼎_l_sg函数。断在_l_sg入口处就能得到vendor 名字了。本例是nilm,不是nilm.exe。
87654321这个数属于函数_l_init。这个几个常用的调用关系。最好记住。
a. lc_init -> l_init
b. l_init -> l_sg(1)
a. lc_checkout -> l_checkout
b. l_checkout -> lm_start_real(2)
c. lm_start_real -> l_good_lic_key(3)
d. l_good_lic_key -> l_sg(2)
找到三样东西以后,就是找明码了,定位如下
右键search for-> constant, 右键search for 输入66D8B337,
找到后前面有连续五个mov指令,其中第一个mov指令的第一操作数减1就是明码的地址。比如下面的例子。
10626CCE |. A2 49749310 MOV BYTE PTR DS:[10937449],AL
10626CD3 |. C605 4F749310 >MOV BYTE PTR DS:[1093744F],0
10626CDA |. 8A15 4F749310 MOV DL,BYTE PTR DS:[1093744F]
10626CE0 |. 8815 4E749310 MOV BYTE PTR DS:[1093744E],DL
10626CE6 |> C785 78FEFFFF >MOV DWORD PTR SS:[EBP-188],8
10626CF0 |. 817D 18 37B3D8>CMP DWORD PTR SS:[EBP+18],66D8B337
断在10626cf0,然后od中命令行 db 10937448即可。找到第一个sign后,修改license,关闭od,重新载入,下断,就可以找到第二个sign了。
另外license的格式如下。
-------------------------------------------------------------------------------------------
SERVER THIS_HOST ANY 27000
VENDOR vendor_name
PACKAGE package_name vendor_name feature_ver COMPONENTS="feature_name " SIGN=123456789012
INCREMENT package_name vendor_name feature_ver permanent uncounted VENDOR_STRING="hello world" HOSTID=************ vendor_info="cracked by hhh" TS_OK SIGN=878787878787
---------------------------------------------------------------------------------------------
解释如下
vendor_name 守护程序名,有时称daemon,比如pro/E就是ptc_d,由前所述在_l_sg入口处edx内容就是vendor_name。而_l_sg由87654321及前面的add esp,0c确定。
package_name随便确定,但是注意影响sign的值。
feature_ver和feature_name由属于大名鼎鼎的lc_checkout函数的lm_ckout.c确定,断下,在堆栈中可以看见。
permanent 表示无时间限制
uncounted 表示无用户控制。
vendor_info的内容随便写,不影响sign,
hostid=************表示12位的网卡号,或者
HOSTID=DISK_SERIAL_NUM=******** 表示8位的硬盘号,两者都可以用,当然影响sign。
VENDOR_STRING="hello world" 随便写,但是影响sign,有无引号无所谓,有无VENDOR_STRING也无所谓。
另外我发现有seed1和seed2算出的sign和直接明码找出的sign是不同的,但是都可以通过,也就是全部一样,就是sign不一样,但是都可以。
用lmcryptgui.exe输入不同版本对sign都没有影响。
直接找seed的方法是:
正如胖子所说,在xor al,dl或者xor al,bl指令处,dl或bl内容(1个字节)就是seed,这条指令会执行8次,就会获得seed1和seed2。比如正确的seed1和seed2如下:
seed1 a81b372e
seed2 4d394f25
那么在dl或bl内容将依次出现2e371ba8 254f394d。就是先出现seed1,后seed2,先低字节,后高字节。
至于定位,xor al,dl属于_l_string_key函数,与之类似函数还有_l_string_key1 ~ _l_string_key4共四个函数。
这条指令大约在_l_string_key函数偏移量0e74处,也就是约3700字节处,或1051行处。
这是对应flexnet 10.1.0版本。
flexlm v8~9 xor al,bl
flexnet v10.1 xor al,dl
flexnet v11.1 xor cl, dl
或者特征码
9983E20303C2C1F8028B4D148B,好像通用,不过会有5个地址,和常数66D8B337,前面连续五个mov指令联合判定吧。
_l_ckout_string_key+103D call _atox // 通过_atox 确定
或者常数66D8B337,前面连续五个mov指令。
或者常数 3D4DA1D6是随机数,有的程序没有改,也可以用来定位。
_l_string_key既是找seed的函数,也是找明码的函数。内容多多。常读常新。
找明码的好处就是简单,比较cool,缺点很明显,指对FEATURE很少的软件适用,如果像ansys那样两百多个feature,非疯掉不可。
直接获得两个seed的方法:
搜索
250000100085C00F84
将84改为85,即
250000100085C00F85
会出现两个,第一个是的。这个特征码在直接明码或xor al,dl的前面,都属于_l_string_key函数。
然后在其后的第一个call前断下,eax的内容就是seed1,再次断下,就是seed2。
另外非常奇怪的是在labwindows8.01的cvi.dll里还发现了seed1和seed2的明码,简直是搞笑。
ni的另一个产品labview8.2的程序labview.exe也是发现了seed1和seed2的明码,并且和labwindosw的一样,无语中。。。。。
250000100085C00F84 flexlm 10.1.0
***************************以下代码出现seed1和seed2的明码*********************
10600990 /$ 83EC 14 sub esp, 14
10600993 |. 53 push ebx
10600994 |. 8BD9 mov ebx, ecx
10600996 |. 56 push esi
10600997 |. 57 push edi
10600998 |. 8D7B 08 lea edi, dword ptr [ebx+8]
1060099B |. B9 9F000000 mov ecx, 9F
106009A0 |. BE 40E67C10 mov esi, 107CE640
106009A5 |. F3:A5 rep movs dword ptr es:[edi], dword p>
106009A7 |. 8B0D 802B9310 mov ecx, dword ptr [10932B80]
106009AD |. 85C9 test ecx, ecx
106009AF |. 895C24 1C mov dword ptr [esp+1C], ebx
106009B3 |. C743 04 00000000 mov dword ptr [ebx+4], 0
106009BA |. C703 78E17210 mov dword ptr [ebx], 1072E178
106009C0 |. C743 0C 2E371BA8 mov dword ptr [ebx+C], A81B372E ;seed1!!!!
106009C7 |. C743 10 254F394D mov dword ptr [ebx+10], 4D394F25 ;seed2!!!! 竟然直接出现代码中,
106009CE |. 0F8C 97000000 jl 10600A6B
106009D4 |. 8D71 01 lea esi, dword ptr [ecx+1]
106009D7 |. 55 push ebp
106009D8 |. B8 842B9310 mov eax, 10932B84
106009DD |. BA B82B9310 mov edx, 10932BB8
106009E2 |. 81C3 C8000000 add ebx, 0C8
106009E8 |. 897424 18 mov dword ptr [esp+18], esi
106009EC |. EB 04 jmp short 106009F2
106009EE |> 8B4C24 1C /mov ecx, dword ptr [esp+1C]
106009F2 |> 8BF8 mov edi, eax
106009F4 |. 8B2F |mov ebp, dword ptr [edi]
106009F6 |. 8DB3 7CFFFFFF |lea esi, dword ptr [ebx-84]
106009FC |. 892E |mov dword ptr [esi], ebp
106009FE |. 8B6F 04 |mov ebp, dword ptr [edi+4]
10600A01 |. 896E 04 |mov dword ptr [esi+4], ebp
10600A04 |. 8B7F 08 |mov edi, dword ptr [edi+8]
10600A07 |. 897E 08 |mov dword ptr [esi+8], edi
10600A0A |. 894B 08 |mov dword ptr [ebx+8], ecx
10600A0D |. 49 |dec ecx
10600A0E |. 8D7B 88 |lea edi, dword ptr [ebx-78]
10600A11 |. C703 32946110 |mov dword ptr [ebx], 10619432
10600A17 |. 894C24 1C |mov dword ptr [esp+1C], ecx
10600A1B |. 897C24 10 |mov dword ptr [esp+10], edi
10600A1F |. C74424 14 03000000 |mov dword ptr [esp+14], 3
10600A27 |> 8B08 |/mov ecx, dword ptr [eax]
10600A29 |. 8BE9 ||mov ebp, ecx
10600A2B |. C1E9 02 ||shr ecx, 2
10600A2E |. 8BF2 ||mov esi, edx
10600A30 |. F3:A5 ||rep movs dword ptr es:[edi], dword>
10600A32 |. 8BCD ||mov ecx, ebp
10600A34 |. 83E1 03 ||and ecx, 3
10600A37 |. F3:A4 ||rep movs byte ptr es:[edi], byte p>
10600A39 |. 8B7C24 10 ||mov edi, dword ptr [esp+10]
10600A3D |. 8B4C24 14 ||mov ecx, dword ptr [esp+14]
10600A41 |. 83C7 28 ||add edi, 28
10600A44 |. 83C0 04 ||add eax, 4
10600A47 |. 83C2 28 ||add edx, 28
10600A4A |. 49 ||dec ecx
10600A4B |. 897C24 10 ||mov dword ptr [esp+10], edi
10600A4F |. 894C24 14 ||mov dword ptr [esp+14], ecx
10600A53 |.^ 75 D2 |\jnz short 10600A27
10600A55 |. 8B4C24 18 |mov ecx, dword ptr [esp+18]
10600A59 |. 81C3 90000000 |add ebx, 90
10600A5F |. 49 |dec ecx
10600A60 |. 894C24 18 |mov dword ptr [esp+18], ecx
10600A64 |.^ 75 88 \jnz short 106009EE
10600A66 |. 8B5C24 20 mov ebx, dword ptr [esp+20]
10600A6A |. 5D pop ebp
10600A6B |> 8D43 04 lea eax, dword ptr [ebx+4]
10600A6E |. 50 push eax ; /Arg4
10600A6F |. 8D43 08 lea eax, dword ptr [ebx+8] ; |
10600A72 |. 50 push eax ; |Arg3
10600A73 |. 68 1CE07210 push 1072E01C ; |Arg2 = 1072E01C ASCII "nilm"
10600A78 |. 6A 00 push 0 ; |Arg1 = 00000000
10600A7A |. E8 C0640100 call 10616F3F ; \cvi.10616F3F
10600A7F |. 83C4 10 add esp, 10
10600A82 |. 5F pop edi
10600A83 |. 5E pop esi
10600A84 |. 8BC3 mov eax, ebx
10600A86 |. 5B pop ebx
10600A87 |. 83C4 14 add esp, 14
10600A8A \. C3 retn
***************************************************这段代码属于cvi.dll,不是flexlm的函数,不具有通用性,************
***************************************************************************************************
106267A1 |> \83BD 7CFEFFFF 00 |cmp dword ptr [ebp-184], 0
106267A8 |. 0F85 50040000 |jnz 10626BFE
106267AE |. 83BD 90FEFFFF 00 |cmp dword ptr [ebp-170], 0
106267B5 |. 0F85 47030000 |jnz 10626B02
106267BB |. 837D FC 00 |cmp dword ptr [ebp-4], 0
106267BF |. 0F85 3D030000 |jnz 10626B02
106267C5 |. 8B55 08 |mov edx, dword ptr [ebp+8]
106267C8 |. 8B82 50030000 |mov eax, dword ptr [edx+350]
106267CE |. 25 00001000 |and eax, 100000 ;特征码从这儿开始
106267D3 |. 85C0 |test eax, eax ;250000100085C00F84
106267D5 |. 0F84 27030000 |je 10626B02 ;修改jne ,0f85
106267DB |. C785 4CFEFFFF 4874>|mov dword ptr [ebp-1B4], 10937448
106267E5 |. 8B4D F8 |mov ecx, dword ptr [ebp-8]
106267E8 |. C1E1 04 |shl ecx, 4
106267EB |. 8B940D B4FEFFFF |mov edx, dword ptr [ebp+ecx-14C]
106267F2 |. 8B45 08 |mov eax, dword ptr [ebp+8]
106267F5 |. 33C9 |xor ecx, ecx
106267F7 |. 8A4C10 08 |mov cl, byte ptr [eax+edx+8]
106267FB |. 8B55 14 |mov edx, dword ptr [ebp+14]
106267FE |. 8B42 04 |mov eax, dword ptr [edx+4]
10626801 |. 33C1 |xor eax, ecx
10626803 |. 8B4D F8 |mov ecx, dword ptr [ebp-8]
10626806 |. C1E1 04 |shl ecx, 4
10626809 |. 8B940D B8FEFFFF |mov edx, dword ptr [ebp+ecx-148]
10626810 |. 8B4D 08 |mov ecx, dword ptr [ebp+8]
10626813 |. 33DB |xor ebx, ebx
10626815 |. 8A5C11 08 |mov bl, byte ptr [ecx+edx+8]
10626819 |. C1E3 08 |shl ebx, 8
1062681C |. 33C3 |xor eax, ebx
1062681E |. 8B55 F8 |mov edx, dword ptr [ebp-8]
10626821 |. C1E2 04 |shl edx, 4
10626824 |. 8B8C15 BCFEFFFF |mov ecx, dword ptr [ebp+edx-144]
1062682B |. 8B55 08 |mov edx, dword ptr [ebp+8]
1062682E |. 33DB |xor ebx, ebx
10626830 |. 8A5C0A 08 |mov bl, byte ptr [edx+ecx+8]
10626834 |. C1E3 10 |shl ebx, 10
10626837 |. 33C3 |xor eax, ebx
10626839 |. 8B4D F8 |mov ecx, dword ptr [ebp-8]
1062683C |. C1E1 04 |shl ecx, 4
1062683F |. 8B940D C0FEFFFF |mov edx, dword ptr [ebp+ecx-140]
10626846 |. 8B4D 08 |mov ecx, dword ptr [ebp+8]
10626849 |. 33DB |xor ebx, ebx
1062684B |. 8A5C11 08 |mov bl, byte ptr [ecx+edx+8]
1062684F |. C1E3 18 |shl ebx, 18
10626852 |. 33C3 |xor eax, ebx ;eax即为seed1
10626854 |. 50 |push eax ; /Arg1 = A81B372E
10626855 |. E8 D0060000 |call 10626F2A ; \cvi.10626F2A
1062685A |. 83C4 04 |add esp, 4
1062685D |. 8985 48FEFFFF |mov dword ptr [ebp-1B8], eax
10626863 |. 8B95 48FEFFFF |mov edx, dword ptr [ebp-1B8]
10626869 |. 81E2 FF000000 |and edx, 0FF
1062686F |. 8B85 4CFEFFFF |mov eax, dword ptr [ebp-1B4]
10626875 |. 8A08 |mov cl, byte ptr [eax]
10626877 |. 32CA |xor cl, dl
10626879 |. 8B95 4CFEFFFF |mov edx, dword ptr [ebp-1B4]
1062687F |. 880A |mov byte ptr [edx], cl
10626881 |. 8B85 4CFEFFFF |mov eax, dword ptr [ebp-1B4]
10626887 |. 83C0 01 |add eax, 1
1062688A |. 8985 4CFEFFFF |mov dword ptr [ebp-1B4], eax
10626890 |. 81BD 48FEFFFF FF000000 |cmp dword ptr [ebp-1B8], 0FF
********************************************************************************************
附件有一个脚本,直接出seed,欢迎测试,
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)