|
|
|
|
Win32·J½s±Ðµ{¤Q¤@
±z¬O²Ä
345ÓÂsÄýªÌ
·§z ¶iµ{±±¨î²³æªº»¡¬Û·í©ó¦b¤@Óµ{¦¡¤¤°õ¦æ¥t¤@Óµ{¦¡¡A§A¥i¥H§â¥¦·Q¹³¦¨¦b Dos ¤U¥Î int 21h/4bh ¥\¯à¨Ó°õ¦æ¥t¥~¤@Óµ{¦¡¡A¦pªG³æ±q°õ¦æ¥t¤@Óµ{¦¡ªº¥Øªº¨ÓÁ¿¡A¦b Windows ¤¤¦³¤£¤Ö¤èªk¡A¦p¨Ï¥Î ShellExecute µ¥¡A¦ý³o¨Ç Api ¶È¶È¬O¡§°õ¦æ¡¨¦Ó¤w¡A¶iµ{±±¨îªº·N¸q¦b©ó¥i¥H³Ð«Ø¤@Ó¶iµ{¡A¨Ã¥i¥H³q¹L¶iµ{±±¨î½Xµ²§ô¶iµ{¡A¦P¼Ë§A¤]¥i¥H³q¹L¶iµ{±±¨î½X¨Ó¸òÂܵ{¦¡¡AÁÙ¥i¥H¥Î ReadProcessMemory ©M WriteProcessMemory ¨ÓŪ¼g¤l¶iµ{ªº°O¾ÐÅéªÅ¶¡¡C
¶iµ{±±¨în¨Ï¥Îªº¬ÛÃö API ¦³¤U±³o¨Ç¡G
³Ð«Ø¶iµ{ªº¨ç¼Æ¬°CreateProcess¡A¸Ó¨ç¼Æ¤ñ¸û½ÆÂø¡A¦@¦³¤QӰѼơA¦ý¦³Ó¦n®ø®§¬O¨Ï¥Î®É¤j³¡¤À¥i¥H¥Î NULL¡C
BOOL CreateProcess(
LPCTSTR lpApplicationName, // °õ¦æµ{¦¡ÀɮצW
LPTSTR lpCommandLine, // °Ñ¼Æ¦æ
LPSECURITY_ATTRIBUTES lpProcessAttributes, // ¶iµ{¦w¥þ°Ñ¼Æ
LPSECURITY_ATTRIBUTES lpThreadAttributes, // ½uµ{¦w¥þ°Ñ¼Æ
BOOL bInheritHandles, // Ä~©Ó¼Ð°O
DWORD dwCreationFlags, // ³Ð«Ø¼Ð°O
LPVOID lpEnvironment, // Àô¹ÒÅܼÆ
LPCTSTR lpCurrentDirectory, // ¹B¦æ¸Ó¤l¶iµ{ªºªì©l¥Ø¿ý
LPSTARTUPINFO lpStartupInfo, // ³Ð«Ø¸Ó¤l¶iµ{ªº¬ÛÃö°Ñ¼Æ
LPPROCESS_INFORMATION lpProcessInformation // ³Ð«Ø«á¥Î©ó³Q³Ð«Ø¤l¶iµ{ªº¸ê°T
);
¦UӰѼƪº»¡©ú¦p¤U¡G
lpApplicationName¡G¬°°õ¦æµ{¦¡ªºÀɮצW¡A§A¤]¥i¥H§â°õ¦æÀɮצW¥]¬A¦b¤U¤@Ó°Ñ¼Æ lpCommandLine ¤¤¡AµM«á§â¸Ó°Ñ¼Æ¸m¬°NULL¡C
lpCommandLine¡G¬°°Ñ¼Æ¦æ¡A¦pªGµL°Ñ¼Æ¥i¥H¬°NULL¡A¦b¦³°Ñ¼Æ¶Ç»¼µ¹¶iµ{®É¥i¥H¦p¤U³]¸m¡GlpApplicationName=ÀɮצW¡FlpCommandLine=°Ñ¼Æ¡A©ÎªÌ lpApplicationName=NULL¡FlpCommandLine=ÀɮצW + °Ñ¼Æ¡C
lpProcessAttributes¡AlpThreadAttributes¡G¤À§O´yz¤F³Ð«Øªº¶iµ{©M½uµ{¦w¥þÄݩʡA¦pªG¨Ï¥ÎNULLªí¥Ü¨Ï¥ÎÀq»{ªº¦w¥þ´yz¡C
bInheritHandles¡Gªí¥Ü·í«e¶iµ{¤¤ªº¥´¶}ªº±±¨î½X¬O§_¯à°÷³Q³Ð«Øªº¤l¶iµ{©ÒÄ~©Ó¡C
dwCreationFlags¡Gªí¥Ü³Ð«Ø¼Ð°O¡A³q¹L¸Ó¼Ð°O¥i¥H³]¸m¶iµ{ªº³Ð«Øª¬ºA©MÀu¥ý¶¶§Ç§O¡C±`¥Îªº¦³¤U±ªº¼Ð°O¡G
CREATE_NEW_CONSOLE¡G¬°¤l¶iµ{³Ð«Ø¤@Ó·sªº±±¨î»O¡C
CREATE_SUSPENDED¡G¤l¶iµ{¦b³Ð«Ø®É¬°±¾°_ª¬ºA¡C¦pªG«ü©w¤F³oӰѼơA¨º»ò°õ¦æ CreateProcess «á¶iµ{¥u¬O³Q¸Ë¤J°O¾ÐÅé¡A¦ý¤£¬O°¨¤W¶}©l°õ¦æ¡A¦Ó¬O¥²¶·µ¥¥Dµ{§Ç½Õ¥Î ResumeThread «á¤~Ä~Äò°õ¦æ¡C
HIGH_PRIORITY_CLASS/NORMAL_PRIORITY_CLASS¡G°ª/´¶³qÀu¥ý¶¶§Ç§O¡C
lpEnvironment¡Gªí¥Ü¤l¶iµ{©Ò¨Ï¥ÎªºÀô¹ÒÅܼơA¦pªG¬°NULL¡A«hªí¥Ü»P·í«e¶iµ{¨Ï¥Î¬Û¦PªºÀô¹ÒÅܼơC
lpCurrentDirectory¡Gªí¥Ü¤l¶iµ{¹B¦æªºªì©l¥Ø¿ý¡C
lpStartupInfo¡GSTARTUPINFO µ²ºc¡A¥Î©ó¦b³Ð«Ø¤l¶iµ{®É³]¸m¦UºØÄݩʡC
lpProcessInformation¡GPROCESS_INFORMATION µ²ºc¡A¥Î¨Ó¦b¶iµ{³Ð«Ø«á±µ¦¬¬ÛÃö¸ê°T¡A¸Óµ²ºc¥Ñ¨t²Î¶ñ¼g¡C
½Õ¥Î CreateProcess ¨ç¼Æ¦³¤TӰѼƬO¥²»Ýªº¡A¤@¦b lpApplicationName ©Î lpCommandLine «ü©wÀɮצW¡A¤G¬O lpStartupInfo µ²ºc¡A¤T¬O PROCESS_INFORMATION µ²ºc¡A¦]¬° PROCESS_INFORMATION µ²ºcªð¦^¤F¶iµ{«Ø¥ß«áªº±±¨î½X¡A¥H«áªº¤@¤Á¾Þ§@±Nn¥Î¨ì³o¨Çªð¦^ªº±±¨î½X¡A¥¦¬O¥Ñ¨t²Î¶ñ¼gªº¡Aµ²ºc»¡©ú¦p¤U¡G
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess; //¶iµ{±±¨î½X
HANDLE hThread; //¶iµ{ªº¥D½uµ{±±¨î½X
DWORD dwProcessId; //¶iµ{ID
DWORD dwThreadId; //¶iµ{ªº¥D½uµ{ID
} PROCESS_INFORMATION;
¥t¥~ÁÙ¦³¤@ÓÃöÁ䪺µ²ºc STARTUPINFO¡A¸Óµ²ºc©w¸q¦p¤U¡G
typedef struct STARTUPINFO {
DWORD cb; //µ²ºcªø«×
LPTSTR lpReserved; //«O¯d
LPTSTR lpDesktop; //«O¯d
LPTSTR lpTitle; //¦pªG¬°±±¨î»O¶iµ{«h¬°Åã¥Üªº¼ÐÃD
DWORD dwX; //µ¡¤f¦ì¸m
DWORD dwY; //µ¡¤f¦ì¸m
DWORD dwXSize; //µ¡¤f¤j¤p
DWORD dwYSize; //µ¡¤f¤j¤p
DWORD dwXCountChars; //±±¨î»Oµøµ¡¦r¤¸¸¹¼e«×
DWORD dwYCountChars; //±±¨î»Oµøµ¡¦r¤¸¸¹°ª«×
DWORD dwFillAttribute; //±±¨î»Oµøµ¡¶ñ¥R¼Ò¦¡
DWORD dwFlags; //³Ð«Ø¼Ð°O
WORD wShowWindow; //µøµ¡Åã¥Ü¼Ð°O¡A¦p¦PShowWindow¤¤ªº¼Ð°O
WORD cbReserved2; //
LPBYTE lpReserved2; //
HANDLE hStdInput; //¼Ð·Ç¿é¤J±±¨î½X
HANDLE hStdOutput; //¼Ð·Ç¿é¥X±±¨î½X
HANDLE hStdError; //¼Ð·Ç¿ù»~±±¨î½X
} STARTUPINFO, *LPSTARTUPINFO;
µ²ºc¤¤ dwFlags «ü©w¤F¨ä¥Lªº¤@¨ÇÄæ¦ì¬O§_¦³®Ä¡A¦p¡GdwFlags¥]§t STARTF_USESIZE ªí¥ÜdwXSize©MdwYSize¦³®Ä¡A¥]§tSTARTF_USEPOSITIONªí¥ÜdwX©MdwY¦³®Ä¡Aµ¥µ¥¡C¦pªG¤£¬O¦³¯S®íªºn¨D¡A§Ṳ́£¥Î¦Û¤v¥h¶ñ¼g³oÓµ²ºc¡A¥u»Ý¥Î GetStartupInfo Åý Windows ¬°§A¶ñ¼g¦n¤F¡A³o¼Ë¡A«Ø¥ß¤@Ó¶iµ{ªº»y¥y´N¬O¡G
...
stStartUp STARTUPINFO stProcInfo PROCESS_INFORMATION <?>
stProcInfo PROCESS_INFORMATION <?>
...
invoke GetStartupInfo,addr stStartUp
invoke CreateProcess,NULL,addr szFileName,NULL,NULL,NULL,NORMAL_PRIORITY_CLASS,NULL,NULL,offset stStartUp,offset stProcInfo
...
¦pªG¦¨¥\ªº¸Ü¡Aeax ±Nªð¦^«D¹sÈ¡Aª`·Nªð¦^¦b PROCESS_INFORMATION µ²ºc¤¤ªº hProcess¡A¥H«á«Ü¦hªº¾Þ§@³£n¥Î¨ì¥¦¡C
±j¨îµ²§ô¤@Ó¶iµ{ªº API ¬° TerminateProcess
BOOL TerminateProcess(
HANDLE hProcess, // ¶iµ{±±¨î½X
UINT uExitCode // °h¥X¥N½X
);
§A¥i¥H¨Ï¥Î»y¥y invoke TerminateProcess,structProcInfo.hProcess,0 ¨Óµ²§ô¶iµ{¡Anª`·Nªº¬O¦pªG¥i¯àªº¸Ü¡A¾¨¶q¤£n¦bµ{¦¡¤¤±j¨îµ²§ô§Oªº¶iµ{¡A¦]¬°¨Ï¥Î TerminateProcess µ²§ôªº¶iµ{¡A¥¦¸Ë¸üªº dll ¤£¯à³Q¥¿½T¨ø¸ü¡C³o¼Ë¥i¯à·|¤Þ°_¨t²Î¸ê·½ªºµL®Ä¦û¥Î¡C³Ì¦nªº¿ìªk¦b¶iµ{¤¤¦Û¤v¨Ï¥Î ExitProcess °h¥X¡C
¬d¸ß¤@Ó¶iµ{ª¬ºAªº API ¬° GetExitCodeProcess¡C
BOOL GetExitCodeProcess(
HANDLE hProcess, // handle to the process
LPDWORD lpExitCode // address to receive termination status
);
¦pªG¶iµ{©|¥¼°h¥X¡A¨ç¼Æ±N·|ªð¦^STILL_ACTIVE¡C³oÓ API ¬O°¨¤Wªð¦^ªº¡C
µ¥«Ý¶iµ{°õ¦æ¥i¥H¥Î WaitForSingleObject
³oÓ API ¨Ã¤£¬O³æ¥Î©ó¶iµ{ªºµ¥«Ý¡A¨ä¥LÁÙ¥i¥H¥Î½u¤Wµ{µ¥¾Þ§@¡A¦ý§Ṳ́@¯ë¥Î¥¦¨Óµ¥«Ý¶iµ{ªº°õ¦æ¡A¥¦ªº¥Ó©ú¬O¡G
DWORD WaitForSingleObject(
HANDLE hHandle, // handle of object to wait for
DWORD dwMilliseconds // time-out interval in milliseconds
);
¦pªG§ÚÌnµ¥«Ý¶iµ{°õ¦æ 1 ¬íÄÁ¡A¥i¥H invoke WaitForSingleObject,stProcInfo.hProcess,1000 ¦pªGnµ¥¨ì¶iµ{µ²§ô¡A¥i¥H¥Î WaitForSingleObject,stProcInfo.hProcess,INFINITE ¡A°Ñ¼Æ 2 ¤¤ªº INFINITE ¦b Windows.inc ¤¤¦³©w¸q¡A·N«ä¬OµL½aµ¥«Ý¡C
³Ì«á¡A·í¤£¦A¨Ï¥Î¶iµ{±±¨î½Xªº®ÉÔ¡A¤£n§Ñ¤F¨Ï¥Î CloseHandle Ãö³¬ hProcess ©M hThread¡A§_«h·|®ö¶O¨t²Î±±¨î½Xªº¸ê·½¡C
®Ú·½µ{¦¡ - ·J½sì©lÀÉ®×
.386
.model flat, stdcall
option casemap :none ; case sensitive
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include ¼Æ¾Ú
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
include kernel32.inc
include comctl32.inc
include comdlg32.inc
include gdi32.inc
includelib user32.lib
includelib kernel32.lib
includelib comctl32.lib
includelib comdlg32.lib
includelib gdi32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ ¼Æ¾Ú
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DLG_MAIN equ 3000
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ID_BROWSE equ 3001
ID_RUN equ 3002
ID_EXIT equ 3003
ID_TEXT equ 3004
F_RUNNING equ 0001h ;¶iµ{¦b¹B¦æ¤¤
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; ¸ê®Æ¬q
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
stStartUp STARTUPINFO <?>
stProcInfo PROCESS_INFORMATION <?>
stOpenFileName OPENFILENAME <?>
hRunThread dd ?
hInstance dd ?
hWinMain dd ?
hIcon dd ?
szBuffer db 512 dup (?)
dwFlag dd ?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
szExcute db '°õ¦æ(&E)',0 ;«ö¶s¤å¦r
szKill db '²×¤î(&E)',0
szExcuteError db '±Ò°ÊÀ³¥Îµ{¦¡¿ù»~¡I',0
szTitleOpen db "Open executable file...",0
szExt db '*.exe',0
szFilter db 'Excutable Files',0,'*.exe;*.com',0
db 0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; ¥N½X¬q
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
if DEBUG
include Debug.asm
endif
include Win.asm
;********************************************************************
; °õ¦æµ{¦¡¥Îªº½uµ{
; 1. ¥Î CreateProcess «Ø¥ß¶iµ{
; 2. ¥Î WaitForSingleOject µ¥«Ý¶iµ{µ²§ô
;********************************************************************
_RunThread proc uses ebx ecx edx esi edi,\
dwParam WORD
or dwFlag,F_RUNNING
;********************************************************************
; ¨ú®ø¡§°h¥X¡¨«ö¶s¨Ã§â¡§°õ¦æ¡¨«ö¶s§ï¬°¡§¤¤¤î¡¨
;********************************************************************
invoke GetDlgItem,hWinMain,ID_EXIT
invoke EnableWindow,eax,FALSE
invoke SendDlgItemMessage,hWinMain,ID_RUN,WM_SETTEXT,0,offset szKill
;********************************************************************
; °õ¦æÀÉ¡A¦pªG¦¨¥\«hµ¥«Ýµ{¦¡µ²§ô
;********************************************************************
invoke GetStartupInfo,addr stStartUp
invoke CreateProcess,NULL,addr szBuffer,NULL,NULL,\
NULL,NORMAL_PRIORITY_CLASS,NULL,NULL,offset stStartUp,offset stProcInfo
.if eax != 0
invoke WaitForSingleObject,stProcInfo.hProcess,INFINITE
invoke CloseHandle,stProcInfo.hProcess
invoke CloseHandle,stProcInfo.hThread
.else
invoke MessageBox,hWinMain,addr szExcuteError,NULL,MB_OK or MB_ICONERROR
.endif
;********************************************************************
; Enable ¡§°h¥X¡¨«ö¶s¨Ã§â¡§¤¤¤î¡¨«ö¶s§ï¬°¡§°õ¦æ¡¨
;********************************************************************
invoke GetDlgItem,hWinMain,ID_EXIT
invoke EnableWindow,eax,TRUE
invoke SendDlgItemMessage,hWinMain,ID_RUN,WM_SETTEXT,0,offset szExcute
and dwFlag,not F_RUNNING
ret
_RunThread endp
;********************************************************************
; µøµ¡µ{¦¡
;********************************************************************
DialogMainProc proc uses ebx edi esi, \
hWnd WORD,wMsg WORD,wParam:DWORD,lParam:DWORD
mov eax,wMsg
;********************************************************************
.if eax == WM_INITDIALOG
mov eax,hWnd
mov hWinMain,eax
call _Init
;********************************************************************
.elseif eax == WM_CLOSE
invoke EndDialog,hWinMain,NULL
;********************************************************************
.elseif eax == WM_COMMAND
mov eax,wParam
.if ax == ID_BROWSE
call _BrowseFile
call _CheckText
.elseif ax == ID_TEXT
invoke GetDlgItemText,hWinMain,ID_TEXT,addr szBuffer,512
call _CheckText
.elseif ax == ID_RUN
;********************************************************************
; ¦pªG¨S¦³¦b°õ¦æ¤¤(dwFlag ¨S¦³¸m¦ì) «h«Ø¥ß½uµ{¡A½u¤Wµ{¤¤°õ¦æµ{¦¡
; ¦pªG¤w¸g¦b°õ¦æ¤¤¡A«h¥Î TerminateProcess ²×¤î°õ¦æ
;********************************************************************
test dwFlag,F_RUNNING
.if ZERO?
invoke CreateThread,NULL,NULL,offset _RunThread,\
NULL,NULL,offset hRunThread
.else
invoke TerminateProcess,stProcInfo.hProcess,-1
.endif
.elseif ax == ID_EXIT
invoke EndDialog,hWinMain,NULL
.endif
.else
;********************************************************************
; ª`·N¡G¹ï¸Ü¤è¶ôªº®ø®§³B²z«á¡Anªð¦^ TRUE,¹ï¨S¦³³B²zªº®ø®§
; nªð¦^ FALSE
;********************************************************************
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DialogMainProc endp
;********************************************************************
; µ{¦¡¤J¤f
;********************************************************************
start:
invoke InitCommonControls
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset DialogMainProc,0
invoke ExitProcess,NULL
;********************************************************************
_Init proc
invoke _CenterWindow,hWinMain
invoke SendDlgItemMessage,hWinMain,ID_TEXT,EM_LIMITTEXT,512,NULL
invoke GetDlgItem,hWinMain,ID_RUN
invoke EnableWindow,eax,FALSE
ret
_Init endp
;********************************************************************
; ®Ú¾Ú text control ¤¤¦³µL¦r¤¸¨M©w¬O§_±N¡§°õ¦æ¡¨«ö¶s Disable ±¼
;********************************************************************
_CheckText proc
invoke GetDlgItemText,hWinMain,ID_TEXT,addr szBuffer,512
invoke lstrlen,addr szBuffer
.if eax != 0 || (dwFlag & F_RUNNING)
invoke GetDlgItem,hWinMain,ID_RUN
invoke EnableWindow,eax,TRUE
.else
invoke GetDlgItem,hWinMain,ID_RUN
invoke EnableWindow,eax,FALSE
.endif
ret
_CheckText endp
;********************************************************************
_BrowseFile proc
mov stOpenFileName.Flags,OFN_PATHMUSTEXIST or OFN_FILEMUSTEXIST
mov stOpenFileName.lStructSize,SIZEOF stOpenFileName
mov eax,hWinMain
mov stOpenFileName.hwndOwner,eax
mov stOpenFileName.lpstrFilter,offset szFilter ;°ÆÀɦW
mov stOpenFileName.lpstrFile,offset szBuffer ;ÀɮצW½w½Ä
mov stOpenFileName.nMaxFile,512 ;ÀɮצW½w½Äªø«×
mov stOpenFileName.lpstrInitialDir,0
mov stOpenFileName.lpstrTitle,offset szTitleOpen
mov stOpenFileName.lpstrDefExt,offset szExt
invoke GetOpenFileName,offset stOpenFileName
.if eax == FALSE
ret
.endif
invoke SetDlgItemText,hWinMain,ID_TEXT,addr szBuffer
ret
_BrowseFile endp
;********************************************************************
end start
µ{¦¡ªº¤ÀªR©MnÂI
¥»µ{¦¡¦b¨Ï¥Î½Õ¥Î GetOpenFileName ©ÎªÌ¦Û¤v¦b¤å¥»®Ø¤¤¿é¤J°õ¦æÀɮצW¡AµM«á³q¹L CreateProcess «Ø¥ß¶iµ{¡A³Ì«á¥Î WaitForSingleObject µ¥«Ý¶iµ{µ²§ô¡A¦pªG¦b¹ï¸Ü¤è¶ôªº³B²z¹Lµ{¤¤µ¥«Ý·|¾ÉPµ{¦¡¦b¶iµ{ªð¦^«eµLªk¦^À³¡A©Ò¥Hµ{¦¡¤¤¥Î CreateThread «Ø¥ß¤@Ó½uµ{¨Ó¹ê²{³oÓ¹Lµ{¡A·í¤l¹Lµ{ªð¦^ªº®ÉÔ¡A½uµ{µ²§ô¡CdwFlag ¤¤ªº 0 ¦ì¤¸§@¬°¼Ð»x¦ì¤¸¡Aªí¥Ü¬O§_¤l¹Lµ{¦b¹B¦æ¤¤¡A¦pªG³o¤@¦ì¸m 1 ªº¸Ü¡A«ö¤U¡§²×¤î¡¨«ö¶s·|¥Î TerminateProcess ¨Ó±j¨î²×¤î¤l¶iµ{¡C
¹ê¥Î¬ÛÃö·j´M: map nds bus lg cat cx it ati model sm
|

〓¤¤°ê¶Â«ÈÁp·ù¡]CHU¡^〓«e®Ö¤ß¦¨û¡A²{¬°ºaÅA·|û
〓¤¤°ê¶Â«ÈÁp·ù¡]CHU¡^〓ºôµ¸¹q¤lÂø»x¡m¯x°}¡n½s¿è
·°ó§Þ³N¤u§@«Ç
|
|
|
|