日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DR.com客户端解密过程逆向分析

發布時間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DR.com客户端解密过程逆向分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

DR.com客戶端解密過程逆向分析

說明:

Dr.com Client是城市熱點提供的校園網認證平臺,很多學校都用這個,例如,CQUCQNU等等(不過我們家是用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),返回2n次冪

給出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行,本來是很容易逆向的,但是里面的waitleave指令不懂,自己實現的_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客户端解密过程逆向分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美日韩v | 五十路中出 | 日韩a级在线观看 | 亚洲激情网址 | 黄色国产一级 | 日韩精品播放 | 久精品免费视频 | 最新中文字幕免费 | 精品无码久久久久久久久成人 | 国产精品女教师 | 国产美女免费视频 | 成年人免费在线观看网站 | 日本在线视频一区二区三区 | fexx性欧美 | 国产精品免费一区二区三区四区 | 国产成人资源 | 999精品视频 | www.日韩av | 不卡视频在线观看 | 一区二区视频在线看 | 人人爱人人澡 | 黄色大全免费看 | 日韩一区av在线 | a级黄色网址 | 噜噜噜视频 | 中文字幕一区二区三区免费 | 午夜激情黄色 | 色乱码一区二区三区在线男奴 | 亚洲最大av | 中文字幕av网站 | 色成人免费网站 | 亚洲人免费视频 | 特黄老太婆aa毛毛片 | 久久国产精品精品国产 | 天堂av网站 | 91看片淫黄大片91桃色 | 免费黄色小网站 | 亚洲女则毛耸耸bbw 边吃奶边添下面好爽 | 在线视频观看一区二区 | 国产91热爆ts人妖系列 | 天堂中文8 | 精品免费视频一区二区 | 姝姝窝人体www聚色窝 | 91禁动漫在线 | av无毛| 91九色蝌蚪91por成人 | 中文字幕一级片 | 少妇高潮大叫好爽喷水 | 2022精品国偷自产免费观看 | 欧美精品电影一区二区 | 成年人黄色大全 | 亚洲播放器 | xxx国产在线观看 | 亚洲精品一区在线 | 国产主播第一页 | 大又大又粗又硬又爽少妇毛片 | 亚洲欧美日韩不卡 | av无遮挡 | 亚洲一区二区三区免费视频 | 精品黑人一区二区三区观看时间 | 国产精品久久免费 | 日本免费a级片 | 日韩亚洲一区二区 | 日韩欧美在线视频播放 | 浮妇高潮喷白浆视频 | 亚洲大胆人体 | 探花视频在线版播放免费观看 | 天堂av免费在线观看 | 污污视频在线播放 | 在线看片网址 | 久操视频免费观看 | 日本一级片在线观看 | 一本色道久久88综合日韩精品 | 亚洲影视中文字幕 | 人妻精品一区一区三区蜜桃91 | 日本女优中文字幕 | 亚洲综合图片网 | 成人网免费 | 国产精品久久久久久三级 | 欧美国产在线视频 | 欧美日韩一区二区中文字幕 | 精品一区二区视频在线观看 | 欧美性受xxxx| 粉嫩av在线 | 3d动漫精品啪啪一区二区三区免费 | 亚洲色诱 | 一区二区三区国产视频 | 久久久国产精品视频 | 日韩精品成人免费观看视频 | 亚洲美女综合网 | 亚洲国产一二三 | 丁香花高清视频完整电影 | 日韩av手机在线 | 韩国美女主播跳舞 | 午夜日韩电影 | 日本黄色大片视频 | 四虎影视成人永久免费观看亚洲欧美 | 天天舔夜夜操 | 99热在线播放 |