DR.com客户端解密过程逆向分析
DR.com客戶端解密過程逆向分析
說明:
Dr.com Client是城市熱點提供的校園網認證平臺,很多學校都用這個,例如,CQU、CQNU等等(不過我們家是用H3Com認證的,有點意思)。
離校前一天晚上三個人在宿舍密謀弄個關于Dr.com的猥瑣東東出來,此破文是那個小東東的前期分析,主要解決如何從Dr.com加密文本中獲得加密字符串后,自己實現解密函數進行解密分析,得到真正的密碼。
此破文僅僅對客戶端進行了跟蹤,因為家里不可能連到網絡中心,所以不涉及任何通信數據包截獲解密的部分.此部分可參考Xfocus上某帖
參考文獻:
Dr.com客戶端認證研究 ???www.xfocus.net/bbs/index.php?act=ST&f=2&t=42694&page=1
探究Dr.COM Client內存顯示明文密碼漏洞??? http://hack.77169.com/HTML/20080723140033.html
Dr.com3.46客戶端密碼文件解密過程 ???????http://bbs.pediy.com/showthread.php?p=440464
此破文大部分參考自《Dr.com3.46客戶端密碼文件解密過程》,此文作者經過我社工后發現:
1、?? 貌似是我老鄉..鄭州人好像..
2、?? 貌似是我師兄、CQU計院研二..
以上均屬社工猜測,可能與實際不符..。
正文:
工具、平臺: WINXP SP1 + OllyICE + IDA + VS2008 + UltraEdit + EditPlus
Dr.com版本號:v3.482,其它版本大致通用
?
主要逆向了三部分,一是找到加密字符串所在文本并打開過程、二是密鑰的生成過程、三是利用密鑰對加密字符串的解密過程..
詳細過程:
因為關于DR.com的解密逆向已經不少了,看了幾篇paper后,大致有了思路,先小跟了下程序,一直跟到了那個要輸入帳號密碼的對話框,因為沒有選擇保存密碼,所以沒有發現文件操作部分..
?大致熟悉初始化過程后,根據DRcom的內存明文顯示密碼問題下手,首先,用OD加載Drcom,搜索引用字符串:
?從這點跟進,終于找到放密碼的內存地址,這個地址是硬編碼,不會變的..
經過分析發現
0x0041DB00是存放帳號的地址;0x41DB1B是存放密碼的地址,在這兩個字符串之間還有一段數據,因為目前用不到就沒解,有興趣的自己嘗試..
?0040CFA5? |.? 8D7424 2C???? lea???? esi, dword ptr [esp+2C]
0040CFA9? |.? BF 00DB4100?? mov???? edi, 0041DB00??????????????????? ;? 20075440
0040CFAE? |.? 8A4424 47???? mov???? al, byte ptr [esp+47]
在這里斷下來,0x0041DB00果真是帳號吧.呵呵
下面提供一種相當猥瑣的方法:
在內存上下斷點,我在0x0041DB00內存位置下內存寫入斷點,當把20075440寫入的時候就會觸發,我大致跟了下,這個帳號是從同目錄下的login2.dat里讀出的..
在0x0041DB00下斷的目的是為了分析讀密碼的文件流操作,如果只想逆向解密那部分,可以直接斷在0x0041DB1B
?
下面單步幾下來到對密碼所在文件操作的部分:
?UINT WINAPI GetSystemDirectory(
? __out? LPTSTR lpBuffer, ? __in?? UINT uSize );lpBuffer裝的是系統路徑,usize為其長度,即eax,后面判斷如果長度為0,就直接退出
0040F917??|>??83C9?FF???????or??????ecx,?FFFFFFFF
0040F91A??|.??BF?00704100???mov?????edi,?00417000????????????????????;??\micsy
0040F91F??|.??33C0??????????xor?????eax,?eax?????????????????????????;??eax清0
0040F921??|.??53????????????push????ebx
0040F922??|.??F2:AE?????????repne???scas?byte?ptr?es:[edi]???????????;??計算0x0041700處字符串長度
0040F924??|.??F7D1??????????not?????ecx??????????????????????????????;??ecx?=?strlen("\micsy");
0040F926??|.??2BF9??????????sub?????edi,?ecx
0040F928??|.??8D5424?48?????lea?????edx,?dword?ptr?[esp+48]??????????;??應該是上面函數getSystemDirectoryA出來的
0040F92C??|.??8BD9??????????mov?????ebx,?ecx
0040F92E??|.??8BF7??????????mov?????esi,?edi
0040F930??|.??83C9?FF???????or??????ecx,?FFFFFFFF
0040F933??|.??8BFA??????????mov?????edi,?edx
0040F935??|.??F2:AE?????????repne???scas?byte?ptr?es:[edi]???????????;??移到系統目錄字符串末尾
0040F937??|.??8BCB??????????mov?????ecx,?ebx
0040F939??|.??4F????????????dec?????edi??????????????????????????????;??把'\0'去掉
0040F93A??|.??C1E9?02???????shr?????ecx,?2
0040F93D??|.??F3:A5?????????rep?????movs?dword?ptr?es:[edi],?dword?p>
0040F93F??|.??8BCB??????????mov?????ecx,?ebx
0040F941??|.??8D5424?48?????lea?????edx,?dword?ptr?[esp+48]
0040F945??|.??83E1?03???????and?????ecx,?3
0040F948??|.??50????????????push????eax??????????????????????????????;?/hTemplateFile?=>?NULL
0040F949??|.??F3:A4?????????rep?????movs?byte?ptr?es:[edi],?byte?ptr>;?|
0040F94B??|.??BF?F86F4100???mov?????edi,?00416FF8????????????????????;?|stem.存放密碼文件的另一半夠變態吧,micsy+sytem就出來了那個放密碼的文件名了
0040F950??|.??83C9?FF???????or??????ecx,?FFFFFFFF????????????????????;?|
0040F953??|.??F2:AE?????????repne???scas?byte?ptr?es:[edi]???????????;?|
0040F955??|.??F7D1??????????not?????ecx??????????????????????????????;?|
0040F957??|.??2BF9??????????sub?????edi,?ecx?????????????????????????;?|
0040F959??|.??50????????????push????eax??????????????????????????????;?|Attributes?=>?0
0040F95A??|.??8BF7??????????mov?????esi,?edi?????????????????????????;?|
0040F95C??|.??8BD9??????????mov?????ebx,?ecx?????????????????????????;?|
0040F95E??|.??8BFA??????????mov?????edi,?edx?????????????????????????;?|
0040F960??|.??83C9?FF???????or??????ecx,?FFFFFFFF????????????????????;?|
0040F963??|.??F2:AE?????????repne???scas?byte?ptr?es:[edi]???????????;?|
0040F965??|.??8BCB??????????mov?????ecx,?ebx?????????????????????????;?|
0040F967??|.??4F????????????dec?????edi??????????????????????????????;?|
0040F968??|.??C1E9?02???????shr?????ecx,?2???????????????????????????;?|
0040F96B??|.??F3:A5?????????rep?????movs?dword?ptr?es:[edi],?dword?p>;?|
0040F96D??|.??8BCB??????????mov?????ecx,?ebx?????????????????????????;?|
0040F96F??|.??8D5424?50?????lea?????edx,?dword?ptr?[esp+50]??????????;?|
0040F973??|.??83E1?03???????and?????ecx,?3???????????????????????????;?|
0040F976??|.??6A?04?????????push????4????????????????????????????????;?|Mode?=?OPEN_ALWAYS
0040F978??|.??F3:A4?????????rep?????movs?byte?ptr?es:[edi],?byte?ptr>;?|
0040F97A??|.??BF?F46F4100???mov?????edi,?00416FF4????????????????????;?|binstem.
0040F97F??|.??83C9?FF???????or??????ecx,?FFFFFFFF????????????????????;?|
0040F982??|.??F2:AE?????????repne???scas?byte?ptr?es:[edi]???????????;?|
0040F984??|.??F7D1??????????not?????ecx??????????????????????????????;?|
0040F986??|.??2BF9??????????sub?????edi,?ecx?????????????????????????;?|
0040F988??|.??50????????????push????eax??????????????????????????????;?|pSecurity?=>?NULL
0040F989??|.??8BF7??????????mov?????esi,?edi?????????????????????????;?|
0040F98B??|.??8BD9??????????mov?????ebx,?ecx?????????????????????????;?|
0040F98D??|.??8BFA??????????mov?????edi,?edx?????????????????????????;?|
0040F98F??|.??83C9?FF???????or??????ecx,?FFFFFFFF????????????????????;?|
0040F992??|.??F2:AE?????????repne???scas?byte?ptr?es:[edi]???????????;?|
0040F994??|.??8BCB??????????mov?????ecx,?ebx?????????????????????????;?|
0040F996??|.??4F????????????dec?????edi??????????????????????????????;?|
0040F997??|.??C1E9?02???????shr?????ecx,?2???????????????????????????;?|
0040F99A??|.??F3:A5?????????rep?????movs?dword?ptr?es:[edi],?dword?p>;?|
0040F99C??|.??8BCB??????????mov?????ecx,?ebx?????????????????????????;?|
0040F99E??|.??50????????????push????eax??????????????????????????????;?|ShareMode?=>?0
0040F99F??|.??83E1?03???????and?????ecx,?3???????????????????????????;?|
0040F9A2??|.??8D4424?5C?????lea?????eax,?dword?ptr?[esp+5C]??????????;?|
0040F9A6??|.??68?00000080???push????80000000?????????????????????????;?|Access?=?GENERIC_READ
0040F9AB??|.??50????????????push????eax??????????????????????????????;?|FileName
0040F9AC??|.??F3:A4?????????rep?????movs?byte?ptr?es:[edi],?byte?ptr>;?|
0040F9AE??|.??FF15?A0204100?call????dword?ptr?[<&KERNEL32.CreateFile>;?\CreateFileA
0040F9B4??|.??8BF0??????????mov?????esi,?eax?????????????????????????;??組合出路徑,然后createfile
0040F9B6??|.??5B????????????pop?????ebx
0040F9B7??|.??83FE?FF???????cmp?????esi,?-1
0040F9BA??|.??75?0B?????????jnz?????short?0040F9C7
?
---------------------------------------------------------------------------------------------------------------------------
以上代碼組合出密碼文件所在路徑!
?以上為三次strlen+strcat得到的字符串.把一些硬編碼連接在一起就組合出了這個路徑,里面存的就是加密后的密碼.
0040F948??|.??50????????????push????eax??????????????????????????????;?/hTemplateFile?=>?NULL
0040F959??|.??50????????????push????eax??????????????????????????????;?|Attributes?=>?0
0040F976??|.??6A?04?????????push????4????????????????????????????????;?|Mode?=?OPEN_ALWAYS
0040F988??|.??50????????????push????eax??????????????????????????????;?|pSecurity?=>?NULL
0040F99E??|.??50????????????push????eax??????????????????????????????;?|ShareMode?=>?0
0040F9A6??|.??68?00000080???push????80000000?????????????????????????;?|Access?=?GENERIC_READ
0040F9AB??|.??50????????????push????eax??????????????????????????????;?|FileName
0040F9AE??|.??FF15?A0204100?call????dword?ptr?[<&KERNEL32.CreateFileA>]?????????????;?\CreateFileA
我把所有的push整合后,出來了CreateFile的調用
HANDLE CreateFile( ? LPCTSTR lpFileName, ??DWORD dwDesiredAccess, ??DWORD dwShareMode, ??LPSECURITY_ATTRIBUTES lpSecurityAttributes, ??DWORD dwCreationDisposition, ??DWORD dwFlagsAndAttributes, ??HANDLE hTemplateFile);
完全符合,參數從右到左壓棧了!
調用最終返回一個文件句柄。
繼續:
?和我們平常寫文件流操作完全一樣,CreatFile后自然開始ReadFile()
判斷返回值eax,如果為0就是調用失敗,函數退出
讀完后CloseHandle(),不說了..
看看ReadFile出來了什么:
?EDX指向esp+8,就是堆棧中的字符串的顯示
?堆棧中的字符串
?
?看一下文件中真是這個字符串么:
打開C:\WINDOWS\system32\micsystem.bin?
果真如此,哈哈!
讀出的內容已經壓棧了,應該是下面那個call的一個參數,call? 00401D00
這個很明顯,解密函數到了!
F7單步進去:?
?
這里是計算密鑰的函數,可惜Dr.com公司接口留的不錯,只是沒有利用,這個函數永遠返回定值:0x75B9,以為它的參數字符串是硬編碼,汗..
但還是跟進去看一下吧:
00401FA0??/$??83EC?08???????sub?????esp,?8
00401FA3??|.??53????????????push????ebx
00401FA4??|.??56????????????push????esi
00401FA5??|.??57????????????push????edi
00401FA6??|.??8B7C24?18?????mov?????edi,?dword?ptr?[esp+18]?????????????????????????;??esp+num;為傳遞的參數的形式.num足夠大就是傳參,小就是局部變量
00401FAA??|.??83C9?FF???????or??????ecx,?FFFFFFFF
00401FAD??|.??33C0??????????xor?????eax,?eax
00401FAF??|.??33DB??????????xor?????ebx,?ebx
00401FB1??|.??33F6??????????xor?????esi,?esi
00401FB3??|.??F2:AE?????????repne???scas?byte?ptr?es:[edi]??????????????????????????;??貌似是把字符串讀進去,然后edi就是字符串末尾,ecx記錄長度
00401FB5??|.??F7D1??????????not?????ecx?????????????????????????????????????????????;??去反
00401FB7??|.??49????????????dec?????ecx?????????????????????????????????????????????;??去掉\0
00401FB8??|.??33FF??????????xor?????edi,?edi
00401FBA??|.??3BCB??????????cmp?????ecx,?ebx
00401FBC??|.??895C24?0C?????mov?????dword?ptr?[esp+C],?ebx
00401FC0??|.??894C24?10?????mov?????dword?ptr?[esp+10],?ecx
00401FC4??|.??7E?56?????????jle?????short?0040201C
00401FC6??|.??55????????????push????ebp
00401FC7??|>??8B4424?1C?????/mov?????eax,?dword?ptr?[esp+1C]????????????????????????;??取常量字符串
00401FCB??|.??56????????????|push????esi????????????????????????????????????????????;??上次除的余數壓棧
00401FCC??|.??0FBE2C07??????|movsx???ebp,?byte?ptr?[edi+eax]????????????????????????;??取字符串的第i個字符
00401FD0??|.??E8?6B000000???|call????00402040???????????????????????????????????????;??eax?=?2^esi
00401FD5??|.??0FAFC5????????|imul????eax,?ebp???????????????????????????????????????;??eax*ebp;ebp為str[i]
00401FD8??|.??8B4C24?14?????|mov?????ecx,?dword?ptr?[esp+14]????????????????????????;??esp+14|18?固定存異或的結果
00401FDC??|.??53????????????|push????ebx????????????????????????????????????????????;??ebx壓棧
00401FDD??|.??33C8??????????|xor?????ecx,?eax???????????????????????????????????????;??ecx與eax亦或
00401FDF??|.??894C24?18?????|mov?????dword?ptr?[esp+18],?ecx????????????????????????;??果真,每次存異或的結果
00401FE3??|.??E8?58000000???|call????00402040???????????????????????????????????????;??eax?=?2^ebx
00401FE8??|.??0FAFC5????????|imul????eax,?ebp???????????????????????????????????????;??eax*ebp;ebp為str[i]
00401FEB??|.??8B5424?18?????|mov?????edx,?dword?ptr?[esp+18]????????????????????????;??取出異或的結果
00401FEF??|.??B9?13000000???|mov?????ecx,?13
00401FF4??|.??33D0??????????|xor?????edx,?eax
00401FF6??|.??8D46?07???????|lea?????eax,?dword?ptr?[esi+7]?????????????????????????;??余數加7?10
00401FF9??|.??895424?18?????|mov?????dword?ptr?[esp+18],?edx
00401FFD??|.??83C4?08???????|add?????esp,?8
00402000??|.??99????????????|cdq
00402001??|.??F7F9??????????|idiv????ecx????????????????????????????????????????????;??eax存值,edx存余數
00402003??|.??8D43?0D???????|lea?????eax,?dword?ptr?[ebx+D]?????????????????????????;??余數+13??13
00402006??|.??B9?17000000???|mov?????ecx,?17
0040200B??|.??8BF2??????????|mov?????esi,?edx???????????????????????????????????????;??esi?=?eax%13h
0040200D??|.??99????????????|cdq
0040200E??|.??F7F9??????????|idiv????ecx
00402010??|.??8B4424?14?????|mov?????eax,?dword?ptr?[esp+14]????????????????????????;??esp+14為strlen
00402014??|.??47????????????|inc?????edi????????????????????????????????????????????;??edi控制循環
00402015??|.??3BF8??????????|cmp?????edi,?eax
00402017??|.??8BDA??????????|mov?????ebx,?edx???????????????????????????????????????;??ebx?=?eax%17h
00402019??|.^?7C?AC?????????\jl??????short?00401FC7
0040201B??|.??5D????????????pop?????ebp
0040201C??|>??8B4424?0C?????mov?????eax,?dword?ptr?[esp+C]
00402020??|.??B9?B9880100???mov?????ecx,?188B9
00402025??|.??35?01890100???xor?????eax,?18901
0040202A??|.??5F????????????pop?????edi
0040202B??|.??99????????????cdq
0040202C??|.??F7F9??????????idiv????ecx
0040202E??|.??5E????????????pop?????esi
0040202F??|.??5B????????????pop?????ebx
00402030??|.??8BC2??????????mov?????eax,?edx
00402032??|.??83C4?08???????add?????esp,?8
00402035??\.??C3????????????retn
上面是我結合其它文章和自己的分析給出的,個別地方注釋是早期留得,有點錯誤.
上面這個函數都比較簡單,里面有個call 0x00402040,這個函數調用更簡單,代碼如下:
00402040??/$??8B4C24?04?????mov?????ecx,?dword?ptr?[esp+4]
00402044??|.??B8?01000000???mov?????eax,?1
00402049??|.??3BC8??????????cmp?????ecx,?eax
0040204B??|.??7C?05?????????jl??????short?00402052
0040204D??|>??03C0??????????/add?????eax,?eax
0040204F??|.??49????????????|dec?????ecx
00402050??|.^?75?FB?????????\jnz?????short?0040204D
00402052??\>??C3????????????retn
還原出來大致是int Fun(int n),返回2的n次冪
給出C實現:
int?Fun(int?num)
{
????if?(num==0)
????{
????????return?1;
????}
????int?sum?=?1;
????for?(int?i=0;i<num;i++)
????{
????????sum?<<=?1;?
????}
????return?sum;
}
對照下即可明白!
加上此函數,就可得到那個得到密鑰的函數
原型
int Decode(char* pch)
C實現:
int?decode(char*?pch)
{
????int?len?=?strlen(pch);
????char?ch;
????int?num?=?0;
????int?si?=?0;
????int?bx?=?0;
????for?(int?i=0;i<len;i++)
????{
????????ch?=?*(pch+i);
????????int?temp?=?Fun(si)*ch;
????????num?^=?temp;
????????temp?=?Fun(bx)*ch;
????????num?^=?temp;
????????si?=?(si+0x07)%0x13;
????????bx?=?(bx+0x0d)%0x17;
????}
????
????return?num;
}
然后綜合分析自己寫個得到密鑰DEMO:
?1?#include?<iostream>
?2?#include?<string.h>
?3?using?namespace?std;
?4?
?5?int?Fun(int?num)
?6?{
?7?????if?(num==0)
?8?????{
?9?????????return?1;
10?????}
11?????int?sum?=?1;
12?????for?(int?i=0;i<num;i++)
13?????{
14?????????sum?<<=?1;?
15?????}
16?????return?sum;
17?}
18?
19?int?decode(char*?pch)
20?{
21?????int?len?=?strlen(pch);
22?????char?ch;
23?????int?num?=?0;
24?????int?si?=?0;
25?????int?bx?=?0;
26?????for?(int?i=0;i<len;i++)
27?????{
28?????????ch?=?*(pch+i);
29?????????int?temp?=?Fun(si)*ch;
30?????????num?^=?temp;
31?????????temp?=?Fun(bx)*ch;
32?????????num?^=?temp;
33?????????si?=?(si+0x07)%0x13;
34?????????bx?=?(bx+0x0d)%0x17;
35?????}
36?????
37?????return?num;
38?}
39?
40?int?main()
41?{
42?????char*?constr?=?"TblRefreshCurMonthServiceUse";
43?????int?num?=?decode(constr);
44?????num?^=?0x18901;
45?????num?%=?0x188B9;
46?
47?????cout<<num<<endl;
48?
49?}
由于參數是個常量字符串,結果自然也是常量:30317
這段代碼明顯在浪費時間..
接著分析:
00401DD0??/$??83EC?74???????sub?????esp,?74
00401DD3??|.??55????????????push????ebp
00401DD4??|.??56????????????push????esi
00401DD5??|.??57????????????push????edi
00401DD6??|.??B9?00020000???mov?????ecx,?200
00401DDB??|.??33C0??????????xor?????eax,?eax
00401DDD??|.??BF?8CC64100???mov?????edi,?0041C68C
00401DE2??|.??F3:AB?????????rep?????stos?dword?ptr?es:[edi]?????????????????????????;??開放緩沖區
00401DE4??|.??68?34444100???push????00414434????????????????????????????????????????;??tblrefreshcurmonthserviceuse
00401DE9??|.??E8?B2010000???call????00401FA0????????????????????????????????????????;??上面那個字符串參數詭異,返回常量75B9
00401DEE??|.??8BBC24?880000>mov?????edi,?dword?ptr?[esp+88]?????????????????????????;??取加密字符串
00401DF5??|.??8BE8??????????mov?????ebp,?eax????????????????????????????????????????;??常量存入ebp;75B9
00401DF7??|.??83C9?FF???????or??????ecx,?FFFFFFFF
00401DFA??|.??33C0??????????xor?????eax,?eax
00401DFC??|.??83C4?04???????add?????esp,?4??????????????????????????????????????????;??彈出字符串指針
00401DFF??|.??8BF0??????????mov?????esi,?eax????????????????????????????????????????;??準備做循環控制變量
00401E01??|.??F2:AE?????????repne???scas?byte?ptr?es:[edi]
00401E03??|.??F7D1??????????not?????ecx
00401E05??|.??49????????????dec?????ecx?????????????????????????????????????????????;??以上幾句為取strlen的固定格式..
00401E06??|.??49????????????dec?????ecx
00401E07??|.??894C24?18?????mov?????dword?ptr?[esp+18],?ecx?????????????????????????;??ecx?=?strlen?-?1;
00401E0B??|.??0F88?98000000?js??????00401EA9
00401E11??|.??8BC5??????????mov?????eax,?ebp
00401E13??|.??33FF??????????xor?????edi,?edi
00401E15??|.??F7D8??????????neg?????eax?????????????????????????????????????????????;??eax取反,并且會影響CF位
00401E17??|.??53????????????push????ebx
00401E18??|.??C74424?10?8CC>mov?????dword?ptr?[esp+10],?0041C68C
00401E20??|.??894424?18?????mov?????dword?ptr?[esp+18],?eax?????????????????????????;??下面應該是解密的循環
00401E24??|>??8B8424?880000>/mov?????eax,?dword?ptr?[esp+88]
00401E2B??|.??8A0406????????|mov?????al,?byte?ptr?[esi+eax]?????????????????????????;??取一個加密字符?esi代表數組下標
00401E2E??|.??0FBED8????????|movsx???ebx,?al????????????????????????????????????????;??ebx放當前字符
00401E31??|.??83FB?20???????|cmp?????ebx,?20????????????????????????????????????????;??是否為空格,以下程序判斷字符是否為可打印字符
00401E34??|.??884434?20?????|mov?????byte?ptr?[esp+esi+20],?al??????????????????????;??一直加堆棧位貌似
00401E38??|.??7C?5B?????????|jl??????short?00401E95
00401E3A??|.??83FB?7E???????|cmp?????ebx,?7E
00401E3D??|.??7F?56?????????|jg??????short?00401E95
00401E3F??|.??03FD??????????|add?????edi,?ebp???????????????????????????????????????;??//edi??edi?=?key×i
00401E41??|.??B9?B9880100???|mov?????ecx,?188B9
00401E46??|.??8BC7??????????|mov?????eax,?edi
00401E48??|.??46????????????|inc?????esi????????????????????????????????????????????;??循環加一
00401E49??|.??99????????????|cdq
00401E4A??|.??F7F9??????????|idiv????ecx
00401E4C??|.??895424?14?????|mov?????dword?ptr?[esp+14],?edx????????????????????????;??保存余數
00401E50??|.??DB4424?14?????|fild????dword?ptr?[esp+14]
00401E54??|.??DC0D?A8234100?|fmul????qword?ptr?[4123A8]
00401E5A??|.??DC0D?A0234100?|fmul????qword?ptr?[4123A0]
00401E60??|.??E8?3BF20000???|call????<jmp.&MSVCRT._ftol>????????????????????????????;??進入浮點數計算
00401E65??|.??8BD0??????????|mov?????edx,?eax???????????????????????????????????????;??把結果放入edx,結果固定是1c么?不是
00401E67??|.??8BC3??????????|mov?????eax,?ebx???????????????????????????????????????;??取出加密字符
00401E69??|.??2BC2??????????|sub?????eax,?edx???????????????????????????????????????;??加密字符與計算結果相減放入eax
00401E6B??|.??B9?5F000000???|mov?????ecx,?5F
00401E70??|.??83E8?20???????|sub?????eax,?20
00401E73??|.??99????????????|cdq
00401E74??|.??F7F9??????????|idiv????ecx????????????????????????????????????????????;??edx?=?(ch[i]-ftoih-20h)%5fh
00401E76??|.??85D2??????????|test????edx,?edx???????????????????????????????????????;??是否除盡
00401E78??|.??7D?02?????????|jge?????short?00401E7C
00401E7A??|.??03D1??????????|add?????edx,?ecx
00401E7C??|>??8B4424?18?????|mov?????eax,?dword?ptr?[esp+18]
00401E80??|.??8B4C24?1C?????|mov?????ecx,?dword?ptr?[esp+1C]
00401E84??|.??03F8??????????|add?????edi,?eax???????????????????????????????????????;??edi-key
00401E86??|.??8B4424?10?????|mov?????eax,?dword?ptr?[esp+10]????????????????????????;??eax存放加密字符
00401E8A??|.??80C2?20???????|add?????dl,?20
00401E8D??|.??4E????????????|dec?????esi
00401E8E??|.??8810??????????|mov?????byte?ptr?[eax],?dl?????????????????????????????;??dl為對應密碼,取出后放在0x41C68C+i
00401E90??|.??40????????????|inc?????eax
00401E91??|.??894424?10?????|mov?????dword?ptr?[esp+10],?eax
00401E95??|>??46????????????|inc?????esi
00401E96??|.??03FD??????????|add?????edi,?ebp
00401E98??|.??3BF1??????????|cmp?????esi,?ecx
00401E9A??|.^?7E?88?????????\jle?????short?00401E24?????????????????????????????????;??判斷解密是否結束
00401E9C??|.??5B????????????pop?????ebx
00401E9D??|.??5F????????????pop?????edi
00401E9E??|.??5E????????????pop?????esi
00401E9F??|.??B8?8CC64100???mov?????eax,?0041C68C
00401EA4??|.??5D????????????pop?????ebp
00401EA5??|.??83C4?74???????add?????esp,?74
00401EA8??|.??C3????????????retn
00401EA9??|>??5F????????????pop?????edi
00401EAA??|.??5E????????????pop?????esi
00401EAB??|.??B8?8CC64100???mov?????eax,?0041C68C
00401EB0??|.??5D????????????pop?????ebp
00401EB1??|.??83C4?74???????add?????esp,?74
00401EB4??\.??C3????????????retn
上面的分析已經比較清楚了,看下這個函數:
00401E50??|.??DB4424?14?????|fild????dword?ptr?[esp+14]
00401E54??|.??DC0D?A8234100?|fmul????qword?ptr?[4123A8]
00401E5A??|.??DC0D?A0234100?|fmul????qword?ptr?[4123A0]
00401E60??|.??E8?3BF20000???|call????<jmp.&MSVCRT._ftol>????????????????????????????;??進入浮點數計算
00401E65??|.??8BD0??????????|mov?????edx,?eax???????????????????????????????????????;??把結果放入edx,結果固定是1c么?不是
_atoi(),是一個系統CRT函數,還是Dr.COM的人懶,傳的參數又是兩個常數,這個_atoi()代碼不超過10行,本來是很容易逆向的,但是里面的wait和leave指令不懂,自己實現的_atoi()結果不對,所以放棄,還是用直接調用系統本身的方法..
?
整個解密過程到此算是逆向的差不多了,自己根據反匯編代碼可以寫出解密函數,還有一種更猥瑣的方法,我正在試驗中,寫個dll遠程注入到ishare_user.exe中,直接調用drcom本身就可以完成一切功能..這個方法配合一些歪門邪道有點用處的..
解密過程代碼:
?1?#include?<iostream>
?2?#include?<string.h>
?3?#include<Windows.h>
?4?using?namespace?std;
?5?
?6?void?Decode(char*?pch)
?7?{
?8?????int?key?=?0x75B9,sum?=0;
?9?????char*?code?=?new?char[1024];
10?????int?len?=?strlen(pch);
11?????for?(int?i=0;i<len;i++)
12?????{
13?????????char?ch?=?pch[i];
14?????????if?(ch>=0x20&&ch<=0x7e)
15?????????{
16?????????????sum?+=?key;
17?????????????
18?????????????int?st0?=?0,dst?=?0;
19?????????????double?d310?=?96.00000000000000;??????????????
20?????????????double?d318?=?9.946586828729721e-06;
21?
22?????????????HINSTANCE?LibHandle;
23?????????????LibHandle=LoadLibrary(L"msvcrt.dll");
24?????????????void*?_ftol;
25?????????????_ftol?=(void*)GetProcAddress(LibHandle,"_ftol");
26?????????????st0?=?sum%0x188B9;
27?????????????__asm
28?????????????{
29?????????????????fild?st0;
30?????????????????fmul?d318;
31?????????????????fmul?d310;
32?????????????????call?_ftol;
33?????????????????mov??dst,eax
34?????????????}
35?????????????dst=(ch-dst-0x20)%0x5f;
36?????????????if(dst<0)??dst=dst+0x5F;
37?????????????code[i]=dst+32;
38?????????}
39?????}
40?????code[len]?=?'\0';
41?????cout<<code<<endl;
42?}
43?
44?int?main()
45?{
46?????char*?pch?=?"Pk-Jf!:_u";
47?????Decode(pch);
48?
49?????return?0;
50?}
?
相關文檔下載:RV-Drcom.rar
?
進一步改進:
目前Dr.com的這個問題就比較尷尬,內存明文顯示密碼,解密過程路人皆知。但是他們公司卻認為這個是本機的問題,問題是相信殺毒軟件可以監控Dr.COM的鏡象還不如相信沒人去反匯編Dr.com呢。
殺毒軟件有N種方法可以阻止進入Dr.com的內存,我們自然就有N+1種方法可以進入Dr.com內存,大不了ring0下把殺軟給干掉,然后讀取那個內存位置,獲得帳號密碼,然后…自己想去吧..
還有個問題,如何解決通用性,各個版本的Dr的那個地址是不一樣的,我的思路是stack callback,就是利用棧回溯到那個具有0x0041C68C特征的調用函數位置,然后再結合靜態代碼分析得到那個指向密碼的指針,Dr.com的那段二進制碼應該差別不大,很好定位特征應該..
?
既然有解密過程,剩下的就是一些猥瑣技巧了..爭取回校前搞定..
?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???????-----------by???? 0x0o
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Time:?? 09.01.20
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
轉載于:https://www.cnblogs.com/ns517/archive/2009/01/21/1379677.html
總結
以上是生活随笔為你收集整理的DR.com客户端解密过程逆向分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DevCon.exe (DevCon C
- 下一篇: java 中break如何跳出多层循环