導航:首頁 > 源碼編譯 > 最新qq加密演算法

最新qq加密演算法

發布時間:2023-01-26 17:13:36

A. QQ空間登陸加密密碼演算法是什麼

QQ空間現在採用的是動態加密,加密結果和驗證碼有密切關系,
也就是說是:密碼+演算法+驗證碼在一起,加密演算法如下:
public static string smethod_0(string s)
{
MD5 mD = MD5.Create();
byte[] bytes = Encoding.ASCII.GetBytes(s);
byte[] array = mD.ComputeHash(bytes);
StringBuilder stringBuilder = new StringBuilder();
byte[] array2 = array;
for (int i = 0; i < array2.Length; i++)
{
byte b = array2[i];
stringBuilder.Append(b.ToString("x").PadLeft(2, '0'));
}
return stringBuilder.ToString().ToUpper();
}
public static byte[] EncyptMD5Bytes(string s)
{
MD5 mD = MD5.Create();
byte[] bytes = Encoding.ASCII.GetBytes(s);
return mD.ComputeHash(bytes);
}
public static string smethod_1(byte[] s)
{
MD5 mD = MD5.Create();
byte[] array = mD.ComputeHash(s);
StringBuilder stringBuilder = new StringBuilder();
byte[] array2 = array;
for (int i = 0; i < array2.Length; i++)
{
byte b = array2[i];
stringBuilder.Append(b.ToString("x").PadLeft(2, '0'));
}
return stringBuilder.ToString().ToUpper();
}
public static string EncryptQQWebMd5(string s)
{
MD5 mD = MD5.Create();
byte[] bytes = Encoding.ASCII.GetBytes(s);
byte[] array = mD.ComputeHash(bytes);
StringBuilder stringBuilder = new StringBuilder();
byte[] array2 = array;
for (int i = 0; i < array2.Length; i++)
{
byte b = array2[i];
stringBuilder.Append("\\x");
stringBuilder.Append(b.ToString("x2"));
}
return stringBuilder.ToString();
}
public static string EncryptOld(string password, string verifyCode)
{
return smethod_0(EncyptMD5_3_16(password) + verifyCode.ToUpper());
}
public static string Encrypt(string qq, string password, string verifyCode)
{
return Encrypt((long)Convert.ToDouble(qq), password, verifyCode);
}
public class ByteBuffer
{
private byte[] byte_0;
public Stream BaseStream;
public ByteBuffer()
{
this.BaseStream = new MemoryStream();
this.byte_0 = new byte[16];
}
public virtual long Seek(int offset, SeekOrigin origin)
{
return this.BaseStream.Seek((long)offset, origin);
}
public bool Peek()
{
return this.BaseStream.Position < this.BaseStream.Length;
}
public byte[] ToByteArray()
{
//long position = this.BaseStream.Position;
//this.BaseStream.Position = 0L;
//byte[] array = new byte[(int)((object)((IntPtr)this.BaseStream.Length))];
//this.BaseStream.Read(array, 0, array.Length);
//this.BaseStream.Position = position;
//return array;
long position = this.BaseStream.Position;
this.BaseStream.Position = 0L;
byte[] buffer = new byte[this.BaseStream.Length];
this.BaseStream.Read(buffer, 0, buffer.Length);
this.BaseStream.Position = position;
return buffer;
}
public void Put(bool value)
{
this.byte_0[0] = value ? ((byte)1) : ((byte)0);
this.BaseStream.Write(this.byte_0, 0, 1);
}
public void Put(byte value)
{
this.BaseStream.WriteByte(value);
}
public void Put(byte[] value)
{
if (value == null)
{
throw new ArgumentNullException("value");
}
this.BaseStream.Write(value, 0, value.Length);
}
public void PutInt(int value)
{
this.PutInt((uint)value);
}
public void PutInt(uint value)
{
this.byte_0[0] = (byte)(value >> 24);
this.byte_0[1] = (byte)(value >> 16);
this.byte_0[2] = (byte)(value >> 8);
this.byte_0[3] = (byte)value;
this.BaseStream.Write(this.byte_0, 0, 4);
}
public void PutInt(int index, uint value)
{
int offset = (int)this.BaseStream.Position;
this.Seek(index, SeekOrigin.Begin);
this.PutInt(value);
this.Seek(offset, SeekOrigin.Begin);
}
public byte Get()
{
return (byte)this.BaseStream.ReadByte();
}
}
public static string Encrypt(long qq, string password, string verifyCode)
{
ByteBuffer byteBuffer = new ByteBuffer();
byteBuffer.Put(EncyptMD5Bytes(password));
byteBuffer.PutInt(0);
byteBuffer.PutInt((uint)qq);
EncryptQQWebMd5(password);
byte[] s = byteBuffer.ToByteArray();
string str = smethod_1(s);
return smethod_0(str + verifyCode.ToUpper());
}

上面的加密演算法,調用方法是:string str = Encrypt(QQ號, QQ密碼, 驗證碼);
加密後的密碼會返回到str中,然後使用返回的密碼進行登錄。
註:QQ空間登錄是採用的GET而不是POST。

B. QQ 網頁登錄密碼加密演算法

你好,這是計算機的一種加密式,建議你去看計算機二級書上就有,電子商務書上也有的,
我學過,但是當時就理解有點困難呢呵呵你自己去找找看看吧,
下載個電子書看也行的呵呵
所謂加密演算法就是指將信息變成密文的計算方法。有的加密演算法就是對信息進行簡單的替換或亂序這種加密演算法最明顯的缺陷就是演算法本身必須保證是安全的現代加密演算法通常都需要密鑰來完成對信息的加密運算,演算法本身可以公開理論上只要保證密鑰的安全就能保證信息的安全。
最早的愷撒密文就是一種簡單的字母替換加密演算法演算法本身非常簡單但同時也是最容易破解的演算法其加密方式就是按照其在英文字母表裡的順序將字母循環移位整個演算法可歸結為下面的公式
f(x)
=
(
x
+
s
)
mod
26
其中x是原文字母s是一個常數例如如果s等於3則字母a就被加密為d,而字母z就被加密為c
這種加密方法雖然簡單但是缺點也是顯而易見的比如明文中字母c出現的次數是5次的話則加密後對應的字母出現的次數也是5次也就是說字母出現的頻率沒有變化。
比如e是英文中最常用的字母那麼給定一個足夠大的密文該文中出現,最多的字母很可能就是e。如果不是那可能是a、i或q。密碼學專家只用十幾個密碼字母就能很快的進行這種統計攻擊。現代加密演算法與這種簡單的字母替換演算法不同的地方在於加密演算法的安全性基於用於加密的密鑰而不是演算法本身對於好的加密演算法即使公開其演算法設計原理也不會對其安全性產生絲毫的影響只要用於加密的密鑰是安全的則被加密的信息也就是安全的

C. QQ密碼是採用什麼加密演算法

由於QQ的密碼是經過128位加密處理的,且不可逆計算。只能由QQ自己的賬號登錄後才可以識別和打開的。

QQ客戶端向伺服器發送一個請求登錄的數據包。伺服器返回登錄令牌。這個令牌是在伺服器端生成的。和客戶端的IP地址,版本信息等數據相關。以後會用到這個令牌去進行其他操作。

QQ客戶端得到登錄令牌之後,就會向伺服器發送一個包含登錄信息的登錄請求,要求登錄。服務順會首先看看客戶端的號碼,守址和版本是否可以在本伺服器上進行登錄。

(3)最新qq加密演算法擴展閱讀:

修改QQ密碼步驟:

1、首先在手機上面登錄到QQ帳號,然後點擊屏幕左上角的頭像。點擊左上角的頭像以後出現側拉菜單,再菜單上面點擊設置。

D. 什麼是TEA演算法

TEA演算法被廣泛地應用於計算機數據加密領域,OICQ的數據安全採用了TEA演算法。本文討論了TEA的演算法的原理及實現,並揭示了QQ中該演算法的應用,本文是靈鑰科技公司(www.panakes.com)在即時通信密碼研究公開的第一篇論文,今後我們將陸續發表相關的論文及相應的產品。

TEA演算法簡介
TEA演算法是由劍橋大學計算機實驗室的DavidWheeler和RogerNeedham於1994年發明.TEA是TinyEncryptionAlgorithm的縮寫。特點是加密速度極快,高速高效,但是抗差分攻擊能力差。

TEA加密演算法是一種分組密碼演算法,其明文密文塊64比特(8位元組),密鑰長度128比特(16位元組)。TEA加密演算法的迭代次數可以改變,建議的迭代次數為32輪,盡管演算法的發明人強調加密16輪就很充分了。兩個TEAFeistel周期算為一輪。圖1示例了TEA一輪的加密流程。

以下示例了TEA的C語言加密演算法,TEA的解密演算法與加密演算法類似。

#defineTEA_ROUNDS0x20
#defineTEA_DELTA0x9E3779B9
#defineTEA_SUM0xE3779B90

voidtiny_encrypt(unsignedlong*constv,unsignedlong*constw,
constunsignedlong*constk)
{
registerunsignedlong
y=v[0],
z=v[1],
a=k[0],
b=k[1],
c=k[2],
d=k[3],
n=TEA_ROUNDS,
sum=0,
delta=TEA_DELTA;

while(n-->0){
sum+=delta;
y+=(z<<4)+a^z+sum^(z>>5)+b;
z+=(y<<4)+c^y+sum^(y>>5)+d;
}
w[0]=y;
w[1]=z;
}

TEA演算法利用的不斷增加的(即源程序中的delta)值作為變化,,就是黃金分割率。它的作用是使得每輪的加密是不同。的准確值可能不太重要。但是在這里,它被初始化為

=0x9e3779b

QQ是如何利用TEA進行加密的?
TEA演算法被廣泛應用於QQ的數據加密中,QQ採用16輪的TEA演算法加密,在這時採取16輪加密時而不採取標準的32輪加密時為了減少驗證伺服器的壓力。QQ在數據加密前採用了密碼學中的常用的填充及交織技術,減少加密數據的相關性,增加破譯者的破解難度。

下表列出了QQ應用TEA演算法幾個方面

序號
應用
相關文件

1
通訊報文的加密/解密

2
消息記錄的加密/解密
MsgEx.db

3
本地消息密碼、首次登錄時間、提示內容驗證密碼
Matrix.db

4
消息備份文件
*.bak

QQ的TEA演算法源程序分析
QQ在進行TEA加密前採用ntohl函數對原文數據和加密密鑰進行了變換,從網路位元組順序轉換位主機位元組順序進行加密後,再通過htonl函數將數據轉換為網路位元組順序的數據。

為什麼要這樣做呢?因為不同的計算機使用不同的位元組順序存儲數據。因此任何從Winsock函數對IP地址和埠號的引用和傳給Winsock函數的IP地址和埠號均時按照網路順序組織的。

為防止分析者分析出QQ是採用TEA加密演算法的,程序的設計者採用了subeax,61C88647h指令,而不採用Addeax9e3779b9h指令。因為分析者只需要判斷9e3779b9h(即是我們前面提的黃金分割率的值)就知道採用了TEA加密演算法。

sub_409A43procnear;CODEXREF:sub_409B8C+AEp
;sub_409B8C+109p...

var_10=dwordptr-10h
var_C=dwordptr-0Ch
var_8=dwordptr-8
var_4=dwordptr-4
arg_0=dwordptr8
arg_4=dwordptr0Ch
arg_8=dwordptr10h

pushebp
movebp,esp
subesp,10h
pushebx
pushesi
movesi,[ebp+arg_0]
pushedi
pushdwordptr[esi];netlong
callntohl
pushdwordptr[esi+4];netlong
movedi,eax;y
callntohl
movebx,eax;z
moveax,[ebp+arg_4]
leaecx,[ebp+var_10]
leaesi,[ebp+var_10]
subeax,ecx
mov[ebp+arg_0],4
mov[ebp+arg_4],eax
jmpshortloc_409A7C
;哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:00409A79
loc_409A79:;CODEXREF:sub_409A43+49j
moveax,[ebp+arg_4]

loc_409A7C:;CODEXREF:sub_409A43+34j
pushdwordptr[eax+esi];netlong
callntohl;對k[0],k[1],k[2],k[3]進行ntohl變化,
mov[esi],eax
addesi,4
dec[ebp+arg_0]
jnzshortloc_409A79

push10h;做十六輪TEA運算
xoreax,eax
popecx

loc_409A93:;CODEXREF:sub_409A43+88j
movedx,ebx
movesi,ebx
shredx,5;z>>5
addedx,[ebp+var_C];z>>5+k[1]
subeax,61C88647h;sum=sum+deltadelta:0x9e3779b9
shlesi,4;z<<4
addesi,[ebp+var_10];z<<4+k[0]
xoredx,esi;(z>>5+k[1])^(z<<4+k[0])
leaesi,[eax+ebx];sum+z
xoredx,esi;(z<<4+k[0])^(sum+z)^(z>>5+k[1])
addedi,edx;y+=(z<<4+k[0])^(sum+z)^(z>>5+k[1])

movedx,edi
movesi,edi
shredx,5;y>>5
addedx,[ebp+var_4];y>>5+k[3]
shlesi,4;y<<4
addesi,[ebp+var_8];y<<4+k[2]
xoredx,esi;(y>>5+k[3])^(y<<4+k[2])
leaesi,[eax+edi];(sum+y)
xoredx,esi;(y<<4+k[2])^(sum+y)^(y>>5+k[3])
addebx,edx;z+=(y<<4+k[2])^(sum+y)^(y>>5+k[3])
dececx
jnzshortloc_409A93

pushedi;hostlong
callhtonl
movesi,[ebp+arg_8]
pushebx;hostlong
mov[esi],eax;加密結果
callhtonl
mov[esi+4],eax;加密結果
popedi
popesi
popebx
leave
retn
sub_409A43endp

結論
作為一種分組加密演算法,TEA加密演算法在其發展的過程中,目前出現了幾種針對TEA演算法設計的缺陷攻擊方法,使得原有的TEA加密演算法變得不安全,在過去的十幾年中,TEA演算法進行了若干次的改進,歷經XTEA,BlockTEA,XXTEA幾個版本。目前最新的演算法是XXTEA。

QQ採用了最初的TEA演算法做其核心的加密演算法,QQ在採用TEA演算法時採用了16輪的加密,其加密復雜度比32輪減了許多。利用TEA演算法的設計缺陷,使得快速破解QQ密碼成為可能。

值得一提的QQ在利用TEA演算法做加密時,採用了交織及隨機填充隨機數的技術,增加了密碼分析者分析難度,從一定程度上保護了信息的安全。

更多信息請訪問www.panakes.com

TEA(Tiny Encryption Algorithm) 是一種優秀的數據加密演算法,雖然它比 DES(Data Encryption Standard) 要簡單得多, 但有很強的抗差分分析能力,加密速度也比 DES 快得多,而且對 64 位數據加密的密鑰長達 128 位,安全性相當好。 下面的程序來自盧開澄《計算機密碼學》(清華大學出版社)。

補充:為了使這段程序更加實用,我將其整理為幾個單元, 分別用於 Delphi 和 C++Builder 。包括對數據流 TMemoryStream 和字元串的加密/解密功能, 對字元串的加密/解密還通過 Base64 編碼/解碼,保持加密後的字元串仍為字元串。

// v[2] : 64bit data, k[4] : 128bit key

void encipher( unsigned long * const v, const unsigned long * const k )
{
register unsigned long y = v[0], z = v[1], sum = 0, delta = 0x9E3779B9,
a = k[0], b = k[1], c = k[2], d = k[3], n = 32;

while ( n-- > 0 )
{
sum += delta;
y += ( z << 4 ) + a ^ z + sum ^ ( z >> 5 ) + b;
z += ( y << 4 ) + c ^ y + sum ^ ( y >> 5 ) + d;
}
v[0] = y;
v[1] = z;
}

void decipher( unsigned long * const v, const unsigned long * const k )
{
register unsigned long y = v[0], z = v[1], sum = 0xC6EF3720, delta = 0x9E3779B9,
a = k[0], b = k[1], c = k[2], d = k[3], n = 32;

// sum = delta << 5, in general sum = delta * n
while ( n-- > 0 )
{
z -= ( y << 4 ) + c ^ y + sum ^ ( y >> 5 ) + d;
y -= ( z << 4 ) + a ^ z + sum ^ ( z >> 5 ) + b;
sum -= delta;
}
v[0] = y;
v[1] = z;
}

E. 求QQ的各種密碼加密演算法。

未有詳細研究過, 不過網頁方式登錄qq時, 加密演算法都寫在js裡面了, 研究相應的js函數應該就可以.

我印象中似乎是先把密碼md5_3處理, 加密出來的字串和驗證碼一起MD5. 而md5_3似乎比較糾結, 並不是單純的進行3次MD5. 具體的你去抓js文件研究吧.

至於可逆不可逆根本就不是關鍵啦. 伺服器端無需對加密串解密的, 直接拿密碼以相同方式加密, 然後比較一下即可.

F. 分析webqq密碼最新的加密方式有哪些

md5加密,是不可逆的,但現在可以通過比較加密後的串來得到密碼,所以一般的做法是先做一次或多次的位移,再做md5加密,這樣相對安全一些。 自己的系統要驗證,也是先將用戶輸入的密碼,做相應的位移,再做md5加密,比較最後結果

G. QQ協議採用什麼加密演算法加密傳送數據採用的是什麼演算法

H. 我想知道QQ這個新版本的動態鍵盤加密技術到底是什麼

這里對QQ存儲在本地的密碼文件做了演算法說明,推薦大家看一看,附近中有源代碼,是MD5循環加密的。。。

正文:

QQ 2005賀歲版登錄口令加密演算法及其源代碼
Binny([email protected]

拿到QQ 2005賀歲版後,發現其加密原理並沒有新的改變,經過跟蹤和分析,編制出暴力破解本地QQ密碼的程序。
QQ密碼在正確登陸後,會將加密的結果保存在用戶目錄的ewh.db文件中,加密採用公開的MD5演算法,通過N次循環以及異或後求反,最終計算出加密的結果,與用戶的ewh.db文件中的密文比較後,發出「輸入密碼與上次成功登錄的密碼不一致,$0A是否到伺服器驗證?」(這條信息在BasicCtrlDll.dll的資源中,$0A在C的格式化中為回車)。根據這個提示,完成本地QQ密碼的暴力破解。
在QQ系統中,「QD」標志代表QQ Data,例如,我們可以在文件User.db或ewh.db中找到這個以QD開頭的數據結構。
一、 ewh.db原始數據
51 44 01 01 03 00 04 03 00 BD AF A8 04 00 00 00
00 2E 06 00 07 03 00 B9 AB B4 10 00 00 00 07 22
AA 96 56 19 A3 9E 82 19 B7 2B BD 2D 34 4A 04 03
00 A9 B5 B2 04 00 00 00 3C A8 93 06
其中,紅色為AST循環次數,蘭色為EWH加密字元串,綠色為UIN QQ號(110340156=0x0693A83C,Intel體系內存中排列順序為:3CA89306)。
二、 ewh.db數據結構
HEX
偏移 DEC
偏移 數據 注釋 變數
標志
0000 1 51 44 QD,QQ Data 數據標志 Flag
0002 3 01 01 保留的數據結構 Reserve
0004 5 03 00 總數據段(Data Sections)的個數 Sections
0006 7 04 第一個數據段(簡稱1S,下同)的類型,可以從0x01到0x0F,04代表本數據沒經過加密處理。 Type1S
0007 8 03 00 1S標志的長度。 LenFlag1S
0009 10 BD AF A8 1S標志(例如AST、UIN、EWH等),是經過簡單的異或並求反計算處理的,此處是AST,可能是Algorithm Shift Times 或Axxx Switch Time,管他的呢! Flag1S
000C 13 04 00 00 00 1S數據的長度 LenData1S
0010 17 00 2E 06 00
= (404992) 1S數據,這里是進行MD5轉換的次數。
這個數據是同計算機的性能有關的,性能越高的計算機,在QQ注冊成功後產生的這個循環控制變數就越大。 Data1S
0014 21 07 2S數據的類型,07代表使用MD5進行加密 Type2S
0015 22 03 00 2S標志的長度 LenFlag2S
0017 24 B9 AB B4 2S標志,此處是EWH,代表本數據段是EWH密碼數據,可能是Encrypt With Hash的縮寫 Flag2S
001A 27 10 00 00 00 2S數據的長度 LenData2S
001E 31 07 22 AA 96
56 19 A3 9E
82 19 B7 2B
BD 2D 34 4A 2S數據,是經過MD5加密計算後產生的數據,當然還要經過異或並求反的計算處理,參考下面程序中的1000B858 行代碼。 Data2S
002E 47 04 3S數據的類型 Type3S
002F 48 03 00 3S標志的長度 LenFlag3S
0031 50 A9 B5 B2 3S標志,此處是UIN,代表本數據段是QQ號碼,可能是:User Identifier Number的縮寫 Flag3S
0034 53 04 00 00 00 3S數據的長度 LenData3S
0038 57 3C A8 93 06 3S數據,3C A8 93 06 = 110340156 Data3S
三、 加密原理
下面VB偽代碼的部分符號引自以上第二點《結構說明》中的變數標志,請注意理解:
Pwd = MD5(Pwd, Len(Pwd))
' Pwd為用戶輸入的密碼,第一輪MD5後,Pwd成為16位位元組長度的MD5串。
XorKey As Long = 0 'XorKey為用於解密的位元組
For k = 1 To Data1S – 1 '因為前面已經做過一輪,所以此處要減一
Pwd = MD5(Pwd, 16)
Next k
XorKey = XorKey And &HFFFF
XorKey = (LenData2S And &HFF) Xor (LenData2S \ 256)
XorKey = &HFF - XorKey '求反
For k = 1 To 16
Pwd(k) = Pwd(k) Xor XorKey
Next k
If Pwd <> Data2S Then
MsgBox "輸入密碼與上次成功登錄的密碼不一致," & vbcrlf & "是否到伺服器驗證?"
End If

通過以上的流程,我真的佩服QQ的設計者,如此巨大的循環量,加上循環次數的隨機性,如果希望產生一個QQ MD5詞典簡直不可能。雖然理論上,可以產生一個MD5字典,但是,這個字典將有1.15E+77*16個位元組之巨,因此,只好根據ewh.db文件提供的數據暴力破解了,不知是不是有更好的方法呢?
不過我的感覺是,循環次數加多了,應該會產生更多的MD5碰撞,不見得是個好事。
還有一種破解思路,也許更加直接,將在後面的文章中詳細探討。但是我只有在有時間做完實驗後才有資格評述,不在本文章的討論范圍內。
四、 破解演算法
重復進行數十萬次MD5加密,會消耗計算機很多時間,如果使用傳統的VB或VC,對於一個密碼的等待時間也是很可觀的(例如使用VB代碼,消耗的時間可能是匯編的400倍),因此,我使用匯編語言來編制低層加密解密演算法,通過MASM32編譯連接,最後用高級語言調用。通過提供演算法動態庫的方式,方便其他有興趣的讀者自己增加豐富的功能。例如增加多線程等,這也將在以後的探討中實現。在此不做深入討論。
附帶的例子為VB和VC調用匯編語言動態庫的例子,VB代碼簡單實現了通過密碼字典進行單線程破解的功能,讀者可以豐富其內容。增加更多的功能。
五、 QQ數據結構分析
下面為動態庫BasicCtrlDll.dll中反匯編的代碼以及代碼分析,主要用於分析EWH.DB中數據結構以及QQ數據解調演算法的問題。另外,這個演算法也可以將User.db中的數據提取出來。深入研究下去,做一個聊天記錄查看器之類的軟體也非難事。

1000B71D B8 AC160110 mov eax,BasicCtr.100116AC
1000B722 E8 89460000 call BasicCtr.1000FDB0
1000B727 83EC 3C sub esp,3C
1000B72A 8B45 08 mov eax,dword ptr ss:[ebp+8] 將數據的開始地址賦給EAX,實際數據為**Data,EAX=*Data
1000B72D 53 push ebx
1000B72E 56 push esi
1000B72F 57 push edi
1000B730 8B30 mov esi,dword ptr ds:[eax] 需要轉換的字元串,EAX指示一個結構,第一個成員為實際的數據指針
1000B732 894D D8 mov dword ptr ss:[ebp-28],ecx 局部變數[ebp-28]保存全局的標志結構,ECX為全局參數地址,在調用本函數時跟入
1000B735 8B46 F8 mov eax,dword ptr ds:[esi-8] 為CString結構中長度的成員,表示總共多少個位元組
1000B738 83F8 06 cmp eax,6 如果長度小於6,則為無效的數據
1000B73B 0F82 81020000 jb BasicCtr.1000B9C2 如果比6小則跳轉退出,說明數據量不夠解調的
1000B741 803E 51 cmp byte ptr ds:[esi],51 是否為 QQ Data 的數據,QD為QQ數據標志
1000B744 0F85 78020000 jnz BasicCtr.1000B9C2
1000B74A 807E 01 44 cmp byte ptr ds:[esi+1],44
1000B74E 0F85 6E020000 jnz BasicCtr.1000B9C2
1000B754 66:8B7E 04 mov di,word ptr ds:[esi+4] 對於EWH來說,為第4+1個位元組,為0003
1000B758 83C6 04 add esi,4 指向數據段(Sections)的個數
1000B75B 46 inc esi
1000B75C 83C0 FA add eax,-6 EAX去掉6個位元組,對於EWH來說,剩下36H個位元組
1000B75F 46 inc esi
1000B760 8945 08 mov dword ptr ss:[ebp+8],eax 指向第一個數據段
1000B763 E8 CE050000 call BasicCtr.1000BD36 在內存(ECX+9C)處開辟一個(100H)位元組的空間,空間地址返回到EAX
1000B768 8365 E0 00 and dword ptr ss:[ebp-20],0 局部變數[ebp-20]清零
1000B76C 0FB7C7 movzx eax,di 轉換到EAX,對於EWH,di=3。表示有3段數據
1000B76F 85C0 test eax,eax
1000B771 8945 B8 mov dword ptr ss:[ebp-48],eax 局部變數[ebp-48]保存數據的段數
1000B774 0F8E 21020000 jle BasicCtr.1000B99B
1000B77A 837D 08 07 cmp dword ptr ss:[ebp+8],7 如果整個長度小於7,則剩下的應該是QQ號了。第一次進入時=36H
1000B77E 0F82 3E020000 jb BasicCtr.1000B9C2 如果剩餘的數據長度小於7則退出
1000B784 8A06 mov al,byte ptr ds:[esi] 第一次進入時,ESI指向第7個數據即數據段的類型,例如 04
1000B786 66:8B4E 01 mov cx,word ptr ds:[esi+1] CX=後一個數據,及數據段標志的長度,例如 0003
1000B78A 46 inc esi
1000B78B 8B55 08 mov edx,dword ptr ss:[ebp+8] 剩餘的數據長度,如36H
1000B78E 836D 08 03 sub dword ptr ss:[ebp+8],3 去掉3個,例如成為33H=51
1000B792 894D C8 mov dword ptr ss:[ebp-38],ecx 局部變數[ebp-38]保存數據段中標志長度
1000B795 0FB7F9 movzx edi,cx EDI為標志長度了
1000B798 46 inc esi
1000B799 8845 E4 mov byte ptr ss:[ebp-1C],al 局部變數[ebp-1C]保存本段的類型
1000B79C 8D4F 04 lea ecx,dword ptr ds:[edi+4] ECX為取得的標志長度再加上4,例如=7
1000B79F 46 inc esi 第一次時,ESI指向第一個數據段的標志欄位了,例如指向BDAFA8,第9個數據開始
1000B7A0 394D 08 cmp dword ptr ss:[ebp+8],ecx 如果剩餘的數據比「標志長度+4」還少,則沒有數據,因此不進行處理
1000B7A3 0F82 19020000 jb BasicCtr.1000B9C2
1000B7A9 8B0C37 mov ecx,dword ptr ds:[edi+esi] 跳過數據段的標志部分,將數據段的長度賦值給ECX。例如[edi+esi]=4
1000B7AC 8D1C37 lea ebx,dword ptr ds:[edi+esi] EBX保存新的指針,指向數據段中數據部分的長度部分,例如,[EBX]=4
1000B7AF 895D C4 mov dword ptr ss:[ebp-3C],ebx 局部變數[ebp-3C]保存數據段中數據部分的長度指針
1000B7B2 8D4C0F 07 lea ecx,dword ptr ds:[edi+ecx+7] 從標志(自身長3,加上4個長度位=7)開始,加上數據長度,為完整數據長度。例如E
1000B7B6 3BCA cmp ecx,edx 如果剩下的數據長度(如36H)不夠,則退出
1000B7B8 894D CC mov dword ptr ss:[ebp-34],ecx 局部變數[ebp-34]保存本數據段的總長度
1000B7BB 0F87 01020000 ja BasicCtr.1000B9C2 如果小於則退出程序
1000B7C1 8365 F0 00 and dword ptr ss:[ebp-10],0 局部變數[ebp-10]清零
1000B7C5 3C 01 cmp al,1 al保存本段的類型,有效的類型是4或7
1000B7C7 74 18 je short BasicCtr.1000B7E1
1000B7C9 3C 02 cmp al,2
1000B7CB 74 14 je short BasicCtr.1000B7E1
1000B7CD 3C 03 cmp al,3
1000B7CF 74 10 je short BasicCtr.1000B7E1
1000B7D1 3C 04 cmp al,4
1000B7D3 74 0C je short BasicCtr.1000B7E1
1000B7D5 3C 05 cmp al,5
1000B7D7 74 08 je short BasicCtr.1000B7E1
1000B7D9 3C 07 cmp al,7
1000B7DB 74 04 je short BasicCtr.1000B7E1
1000B7DD 3C 06 cmp al,6
1000B7DF 75 19 jnz short BasicCtr.1000B7FA
1000B7E1 51 push ecx 為本段的總長度,包括(段類型+標志長度+標志+數據長度+數據),例如,對於密碼段=1AH
1000B7E2 E8 23430000 call <MFC42.operator new>
1000B7E7 FF75 CC push dword ptr ss:[ebp-34] n=[ebp-34],局部變數[ebp-34]保存本數據段的總長度
1000B7EA 8D4E FD lea ecx,dword ptr ds:[esi-3] [esi-3]指向本段的開始(從段類型算起)
1000B7ED 8945 F0 mov dword ptr ss:[ebp-10],eax 局部變數[ebp-10]保存拷貝後的數據
1000B7F0 51 push ecx src
1000B7F1 50 push eax dest
1000B7F2 E8 E5450000 call <MSVCRT.memcpy> memcpy,將本段的整段數據拷貝到新的地方,數據指針保存在局部變數[ebp-10]中
1000B7F7 83C4 10 add esp,10
1000B7FA 8B45 C8 mov eax,dword ptr ss:[ebp-38] 局部變數[ebp-38]保存數據段中標志長度
1000B7FD 33C9 xor ecx,ecx
1000B7FF 32C4 xor al,ah 將低位長度與高位異或,例如3 xor 0=3
1000B801 85FF test edi,edi EDI為標志位的長度
1000B803 76 12 jbe short BasicCtr.1000B817 如果本段沒有段標志,則跳轉
1000B805 8A1431 mov dl,byte ptr ds:[ecx+esi] 開始循環,循環次數為標志的長度。ECX第一次時為0,將第一個數據載入到DL中。
1000B808 32D0 xor dl,al AL為長度的高位和低位的異或,這里為3
1000B80A F6D2 not dl DL=NOT ([數據] xor [數據段標志長度的高位 xor 數據段標志長度的低位])
1000B80C 881431 mov byte ptr ds:[ecx+esi],dl 數據保存在原始的內存中相應的地方
1000B80F 41 inc ecx
1000B810 3BCF cmp ecx,edi
1000B812 72 F1 jb short BasicCtr.1000B805
1000B814 8B5D C4 mov ebx,dword ptr ss:[ebp-3C] 局部變數[ebp-3C]保存數據段中數據部分的長度指針
1000B817 57 push edi EDI為標志位的長度
1000B818 56 push esi ESI為指向解密以後的數據,例如AST
1000B819 8D4D E8 lea ecx,dword ptr ss:[ebp-18] 局部變數[ebp-18]存放強制類型轉換以後的數據指針的指針,例如AST
1000B81C E8 5B430000 call <MFC42.CString::CString> 將解密後的數據變成CString類型。返回的類型放在EAX指示的地址中
1000B821 8365 FC 00 and dword ptr ss:[ebp-4],0 局部變數[ebp-4]清零
1000B825 6A FC push -4
1000B827 58 pop eax EAX=-4=FFFFFFFC
1000B828 8BF3 mov esi,ebx ebx保存數據段中數據部分的長度指針
1000B82A 2BC7 sub eax,edi EAX=EAX-EDI=FFFFFFFC-3=FFFFFFF9
1000B82C 8B1E mov ebx,dword ptr ds:[esi] ebx為數據段中數據部分的長度了
1000B82E 0145 08 add dword ptr ss:[ebp+8],eax 第一次時,[EBP+8]=33。執行後=2C,相當於33H-7H=2CH
1000B831 83C6 04 add esi,4 ESI指向數據段中的數據部分了
1000B834 395D 08 cmp dword ptr ss:[ebp+8],ebx [ebp+8]=2C,ebx=4
1000B837 0F82 6A010000 jb BasicCtr.1000B9A7
1000B83D 807D E4 07 cmp byte ptr ss:[ebp-1C],7 局部變數[ebp-1C]保存本段的類型,4或者7
1000B841 74 06 je short BasicCtr.1000B849
1000B843 807D E4 06 cmp byte ptr ss:[ebp-1C],6 如果類型不為6,則執行1000B862
1000B847 75 19 jnz short BasicCtr.1000B862
1000B849 8AC3 mov al,bl 如果數據段的類型為7,則執行此語句。BL包含本段的長度
1000B84B 33FF xor edi,edi
1000B84D 32C7 xor al,bh al=(長度的低位 xor 長度的高位)
1000B84F 85DB test ebx,ebx
1000B851 76 0F jbe short BasicCtr.1000B862 如果長度為0,則表示沒有密碼
1000B853 8A0C37 mov cl,byte ptr ds:[edi+esi]
1000B856 32C8 xor cl,al
1000B858 F6D1 not cl DL=NOT ([數據] xor [數據段標志長度的高位xor 數據段標志長度的低位])
1000B85A 880C37 mov byte ptr ds:[edi+esi],cl
1000B85D 47 inc edi
1000B85E 3BFB cmp edi,ebx
1000B860 72 F1 jb short BasicCtr.1000B853 循環直到全部數據解調完畢
1000B862 53 push ebx 數據串的長度
1000B863 56 push esi 原始的需要變換的數據
1000B864 8D4D EC lea ecx,dword ptr ss:[ebp-14] 局部變數[ebp-14]存放強制CString類型轉換以後的數據指針的指針,例如DB2E0600
1000B867 E8 10430000 call <MFC42.CString::CString>
1000B86C 8A45 E4 mov al,byte ptr ss:[ebp-1C] 局部變數[ebp-1C]保存本段的類型,4或者7
1000B86F 295D 08 sub dword ptr ss:[ebp+8],ebx 去掉已經處理的數據,執行後[ebp+8]=28H,ebx為數據段中數據部分的長度
1000B872 03F3 add esi,ebx ESI指向下一個數據段的開始部分,ebx保存數據段中數據部分的長度指針
1000B874 33FF xor edi,edi
1000B876 84C0 test al,al 測試本段的類型是否為0
1000B878 C645 FC 01 mov byte ptr ss:[ebp-4],1 局部布爾型變數[ebp-4]=1
1000B87C 0F86 A3010000 jbe BasicCtr.1000BA25 如果本段的數據類型為0,則執行1000BA25後退出
1000B882 3C 07 cmp al,7
1000B884 0F86 B6000000 jbe BasicCtr.1000B940 如果小於等於7,則跳轉到1000B940執行。對於EWH來說就是這樣
1000B88A 3C 08 cmp al,8
1000B88C 0F84 74010000 je BasicCtr.1000BA06 如果數據類型為8,則直接退出。
1000B892 3C 09 cmp al,9
1000B894 74 5D je short BasicCtr.1000B8F3
1000B896 3C 0A cmp al,0A
1000B898 0F85 87010000 jnz BasicCtr.1000BA25
1000B89E 8B4D D8 mov ecx,dword ptr ss:[ebp-28] 當數據類型為A時,執行本程序代碼
1000B8A1 8D45 D4 lea eax,dword ptr ss:[ebp-2C]
1000B8A4 50 push eax
1000B8A5 E8 47FEFFFF call BasicCtr.1000B6F1
1000B8AA 8B45 D4 mov eax,dword ptr ss:[ebp-2C]
1000B8AD FF75 EC push dword ptr ss:[ebp-14]
1000B8B0 8B08 mov ecx,dword ptr ds:[eax]
1000B8B2 53 push ebx
1000B8B3 50 push eax
1000B8B4 FF91 BC000000 call dword ptr ds:[ecx+BC]
1000B8BA 8BD8 mov ebx,eax
1000B8BC 85DB test ebx,ebx
1000B8BE 0F85 12010000 jnz BasicCtr.1000B9D6
1000B8C4 8B45 D4 mov eax,dword ptr ss:[ebp-2C]
1000B8C7 6A 04 push 4
1000B8C9 8945 DC mov dword ptr ss:[ebp-24],eax
1000B8CC 8D45 DC lea eax,dword ptr ss:[ebp-24]
1000B8CF 50 push eax
1000B8D0 8D4D C0 lea ecx,dword ptr ss:[ebp-40]
1000B8D3 E8 A4420000 call <MFC42.CString::CString>
1000B8D8 50 push eax
1000B8D9 8D4D EC lea ecx,dword ptr ss:[ebp-14]
1000B8DC C645 FC 03 mov byte ptr ss:[ebp-4],3
1000B8E0 E8 C3400000 call <MFC42.CString::operator=>
1000B8E5 C645 FC 01 mov byte ptr ss:[ebp-4],1
1000B8E9 8D4D C0 lea ecx,dword ptr ss:[ebp-40]
1000B8EC E8 AB400000 call <MFC42.CString::~CString>
1000B8F1 EB 50 jmp short BasicCtr.1000B943
1000B8F3 8B4D D8 mov ecx,dword ptr ss:[ebp-28] 當數據類型為9時,執行這個操作
1000B8F6 8D45 D0 lea eax,dword ptr ss:[ebp-30]
1000B8F9 50 push eax
1000B8FA E8 4E180000 call BasicCtr.1000D14D
1000B8FF 8B45 D0 mov eax,dword ptr ss:[ebp-30]
1000B902 FF75 EC push dword ptr ss:[ebp-14]
1000B905 8B08 mov ecx,dword ptr ds:[eax]
1000B907 53 push ebx
1000B908 50 push eax
1000B909 FF51 78 call dword ptr ds:[ecx+78]
1000B90C 8BD8 mov ebx,eax
1000B90E 85DB test ebx,ebx
1000B910 0F85 D4000000 jnz BasicCtr.1000B9EA
1000B916 8B45 D0 mov eax,dword ptr ss:[ebp-30]
1000B919 6A 04 push 4
1000B91B 8945 DC mov dword ptr ss:[ebp-24],eax
1000B91E 8D45 DC lea eax,dword ptr ss:[ebp-24]
1000B921 50 push eax
1000B922 8D4D BC lea ecx,dword ptr ss:[ebp-44]
1000B925 E8 52420000 call <MFC42.CString::CString>
1000B92A 50 push eax
1000B92B 8D4D EC lea ecx,dword ptr ss:[ebp-14]
1000B92E C645 FC 02 mov byte ptr ss:[ebp-4],2
1000B932 E8 71400000 call <MFC42.CString::operator=>
1000B937 C645 FC 01 mov byte ptr ss:[ebp-4],1
1000B93B 8D4D BC lea ecx,dword ptr ss:[ebp-44]
1000B93E EB AC jmp short BasicCtr.1000B8EC
1000B940 6A 01 push 1 當數據段的類型<=7時,直接從此處執行
1000B942 5F pop edi
1000B943 8B5D D8 mov ebx,dword ptr ss:[ebp-28] 局部變數[ebp-28]保存全局的標志結構
1000B946 8D45 EC lea eax,dword ptr ss:[ebp-14] 局部變數[ebp-14]存放強制類型轉換以後的數據指針的指針,例如DB2E0600
1000B949 50 push eax EAX存放強制類型轉換以後的數據指針
1000B94A 8D45 E8 lea eax,dword ptr ss:[ebp-18] 局部變數[ebp-18]存放強制類型轉換以後的數據指針的指針,例如AST
1000B94D FF75 E4 push dword ptr ss:[ebp-1C] 局部變數[ebp-1C]中的第一個位元組保存本段的類型,4或者7
1000B950 8BCB mov ecx,ebx
1000B952 50 push eax
1000B953 E8 B4FCFFFF call BasicCtr.1000B60C call 1000B60C(CString,Flag,CString)
1000B958 85FF test edi,edi
1000B95A 74 18 je short BasicCtr.1000B974
1000B95C 8B45 E0 mov eax,dword ptr ss:[ebp-20] 局部變數[ebp-28]第一次為0,為一個計數器
1000B95F 8B4B 64 mov ecx,dword ptr ds:[ebx+64] 存在於標志結構中,為一個全局地址
1000B962 8B55 F0 mov edx,dword ptr ss:[ebp-10] 局部變數[ebp-10]保存拷貝後的數據,即沒有經過處理的。例如040300BDAF……
1000B965 C1E0 02 shl eax,2 EAX=EAX*2
1000B968 891401 mov dword ptr ds:[ecx+eax],edx 將未做解調的原始數據放到全局結構中某個指針指示的內存中
1000B96B 8B4B 78 mov ecx,dword ptr ds:[ebx+78] 存在於標志結構中,為一個全局地址
1000B96E 8B55 CC mov edx,dword ptr ss:[ebp-34] 局部變數[ebp-34]保存本數據段的總長度
1000B971 891401 mov dword ptr ds:[ecx+eax],edx 將數據長度放到全局結構中某個指針指示的內存中
1000B974 8065 FC 00 and byte ptr ss:[ebp-4],0 局部布爾型變數[ebp-4]=0
1000B978 8D4D EC lea ecx,dword ptr ss:[ebp-14]
1000B97B E8 1C400000 call <MFC42.CString::~CString> 清除數據段中的數據部分CString
1000B980 834D FC FF or dword ptr ss:[ebp-4],FFFFFFFF 局部布爾型變數[ebp-4]=-1,為True
1000B984 8D4D E8 lea ecx,dword ptr ss:[ebp-18]
1000B987 E8 10400000 call <MFC42.CString::~CString> 清除數據段中的標志部分CString,例如AST
1000B98C FF45 E0 inc dword ptr ss:[ebp-20] 局部變數[ebp-28]計數器加一
1000B98F 8B45 E0 mov eax,dword ptr ss:[ebp-20]
1000B992 3B45 B8 cmp eax,dword ptr ss:[ebp-48] 局部變數[ebp-48]保存數據的段數
1000B995 0F8C DFFDFFFF jl BasicCtr.1000B77A 循環解調每個數據段
1000B99B 8B45 08 mov eax,dword ptr ss:[ebp+8] 最後剩餘的長度
1000B99E F7D8 neg eax
1000B9A0 1BC0 sbb eax,eax
1000B9A2 83E0 04 and eax,4
1000B9A5 EB 1E jmp short BasicCtr.1000B9C5
1000B9A7 837D F0 00 cmp dword ptr ss:[ebp-10],0
1000B9AB 74 09 je short BasicCtr.1000B9B6
1000B9AD FF75 F0 push dword ptr ss:[ebp-10]
1000B9B0 E8 FF3F0000 call <MFC42.operator delete>
1000B9B5 59 pop ecx
1000B9B6 834D FC FF or dword ptr ss:[ebp-4],FFFFFFFF
1000B9BA 8D4D E8 lea ecx,dword ptr ss:[ebp-18]
1000B9BD E8 DA3F0000 call <MFC42.CString::~CString>
1000B9C2 6A 04 push 4
1000B9C4 58 pop eax
1000B9C5 8B4D F4 mov ecx,dword ptr ss:[ebp-C]
1000B9C8 5F pop edi
1000B9C9 5E pop esi
1000B9CA 5B pop ebx
1000B9CB 64:890D 000000 mov dword ptr fs:[0],ecx
1000B9D2 C9 leave
1000B9D3 C2 0400 retn 4
1000B9D6 837D F0 00 cmp dword ptr ss:[ebp-10],0
1000B9DA 74 09 je short BasicCtr.1000B9E5
1000B9DC FF75 F0 push dword ptr ss:[ebp-10]
1000B9DF E8 D03F0000 call <MFC42.operator delete>
1000B9E4 59 pop ecx
1000B9E5 8B45 D4 mov eax,dword ptr ss:[ebp-2C]
1000B9E8 EB 12 jmp short BasicCtr.1000B9FC
1000B9EA 837D F0 00 cmp dword ptr ss:[ebp-10],0
1000B9EE 74 09 je short BasicCtr.1000B9F9
1000B9F0 FF75 F0 push dword ptr ss:[ebp-10]
1000B9F3 E8 BC3F0000 call <MFC42.operator delete>
1000B9F8 59 pop ecx
1000B9F9 8B45 D0 mov eax,dword ptr ss:[ebp-30]
1000B9FC 8B08 mov ecx,dword ptr ds:[eax]
1000B9FE 50 push eax
1000B9FF FF51 08 call dword ptr ds:[ecx+8]
1000BA02 8BF3 mov esi,ebx
1000BA04 EB 03 jmp short BasicCtr.1000BA09
1000BA06 6A 04 push 4
1000BA08 5E pop esi
1000BA09 8065 FC 00 and byte ptr ss:[ebp-4],0

閱讀全文

與最新qq加密演算法相關的資料

熱點內容
java數據訪問層 瀏覽:181
代碼優化是編譯程序的必要階段 瀏覽:623
程序員那麼可愛孩子還在嗎 瀏覽:513
以下哪些是資料庫編程技術 瀏覽:164
水冷壓縮冷凝機組 瀏覽:177
小米路由器app怎麼加黑名單 瀏覽:433
證券交易2012pdf 瀏覽:208
單線程和多線程編譯 瀏覽:155
游戲被加密了刪不了怎麼辦 瀏覽:475
二建6米的柱子加密多少箍筋 瀏覽:648
怎麼簡單易懂的了解伺服器 瀏覽:356
mcpe怎麼看伺服器地址 瀏覽:994
螢石雲智能鎖添加密碼 瀏覽:503
股票自動化交易編程 瀏覽:471
android自定義窗口 瀏覽:921
工程動力學pdf 瀏覽:179
騰訊的雲伺服器是bgp嗎 瀏覽:945
excel弘編程 瀏覽:912
什麼人不適合做程序員 瀏覽:676
喜購app怎麼樣 瀏覽:804