史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > 應用軟體使用技術文件
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2004-01-10, 10:46 PM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 keymaker原理-INT 3的插入

記得上次問樹袋熊大哥,大哥回答得挺詳細,但我一直想試一試INT 3斷點是如何插入的。經過兩天的折騰,終於弄明白了,不敢獨享,大哥見笑啦。下面是分析:
目標:英語會話精靈2.0(topbar.exe)註冊機
使用工具:IDA4.15,Softice
程序使用upx加殼,有改動!部分資源經過XOR加密(文件尾部)廢話少說,切入正題。
為節省篇幅,只分析其原理:(假設已經知道我們要插入斷點的位址--即已經跟蹤出註冊碼位址)
<1>使用CreateProcessA載入要偵錯的程序topbar.exe,獲得關鍵hThread
循環使用ReadProcessMemory讀取topbar.exe工作位址addr1(47a057),如果此處指令為我們預設指令,則
使用子程序(sub1)修改此處指令為INT 3(CCH),並儲存原指令(5byte)後等待中斷髮生。
sub1 流程
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
dwLength=1Ch
lpBuffer-->PMEMORY_BASIC_INFORMATION(dwLength=1C byte)
lpAddress-->addr1
hProcess-->
invoke VirtualQueryEx,hProcess,lpAddress,lpBuffer,dwLength(Kernel32.lib)

lpflOldProtect-->
flNewProtect=4;
dwSize-->1000h
lpAddress-->47a000
hProcess-->
invoke VirtualProtectEx,hProcess,lpAddress,dwSize,flNewProtect,lpflOldProtect
lpNumberOfBytesWritten=0
nSize=5
lpBuffer-->讀取緩衝
lpBaseAddress-->addr1
hProcess-->
invoke ReadProcessMemory,hProcess,lpBaseAddress,lpBuffer,nSize,lpNumberOfBytesWritten
lpflOldProtect-->
flNewProtect=flOldProtect;
dwSize-->1000h
lpAddress-->47a000
hProcess-->
invoke VirtualProtectEx,hProcess,lpAddress,dwSize,flNewProtect,lpflOldProtect
<2>
&&&&&&&&&&&&&&&&&&&&&&&&&&&
中斷髮生後,由偵錯程序(註冊機)接管,使用GetThreadContext取得topbar.exe的CONTEXT上下文
讀取CONTEXT STRUCT的offset B8h即regEip的值,比較是否程序在此中斷,此時regEip的值應為addr1+1,將regEip
減1,(即恢復IP游標)使用SetThreadContext儲存修改了的CONTEXT結構
游標是恢復了但被修改的指令並沒有恢復,因此下一步就是恢復原來的指令:使用sub2
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
sub2 流程
dwLength=1Ch
lpBuffer-->PMEMORY_BASIC_INFORMATION(dwLength=1C byte)
lpAddress-->addr1
hProcess-->
invoke VirtualQueryEx,hProcess,lpAddress,lpBuffer,dwLength(Kernel32.lib)
lpflOldProtect-->
flNewProtect=4;
dwSize-->1000h
lpAddress-->47a000
hProcess-->
invoke VirtualProtectEx,hProcess,lpAddress,dwSize,flNewProtect,lpflOldProtect
lpNumberOfBytesWritten=0
nSize=5
lpBuffer-->寫緩衝指向儲存好的指令
lpBaseAddress-->addr1
hProcess-->
invoke WriteProcessMemory,hProcess,lpBaseAddress,lpBuffer,nSize,lpNumberOfBytesWritten
lpflOldProtect-->
flNewProtect=flOldProtect;
dwSize-->1000h
lpAddress-->47a000
hProcess-->
invoke VirtualProtectEx,hProcess,lpAddress,dwSize,flNewProtect,lpflOldProtect
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
<3>
現在指令也恢復了,被偵錯程序可以正常執行了,完了嗎,不對,忘了我們要幹什麼啦,好的,
下一步就是讀取註冊碼(假設我們已經知道註冊碼的位置,在此程序中我們修改的指令的上一條指令POP EAX的EAX中存放
有註冊碼,見附源程序片段):
使用GetThreadContext取得topbar.exe的CONTEXT 結構上下文,
lpContext->CONTEXT 結構
ContextFlags=10007h ; CONTEXT_FULL=CONTEXT_CONTROL OR CONTEXT_INTEGER OR CONTEXT_SEGMENTS
invoke GetThreadContext,hThread,lpContext
此時CONTEXT ->B0h即regEax即為註冊碼的位址,將其存入CONTEXT-->B8h,然後使用ReadProcessMemory讀出註冊碼.
CONTEXT STRUCT
ContextFlags DWORD ?
iDr0 DWORD ?
iDr1 DWORD ?
iDr2 DWORD ?
。。。
。。。
regEdx DWORD ?
regEcx DWORD ?
regEax DWORD ? ;offset B0
regEbp DWORD ?
regEip DWORD ? ;offset B8
regCs DWORD ?
regFlag DWORD ?
regEsp DWORD ?
regSs DWORD ?
ExtendedRegisters db MAXIMUM_SUPPORTED_EXTENSION dup(?)
CONTEXT ENDS
××××××××××××××××××
topbar.exe源程序片段:
:0047A048 8B45F4 mov eax, dword ptr [ebp-0C]
:0047A04B 8D55F8 lea edx, dword ptr [ebp-08]
:0047A04E E89DE7F8FF call 004087F0
:0047A053 8B55F8 mov edx, dword ptr [ebp-08]
:0047A056 58 pop eax---》》》註冊碼
:0047A057 E8489EF8FF call 00403EA4
:0047A05C 0F853D010000 jne 0047A19F
:0047A062 6840000400 push 00040040
:0047A067 B908A24700 mov ecx, 0047A208

* Possible StringData Ref from Code Obj ->"successs!"
|
:0047A06C BA18A24700 mov edx, 0047A218
結論:通過上面的分析,現在我就可以寫出自己的註冊機,實際上我已經寫了。使用的就是看雪學院下載的win32asm教程第28-29篇的debug篇的一個小程序(只需稍加改動,加入我的程式碼即可)當然,要想向樹袋熊大哥一樣寫出那麼漂亮的界面,那得下一翻大功夫.
如有想試牛刀者,Eamil to me softdim@vip.sina.com,英語會話精靈2.0(topbar.exe)及其註冊機文件都不大,是一個很好的學習例子。
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
 



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用

相似的主題
主題 主題作者 討論區 回覆 最後發表
程式 - 1A 2B 的遊戲 getter 程式語言討論區 0 2006-06-13 04:22 PM
"C之詭譎"C語言之精華總結! psac 應用軟體使用技術文件 0 2006-05-08 11:28 AM
DEBUG主要指令詳解 psac 程式 & 網頁設計技術文件 0 2006-01-26 06:55 PM
可以直接將APE轉為MP3的LAME psac 多媒體影音轉檔燒錄技術文件 0 2004-03-29 05:11 AM
請教關於VirtualDubMod 插件的logo怎麼用 psac 繪圖軟體應用技術文件 0 2004-03-09 01:42 PM


所有時間均為台北時間。現在的時間是 07:32 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1