WindowsÓÅ»¯´óʦv2.9+µÄ×¢²áÂë¼ÓÃÜËã·¨
written by dr0, 2000/08/22
±¾ÎĽ«ÒÔ»ã±à´úÂëΪÀý£¬½âÊÍһϡ°WindowsÓÅ»¯´óʦ¡± v2.9+ÖÐÓõ½µÄRSAËã·¨¡£
Ïȼòµ¥½éÉÜÒ»ÏÂRSAËã·¨£¬±ãÓںͻã±à´úÂë¶ÔÕÕ¡£¾ßÌåµÄÊýѧÀíÂÛÎÒÃÇÔڴ˲¢²»Ì«¹ØÐÄ£¬ÓÐÐËȤµÄ¿ÉÒÔÈ¥²é²Î¿¼×ÊÁÏ¡£
RSAËã·¨¼òÊö£º
1¡¢È¡Á½¸öËØÊýpºÍq¡£
2¡¢¼ÆËãn=pq£¬f=(p-1)(q-1)¡£
3¡¢Ëæ»úÑ¡È¡ÕûÊýe£¬Âú×ãÌõ¼þgcd(e, f)=1£¬ÆäÖÐgcdΪ×î´ó¹«Ô¼Êý¡£
4¡¢¼ÆËãd£¬Ê¹µÃ³Ë»ýde¶ÔfÇóÓàµÄ½á¹ûΪ1£¬¼´deºÍ1¶ÔfͬÓà¡£
ÉÏÊöÖ»ÓÐeºÍn¶ÔÍ⹫¿ª£¬ÓÃÓÚ¼ÓÃÜ¡£
¼ÓÃܹý³Ì£¨·ûºÅ^±íʾ³ËÃÝ£¬mod±íʾÇóÓࣩ£º
eΪ¼ÓÃÜÃÜÔ¿£¬¼Ù¶¨Ã÷ÎÄΪm£¬ÔòÃÜÎÄc = (m ^ e) mod n¡£
½âÃܹý³Ì£º
dΪ½âÃÜÃÜÔ¿£¬Ôò½âÃܵõ½µÄÃ÷ÎÄm'= (c ^ d) mod n¡£
RSA±»¹¥ÆƵÄÒ»¸ö³ä·ÖÌõ¼þÊÇn±»Òò×ӷֽ⣬¼´µÃµ½pºÍq¡£ÒòΪµÃµ½pºÍqÖ®ºó±ã¿ÉÒÔ¼ÆËã³öf£¬´Ó¶ø¸ù¾Ý¡°deºÍ1¶ÔfͬÓࡱ
Õâ¸öÌõ¼þ¼ÆËã³ö½âÃÜÃÜÔ¿dÀ´¡£
¸ù¾ÝÉÏÃæµÄ¼ÓÃܺͽâÃÜËã·¨¿ÉÒÔ¿´³ö£º
1¡¢RSAµÄ¼ÓÃܺͽâÃÜÊǶԳƵģ¬¼´¼ÓÃܺͽâÃÜ¿ÉÒÔʹÓÃͬһ¸öº¯Êý£»
2¡¢RSA¼ÓÃÜÖ÷ÒªÒÀ¿¿Ä£ÃÝÔËË㣬Òò´ËÕⲿ·ÖÔËËãµÄ¸´ÔӶȶÔËã·¨µÄЧÂÊÓ°Ïì×î´ó¡£¹ØÓÚÄ£ÃÝÔËË㣬ÔÚ¡¶¼ÆËã»úÃÜÂëѧ¡·
£¨Ç廪³ö°æÉ磬¬¿ª³Î£©Ò»ÊéÖн²ÁËÒ»ÖÖËã·¨£¬¸ÃËã·¨ºÜÈÝÒ×Àí½â£¬ÆäÖ¸µ¼Ë¼Ïë¾ÍÊDz»Í£µØ½µ½×£¬´Ó¶ø½µµÍʱ¼ä¸´ÔӶȡ£
ÓÃÀàCÓïÑÔµÄαÂëÃèÊöÈçÏ£º
//ÏÂÃæÕâ¸öº¯Êý¼ÆËã(m ^ e) mod n
ReturnValueType encrypt_decrypt(m, e, n)
{
LocalVariables a, b, c;
a = m;
b = e;
c = 1;
while(b)
{
if ((b mod 2) == 0)
{
b = b / 2; //½µ½×
a = (a * a) mod n;
}
else
{
b = b - 1;
c = (a * c) mod n;
}
}
return c;
}
WindowsÓÅ»¯´óʦµÄÆƽâ¹ý³ÌÒÑÓкܶàÎÄÕ½²¹ý£¬±¾ÎÄÖصã·ÖÎöÆä¶ÔÎÒÃÇÊäÈëµÄ×¢²áÂë½øÐмÓÃÜÔËËãµÄ²¿·Ö£¬
ÒòΪֻÓÐÕâÒ»²¿·ÖÇóÄæµÄÄѶȱȽϴóЩ£¬ÆäËü²¿·Ö¿ÉÒÔÖ±½Ó¿½±´»òÕߺÜÈÝÒ×ÇóÄ棨ÀýÈç»·ÐÎÒÆλÔËË㣩¡£
ÎÒÃǽ«»á¿´µ½£¬ÆäʹÓõÄÄ£ÃÝËã·¨¾ÍÊÇÉÏÊöµÄËã·¨¡£
ÓÃIDA·´»ã±àOctoDll.dll£¬¿ÉÒÔ¿´µ½Ò»¸öÃûΪRegisted( )µÄº¯Êý£¬ÕâÏÔÈ»ÊÇÔÚÅжÏ×¢²áÂë¡£Õâ¸öº¯Êý½«¶ÔÎÒ
ÃÇÊäÈëµÄÁ½²¿·Ö×¢²áÂë·Ö±ð½øÐÐRSA¼ÓÃÜ£¬ÔÙÒÆ룬°ÑÒÆλµÄ½á¹ûºÍÒ»¸öÊý£¨Õâ¸öÊýÊǸù¾Ý¡°You are big pig.¡±
¡¢¡°1234567¡±ÒÔ¼°×¢²áÉêÇëÂë¼ÆËã³öÀ´µÄ£¬Õâ¸ö¼ÆËã¹ý³ÌÎÞÐèÇóÄ棩½øÐбȽϣ¬È»ºó·µ»ØÁíÒ»¸öÖµ£¨ËüµÄÖ÷³Ì
Ðò»áÅжϸÃÖµÊÇ·ñΪ0x14£©¡£
Registed proc near
var_10 = dword ptr -10h
var_A = word ptr -0Ah
var_8 = dword ptr -8
var_4 = dword ptr -4
arg_0 = dword ptr 8
arg_8 = dword ptr 10h
push ebp
mov ebp, esp
add esp, 0FFFFFFF0h
push ebx
xor edx, edx
mov [ebp+var_10], edx
mov ebx, eax
xor eax, eax
push ebp
push offset loc_4043FE
push dword ptr fs:[eax]
mov fs:[eax], esp
mov eax, [ebp+arg_8]
mov [ebp+var_8], eax
mov eax, [ebp+arg_0]
mov [ebp+var_4], eax
lea eax, [ebp+var_10]
mov edx, ebx
call unknown_libname_17
mov eax, [ebp+var_10]
lea edx, [ebp+var_A]
lea ecx, [ebp+var_8]
call sub_4041D8 //ºËÐÄÅжÏ
test eax, eax
jnz short loc_4043E4
xor ebx, ebx //bad guy
jmp short loc_4043E8
loc_4043E4:
movzx ebx, [ebp+var_A] //return value
loc_4043E8:
xor eax, eax
pop edx
pop ecx
pop ecx
mov fs:[eax], edx
push offset loc_404405
loc_4043F5:
lea eax, [ebp+var_10]
call sub_402E5C
retn
ºÜÏÔÈ»£¬ºËÐÄÅжÏÔÚcall sub_4041D8ÖС£¸ú½øÈ¥£¬¿´¼ûº¯ÊýÌåÈçÏ¡£Õâ¸öº¯ÊýµÄÇ°°ë²¿·ÖÊÇÔÚ¸ù¾Ý¡°You are big pig.¡±¡¢
¡°1234567¡±ÒÔ¼°×¢²áÉêÇëÂëͨ¹ý¹þÏ£ÔËËã¼ÆËã³ö¼¸¸öÊýÀ´¡£ºó°ë²¿·Ö²ÅÊÇ×îÖµµÃ¹ØÐĵġ£×¢ÊÍÈçÏ£º
sub_4041D8 proc near
var_24 = dword ptr -24h
var_20 = dword ptr -20h
var_1C = dword ptr -1Ch
var_18 = dword ptr -18h
var_14 = dword ptr -14h
var_10 = dword ptr -10h
var_C = dword ptr -0Ch
var_8 = dword ptr -8
var_4 = dword ptr -4
push ebp
mov ebp, esp
add esp, 0FFFFFFDCh
push ebx
push esi
push edi
xor ebx, ebx
mov [ebp+var_14], ebx
mov esi, ecx
lea edi, [ebp+var_10]
movsd
movsd
mov [ebp+var_8], edx
mov [ebp+var_4], eax
mov eax, [ebp+var_4]
call sub_402FC0
xor eax, eax
push ebp
push offset loc_40435F
push dword ptr fs:[eax]
mov fs:[eax], esp
lea eax, [ebp+var_14]
mov edx, offset _str_You_are_big_pig.Text
call sub_402EC4
mov eax, [ebp+var_4]
call unknown_libname_18
and eax, 80000007h
jns short loc_40422A
dec eax
or eax, 0FFFFFFF8h
inc eax
loc_40422A:
test eax, eax
jz short loc_40425A
lea eax, [ebp+var_4]
mov edx, offset _str_1234567.Text
call @System@@LStrCat$qqrv ; System __linkproc__ LStrCat(void)
mov eax, [ebp+var_4]
call unknown_libname_18
test eax, eax
jns short loc_40424A
add eax, 7
loc_40424A:
sar eax, 3
mov edx, eax
shl edx, 3
lea eax, [ebp+var_4]
call @System@@LStrSetLength$qqrv ; System __linkproc__ LStrSetLength(void)
loc_40425A:
xor esi, esi
lea eax, [ebp+var_4]
call sub_402FD0
mov edi, eax
lea eax, [ebp+var_14]
call sub_402FD0
mov ebx, eax
jmp short loc_4042A2
loc_404272:
mov eax, [edi+esi*4]
mov [ebp+var_1C], eax
mov eax, [edi+esi*4+4]
mov [ebp+var_18], eax
mov edx, ebx
lea eax, [ebp+var_1C]
call sub_404170
mov eax, [ebx]
mov [ebx+8], eax
mov eax, [ebx+4]
mov [ebx+0Ch], eax
mov eax, [ebp+var_1C]
mov [ebx], eax
mov eax, [ebp+var_18]
mov [ebx+4], eax
add esi, 2
loc_4042A2:
mov eax, [ebp+var_4]
call unknown_libname_18
test eax, eax
jns short loc_4042B1
add eax, 3
loc_4042B1:
sar eax, 2
cmp esi, eax
jb short loc_404272 //ÒÔÉÏΪǰ°ë²¿·Ö£¬²»ÓÃÇóÄæ
mov eax, [ebp+var_10]
xor edx, edx
push edx //×¢²áÂëµÄµÚÒ»²¿·Öm1µÄ¸ß루ºãΪ0£©
push eax //×¢²áÂëµÄµÚÒ»²¿·Öm1µÄµÍλ
push ds:dword_4050D0 //¼ÓÃÜÃÜÔ¿eµÄ¸ß루0£©
push ds:dword_4050CC //¼ÓÃÜÃÜÔ¿eµÄµÍ루3B442AF9£©
push ds:dword_4050D8 //nµÄ¸ß루0£©
push ds:dword_4050D4 //nµÄµÍ루69AAA0E3£©
call sub_4040B8 //encrypt_decrypt(m1, e, n)
sub eax, 2
mov [ebp+var_24], eax
mov eax, [ebp+var_C]
xor edx, edx
push edx //×¢²áÂëµÄµÚ¶þ²¿·Öm2µÄ¸ß루ºãΪ0£©
push eax //×¢²áÂëµÄµÚ¶þ²¿·Öm2µÄµÍλ
push ds:dword_4050D0 //¼ÓÃÜÃÜÔ¿eµÄ¸ß루0£©
push ds:dword_4050CC //¼ÓÃÜÃÜÔ¿eµÄµÍ루3B442AF9£©
push ds:dword_4050D8 //nµÄ¸ß루0£©
push ds:dword_4050D4 //nµÄµÍ루69AAA0E3£©
call sub_4040B8 //encrypt_decrypt(m2, e, n)
sub eax, 2
mov [ebp+var_20], eax
shl [ebp+var_24], 2 //ÒÆλ
lea ecx, [ebp+var_24]
mov eax, [ecx]
mov edx, [ecx+4]
shrd eax, edx, 2 //ÕâÌõºÍÏÂÃæÒ»ÌõÍê³É64 bit»·ÐÎÒÆλ
shr edx, 2
mov [ecx], eax
mov [ecx+4], edx
mov eax, [ebp+var_24]
cmp eax, [ebp+var_1C] //±È½Ï
jz short loc_404330
xor ebx, ebx
jmp short loc_404341
loc_404330:
mov ax, word ptr [ebp+var_20] //·µ»ØÖµ
and ax, 0FFFFh
mov edx, [ebp+var_8]
mov [edx], ax
or ebx, 0FFFFFFFFh
loc_404341:
xor eax, eax
pop edx
pop ecx
pop ecx
mov fs:[eax], edx
push offset loc_404366
loc_40434E:
lea eax, [ebp+var_14]
call sub_402E5C
lea eax, [ebp+var_4]
call sub_402E5C
retn
¼´ÉÏÃæµÄÁ½¸öcall sub_4040B8·Ö±ðµÈ¼ÛÓÚ
encrypt_decrypt(m1, e, n)
encrypt_decrypt(m2, e, n)
Ö»ÐèÒª°Ñsub_4040B8µÄº¯ÊýÌåºÍÉÏÃæµÄË㷨αÂëÃèÊö¶ÔÕÕһϾÍÃ÷°×ΪʲôµÈ¼ÛÁË£¨×¢ÒâwindowsÓÅ»¯´óʦʹÓõÄÊÇ64
bitµÄÔËË㣬ÿ¸öÊýÒªÓÃÁ½¸ö32 bitµÄÊýÀ´±íʾ£¬Òò´Ë²Ù×÷ÿ¸ö64 bitµÄÊýÖÁÉÙÒªÁ½ÌõÖ¸Á£º
sub_4040B8 proc near
var_8 = dword ptr -8 //¾Ö²¿±äÁ¿cµÄµÍ루cÖн«´æ·Å·µ»ØÖµ£©
var_4 = dword ptr -4 //¾Ö²¿±äÁ¿cµÄ¸ßλ
arg_0 = dword ptr 8 //mµÄµÍ32λ
arg_4 = dword ptr 0Ch //mµÄ¸ß32λ
arg_8 = dword ptr 10h //eµÄµÍ32λ
arg_C = dword ptr 14h //eµÄ¸ß32λ
arg_10 = dword ptr 18h //nµÄµÍ32λ
arg_14 = dword ptr 1Ch //nµÄ¸ß32λ
push ebp
mov ebp, esp
add esp, 0FFFFFFF8h
mov [ebp+var_8], 1 // c = 1;
mov [ebp+var_4], 0
jmp short loc_40414A
loc_4040CE:
push 0
push 2
mov eax, [ebp+arg_8]
mov edx, [ebp+arg_C]
call __LLMOD //b mod 2
cmp edx, 0
jnz short loc_40411B
cmp eax, 0
jnz short loc_40411B
push 0
push 2
mov eax, [ebp+arg_8]
mov edx, [ebp+arg_C]
call __LLDIV // b = b / 2
mov [ebp+arg_8], eax
mov [ebp+arg_C], edx
push [ebp+arg_14]
push [ebp+arg_10]
push [ebp+arg_14]
push [ebp+arg_10]
push [ebp+arg_4]
push [ebp+arg_0]
call sub_404060 // a = (a * a) mod n
mov [ebp+arg_10], eax
mov [ebp+arg_14], edx
jmp short loc_40414A
loc_40411B:
mov eax, [ebp+arg_8]
mov edx, [ebp+arg_C]
sub eax, 1 // b = b - 1
sbb edx, 0
mov [ebp+arg_8], eax
mov [ebp+arg_C], edx
push [ebp+arg_14]
push [ebp+arg_10]
push [ebp+var_4]
push [ebp+var_8]
push [ebp+arg_4]
push [ebp+arg_0]
call sub_404060 //c = (a * c) mod n
mov [ebp+var_8], eax
mov [ebp+var_4], edx
loc_40414A:
cmp [ebp+arg_C], 0 //bµÈÓÚ0Âð£¿
jnz short loc_40415C
cmp [ebp+arg_8], 0
ja loc_4040CE //¼ÌÐøÑ»·
jmp short loc_404162
loc_40415C:
jg loc_4040CE //¼ÌÐøÑ»·
loc_404162:
mov eax, [ebp+var_8] //·µ»ØÖµc
mov edx, [ebp+var_4]
pop ecx
pop ecx
pop ebp
retn 18h
sub_4040B8 endp
ÖÁ´ËÎÒÃÇÒѾ¸ãÇåÆä¼ÓÃÜËã·¨£¬Çҵõ½ÈçϽá¹û£º
e = 0x000000003B442AF9
n = 0x0000000069AAA0E3
ʣϵÄÊÂÇé¾ÍÊǶÔn½øÐÐÒò×ӷֽ⣬д³ö×¢²á»ú.
--------------------------------------------------------------------------------
|