下沙论坛

 找回密码
 注册论坛(EC通行证)

用新浪微博连接

一步搞定

QQ登录

QQ登录

下沙大学生网QQ群8(千人群)
群号:6490324 ,验证:下沙大学生网。
用手机发布本地信息严禁群发,各种宣传贴请发表在下沙信息版块有问必答,欢迎提问 提升会员等级,助你宣传
新会员必读 大学生的论坛下沙新生必读下沙币获得方法及使用
查看: 5525|回复: 6
打印 上一主题 下一主题

[转帖]2000/xp下读硬盘序列号[汇编]

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2003-11-2 18:09:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我可没这个水平 , Q' t* i+ n7 d7 C.686p 6 G; N/ u. h1 W r) F- V% M.model flat, stdcall 8 y# ^5 G8 @* eoption casemap :none ; case sensitive! o2 e, r% j7 u* F ; ######################################################################### 1 e7 \' x% ]7 ], t$ {6 I# Oinclude \masm32\include\windows.inc ! Y4 q" I) l1 l1 f8 S0 m+ Jinclude \masm32\include\user32.inc( t# T! A2 f$ Q% @0 D# Q0 M include \masm32\include\kernel32.inc7 I0 O3 E( X7 ]2 Y' }) R1 k include \masm32\include\advapi32.inc 1 H/ y$ R k) {" p. N# ^+ } 4 \) A) h: `" F4 ?8 A; x' T0 aincludelib \masm32\lib\user32.lib ( h0 G- N/ J! @, kincludelib \masm32\lib\kernel32.lib) j4 w8 C& Y5 W, m7 j6 [- \! E4 ` includelib \masm32\lib\advapi32.lib1 x: Y3 c# _% N% q( O2 D# }; F( [2 d DEBUG = TRUE # S! Y0 v* L- G1 j& L- i3 b2 O* y% q! X. G$ k- y0 A HMODULE typedef dword- \. @' f8 W4 c) h8 ] NTSTATUS typedef dword- v/ C) R [. y+ ]$ h: h PACL typedef dword. f j3 p3 v0 K# W PSECURITY_DESCRIPTOR typedef dword0 Q" g& D2 S" F/ |/ G6 A' h 4 W, q1 Z/ V0 E! i6 @5 hOBJ_INHERIT=2 # G6 v7 d. @' f+ U5 o! P+ gOBJ_PERMANENT=10h2 j6 u! o) q* i2 e OBJ_EXCLUSIVE=20h * k7 Q; r8 g; ~7 U4 g% EOBJ_CASE_INSENSITIVE=40h 3 ?& x% V& N2 u4 x OBJ_OPENIF=80h u& Y5 i+ r' ^7 i OBJ_OPENLINK =100h ( k- U, x% N1 o" e OBJ_KERNEL_HANDLE=200 1 C3 g/ J. b6 o, i! d& k OBJ_VALID_ATTRIBUTES=3F2h 7 d' z2 k8 b6 t 6 J, [& b! I) `% j* u2 t& pSE_KERNEL_OBJECT = 6 8 Z0 d; E" V' R9 KGRANT_ACCESS =1: g. ~7 H# s( G- Z NO_INHERITANCE =0 ; x0 S2 [% U; |9 }+ [* ?TRUSTEE_IS_NAME=13 \1 X$ N1 D0 B& o4 u7 Q7 s2 T1 b TRUSTEE_IS_USER=1& N; p* |# n, J! w2 e9 W STATUS_SUCCESS =0 ' j" s, q3 I5 }STATUS_ACCESS_DENIED =0C0000022h ! g4 Y8 N/ A3 F7 R6 z ( {# M9 y$ r& D! K/ iSTATUS_ACCESS_VIOLATION equ 0C0000005h : B; E9 A& t# h" o6 RSTATUS_INFO_LENGTH_MISMATCH equ 0C0000004h 4 f9 v3 i, `3 d- ~9 F* {SystemModuleInformation equ 11 $ Y3 L* R+ w& X7 X! ePVOID TYPEDEF DWORD" y. Y9 \7 P/ O' A/ r5 f4 c) w# |3 K UNLONG TYPEDEF DWORD 8 \6 i$ V, x8 R& s( bCHAR TYPEDEF BYTE 6 v ~- o! t% p5 t2 r: V& @8 S( D2 {2 \ UNICODE_STRING struct , D2 N% Z/ y; O5 R5 A& S! x) z nLength word ? 3 @* l8 f! G% |% S( b# d MaximumLength word ? 6 z" P8 e9 D, I8 Z, Y3 d Buffer dword ? % V% s! I+ ]( @ k UNICODE_STRING ends$ `# t7 G: n7 C. C( O 9 A- [$ }7 Z" _! x/ ^4 G# p OBJECT_ATTRIBUTES struct . g/ B6 M8 a8 |4 c& ?) t nLength dword ? 8 u' N, Y+ ^& j& C9 `7 q( k$ } RootDirectory HANDLE ? $ E6 R n; `8 e& I ObjectName dword ?UNICODE_STRING ' B# ]) }3 h, `" M( _8 r Attributes dword ?; " l) b# e2 j4 A SecurityDescriptor dword ?; PVOID // Points to type SECURITY_DESCRIPTOR 9 X3 f/ N) y" j SecurityQualityOfService dword ?VOID // Points to type SECURITY_QUALITY_OF_SERVICE 8 J, O; S# @, y' w- c' a OBJECT_ATTRIBUTES ends 8 N) x' X9 A1 l b! k, S ) q* t5 G4 A7 R( _ 5 ^) C/ a! [/ V* c$ G0 s5 @TRUSTEE struct 9 {0 h$ \/ x1 B, m' N& y9 m pMultipleTrustee dword ?TRUSTEE 3 {8 F! p0 M2 B) h MultipleTrusteeOperation dword ?; MULTIPLE_TRUSTEE_OPERATION % U7 }2 o* `+ n$ [( k! K8 W TrusteeForm dword ?;TRUSTEE_FORM , B$ P% Y3 G1 | TrusteeType dword ?;TRUSTEE_TYPE 7 g3 K6 q, s/ G5 P; e ptstrName dword ?;LPTSTR / {3 H9 x# S9 S TRUSTEE ends: G* s6 S. l9 y; m( P# _4 N 4 I) I8 @4 ]" f9 o" \ + Z1 w# S' M/ U( L) a( l1 B5 I% n: | EXPLICIT_ACCESS struct6 S h( o# t9 E, n) z grfAccessPermissions DWORD ? 4 |. D: R/ h6 @5 h grfAccessMode dword ? ;ACCESS_MODE 9 t& K; e1 N- r5 j# k" Q! O grfInheritance DWORD ? ;# x: J' X3 m% `, P- ` Trustee TRUSTEE <> ; & \' t5 X/ a y( w" xEXPLICIT_ACCESS ends $ h7 C- n# |9 e1 z6 |; s% u' [5 t8 C8 w/ ?2 S3 u MyGATE struct ;门结构类型定义 7 z9 D( a3 Q4 p; ` OFFSETL WORD ? ;32位偏移的低16位( H$ A1 j3 `9 j- R* j SELECTOR WORd ? ;选择子2 d R; w' d2 d1 L DCOUNT BYTE ? ;双字计数字段 6 [/ L8 E2 H$ a GTYPE BYTE ? ;类型4 C7 C# ]" _1 a+ o. I9 b7 e OFFSETH WORD ? ;32位偏移的高16位 " e! j% j" O# y9 IMyGATE ends 8 a& L- l& M4 W2 n, C9 G+ n L, ]& \2 S8 ?# ZIDEINFO struct U4 `8 K' D. b" ~$ m3 `wGenConfig dw ?7 T: h7 |, C' M7 E) r wNumCyls dw ?;拄面数 . C6 }- B' k# u+ P7 TwReserved dw ?/ S8 A+ X. s( w. r7 G) b wNumHeads dw ?;磁头数 " [2 o! U2 e% \/ XwBytesPerTrack dw ?;每道字节数" q7 n. y) I4 G) f4 s, |% u; E wBytesPerSector dw ?;每扇区字节数 4 u4 ]- x9 f' A, swSectorsPerTrack dw ?;每道山区数0 A& y2 V* L. I3 }: G/ `: v wVendorUnique dw 3 dup (?) ( e t; e: w' f1 b1 UsSerialNumber db 20 dup (?);硬盘序列号 3 ~ x+ b: i9 n8 s1 QwBufferType dw ?;7 Z7 n: ?9 q$ k" m! L5 p; x1 g wBufferSize dw ?; ;n * 5127 Y* Z" ~9 T8 O! \) L" f1 @ s$ P wECCSize dw ? : @6 V, b+ O+ b6 D# q" h+ jsFirmwareRev db 8 dup (?); * X/ ] o- i, h. k& H- d% W" bsModelNumber db 40 dup (?)- D$ {3 ]0 H; l1 S- O6 T wMoreVendorUnique dw ?2 G' _: o, ^3 N; k* W wDoubleWordIO dw ?4 _0 y8 |; C M7 d, u, @: Y wCapabilities dw ? $ E7 W/ `! L% q4 b1 JwReserved1 dw ?$ e V! w3 J5 _& S; E- v wPIOTiming dw ?; 3 N6 m8 ]- \. X7 m. UwDMATiming dw ?;+ [- g3 G/ @; B% J& {1 _! j8 {# l wBS dw ?( N3 z; |- G# F, z; `$ z6 ~ wNumCurrentCyls dw ?; 3 Z7 S# A/ ~$ Y" |8 c7 ]wNumCurrentHeads dw ?;: v. j$ G$ X3 Y4 E" s9 q9 D- ~. d wNumCurrentSectorsPerTrack dw ?;3 Q5 f# \' Y/ ~- [ dwCurrentSectorCapacity dd ?; - v+ q- W: L5 X2 @& J# ^wMultSectorStuff dw ?;) L+ K: U6 ~' d: X% q dwTotalAddressableSectors dd ?;6 V8 i* p6 G3 z6 _ wSingleWordDMA dw ?; $ V- v8 b3 \1 B+ {4 mwMultiWordDMA dw ?; 0 p! T6 [. Z9 r4 ~bReserved db 128 dup (?) . N% e; K4 r& PIDEINFO ends, \. L4 T: Z) @: @( q$ U & \. ~# T- a" ]$ H* B) q ' N0 `- P! h; d9 K8 d E& ^- {8 GSetPhyscialMemorySectionCanBeWrited proto :dword" l. W9 x, R) l0 m MiniMmGetPhysicalAddress proto :dword: C8 h+ Y& u7 i' ?) R1 R: L# Q' ~ `& \. \1 k" o. @6 ?5 d2 H% @ENTERRING0 macro* Q: `+ Q2 Q( A% L) k* ~& V pushad ; D- {: z: m& P: ^& t pushfd ! U! O5 e2 E" d; }' Tcli & Y4 w9 Y, G5 Xmov eax,cr0 ;get rid off readonly protect 2 I5 R9 J7 W4 q ?9 W/ iand eax,0fffeffffh% u8 b# v* k. H! J" y; F i7 r mov cr0,eax- {0 e! f% t! I1 }' [: n0 T5 A% V endm$ i8 m& V+ t3 t/ O! J 7 h* [ o6 ~, \7 S3 J0 Y LEAVERING0 macro. }/ Q$ S, @! P1 l7 s mov eax,cr0 ;restore readonly protect 6 f; m: d! G) v9 \, j8 l4 Kor eax,10000h0 e0 E, N Z, u \4 y mov cr0,eax + y& q3 s/ E# I- y" Osti2 A' U: N7 z9 z- g4 B# e" Y- R popfd & L& i( b5 n4 m: C4 M6 X+ rpopad 9 T* t; I8 l* w2 O$ x7 x8 v, V6 Zretf& F+ A9 v" }, r1 K8 A9 y$ t endm 3 t( Y1 a- o6 x; y- w! \4 s+ _+ n& _1 z* t - t5 V w5 D3 V' {2 m W _ UNICODE_STR macro str % d- P5 v7 o/ _$ x3 ?. A! n" |irpc _c,<str>. E4 K- u3 {9 z( S9 J db '&_c'9 L" a9 O' \4 D3 [, ~# p db 0 2 L6 z0 e+ r$ M+ d; {endm + u. e; Z4 ^) R6 `% U' d" t4 v, Lendm a2 z4 m% ~' U/ M0 F) h ' l J( V" ^5 m; R# J.data? ' o! G& O* p3 qGdtLimit dw ? : i! c+ }- d/ N! Y6 r5 ?7 X3 W' A" AGdtAddr dd ? * ?+ {# {: Q4 Y) y8 N* n $ X7 a1 A* T2 s" v% m- z# ?mapAddr dd ? 3 D9 L9 r( {0 d) GOldEsp dd ?8 k. B" m+ F/ ^# {& d! U/ T6 u( \ & v" j' e; O3 Z% Z, j1 X0 y, v readed dw ? 9 k/ m$ J3 W8 b1 U; ?buffer db 512 dup(?): V6 g X' l) {/ T+ s6 P ShowText db 512*3 dup (?) 2 r4 W) f! b" S, S+ }2 g2 W6 A: T' Q% P; f, m szBuffer db 1024 dup (?)4 o* ~) F* {# _! X+ n$ G szModelNumber db 41 dup (?)' ^3 S4 J, \4 d6 s szSerialNumber db 21 dup (?)2 a* ?% b' l0 f1 s* M szFirmwareRev db 9 dup (?), d. W: {& `6 t: U / E1 ~; j1 V5 x+ r0 Z" ?6 C8 i stIDEINFO IDEINFO # H1 |: J# ]/ }1 q! \ 3 B& a- P1 X0 |+ s! g% `.data. X) P0 D) V) o4 `* f; n align 4' P& N5 C7 W9 s+ Y1 E objname dw objnamestr_size,objnamestr_size+2- t- x4 o) Y2 `% q* l, S# i objnameptr dd 0 3 V" y5 {; @( j; h, m, l$ f" Iobjnamestr equ this byte/ ^4 p# f5 M' j/ i' _ UNICODE_STR <\Device\PhysicalMemory> $ {) c# Z& D: b8 v) f' Z. {objnamestr_size equ $-objnamestr" k$ G8 Z" \; O( S * \: J$ B1 {1 W. JszTitle db 'IDE 硬盘信息',0 , o6 L) [- w3 r2 tszErrInfo db '无法读取硬盘信息',0 8 S; U4 R. o9 ZszIDEInfo db '柱面数 : %d',0dh,0ah ( D$ P1 R0 K/ k8 K" o6 E9 B db '磁头数 : %d',0dh,0ah ) T) t7 T/ m9 E! @5 i9 t db '每道扇区数 : %d',0dh,0ah2 ~/ F# _4 v' V/ H" ^5 q6 q# o( \ db '缓冲大小 : %d 扇区',0dh,0ah6 L( m, I3 ~" n( b$ {$ |+ L- K' f db '硬盘型号 : %40s',0dh,0ah$ w* c) b6 l7 x% ]" G& u9 J db '序列号 : %20s',0dh,0ah $ M/ a7 m: V5 U1 | db '版本号 : %8s',0 . {% L/ a5 I! t# G4 n5 P6 v- ` : b% U: ^) B& Y$ P3 m) j- }8 W& F, nalign 4) d, F8 r ^$ \/ q- K. l ObjAttr db 24 dup (0)# G7 l& H- E% a+ ?4 {- k7 S/ ]5 D, {* k $ ]& I6 M+ \3 m& b, m" h2 A; zCallgt dq 0 ;call gate's selff. B, {) N7 r& h' C Caption db 'Windows XP绝对磁盘读写',0$ K, y4 `6 G# ?2 h m. a$ T1 @ Digit db '0123456789ABCDEF',0 - N6 X) F; i: t4 ?! ^.code7 d @0 G( G( F4 g _ShowBuffer proc ;显示所读出的信息 ' w5 U$ J! e6 P( g5 m: r ;把数据转换成16进制的形式7 V, {1 Y' V! A4 p7 B mov [readed],512 & K2 F) D: w9 w3 K5 `! x Z7 a% y mov esi,offset buffer ;数据4 k; v7 @ Y+ g' a1 X7 _1 c mov edi,offset ShowText ;转换后的数据 & D3 @6 g# B8 B( j8 w% M0 F! [ mov ebx,offset Digit. F) e o' t- H+ r4 ]' B xor ecx,ecx ) l1 ^! f+ ?7 A# z6 y5 n* k xor eax,eax2 g4 e7 M" b2 X& K computeAgain:; n' y( a0 l5 i8 b6 ^; A( W7 @ p% B; _ cmp [readed],01 o) z) X3 N1 l2 H4 G jz endCompute # \ b, d* e, t6 b dec [readed] 5 n M; z- z4 x lodsb : i3 c9 W2 R6 W5 a& C push eax . E7 W! ^0 m4 n. t shr eax,4 ;高4位4 B1 A/ o+ J5 R$ ]6 e xlatb 0 b1 A2 b7 x/ G- r% i( t3 e$ e5 I stosb + p( b u. f/ |' s( T' m% ~ pop eax5 @- h) g# n( B: t1 b8 G$ R. k7 s: p and eax,0fH ;低4位' X3 c/ X% C9 ~8 R! H8 {- p) ?& q! s xlatb- d& U( L: V5 v3 I6 L8 C2 v- B+ f stosb - \1 l9 X- r# J+ U5 b/ p( ^" _ mov byte ptr[edi],' ' ;空格1 W h* E: i! J! ]0 y$ p inc edi ; \* b$ M! f( T+ G inc ecx : m" U% R6 ?5 S2 p6 B cmp ecx,16 5 d% Q# u- G3 S+ y jnz computeAgain& ]1 E/ u4 l! C; @6 w# [" n xor ecx,ecx. b9 {1 _: [& W) @, G# N mov byte ptr[edi-1],13 ;回车 0 j3 B0 a% t V9 d1 s/ r9 C, z jmp computeAgain v8 r! r% i! f- dendCompute: + |+ j# E) P8 l; g1 @( V3 S# F ;显示- o% K4 N5 @0 z( A0 {# z5 E, d! H! | invoke MessageBoxA,NULL,offset ShowText,offset Caption,MB_OK 2 Z/ |# Q9 {, Q6 C ret 5 ^ |. s9 F7 U4 Z1 @: t1 H3 w_ShowBuffer endp1 G( O) u: H2 h: a $ ?4 ^( |& q: @* k- X2 b6 Y2 JSetPhyscialMemorySectionCanBeWrited proc uses ebx esi edi hSection:HANDLE ! K8 ?$ H: d3 v8 C local pDacl: PACL , s$ u: u$ `, A8 K$ slocal pNewDaclACL * T( N; c. {3 J' hlocal pSD SECURITY_DESCRIPTOR . S U; y& q; [% e: Blocal dwRes:DWORD ; 9 D+ l) v& }! G$ W: u0 vlocal ea:EXPLICIT_ACCESS ; 0 C, u" }0 Z+ S, binvoke GetSecurityInfo,hSection,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION, NULL,NULL, addr pDacl,NULL, addr pSD 9 Q" A/ s9 ~( O S0 E% A* Bcmp eax,ERROR_SUCCESS 7 Y, r5 M. a4 g% c5 Wjz @f; F+ X9 F% x/ u6 Q2 s0 q9 G+ K2 e jmp OutSet6 p' Y/ k: o- ^, @* }: ~) } @@:# l w+ L3 z, A! H4 C) l mov dwRes,eax" [4 U4 J) O$ A! j, N mov ea.grfAccessPermissions ,SECTION_MAP_WRITE;2$ |: G! P, ? m+ e1 u. K. A mov ea.grfAccessMode ,GRANT_ACCESS;1 : U2 l) u# U8 F( Y% `, emov ea.grfInheritance,NO_INHERITANCE;0 0 r4 J9 _3 e( o1 @' `mov ea.Trustee.pMultipleTrustee,0 1 ~5 W5 v; N. R& smov ea.Trustee.MultipleTrusteeOperation,0" s2 J7 b! v0 e& b6 l' F. V mov ea.Trustee.TrusteeForm,TRUSTEE_IS_NAME;1 ) m( D3 [0 |' k; K9 \6 ~& v Rmov ea.Trustee.TrusteeType,TRUSTEE_IS_USER;1 & R3 V- P6 v5 w0 T2 h8 \call @f ' d" l' S+ d$ _9 f) Udb "CURRENT_USER",0& d* N+ A Z! T% I* d @@:8 U) k' }% d! V2 D8 J pop edx 9 z; B7 \/ U/ A5 k. Nmov ea.Trustee.ptstrName,edx+ S+ g* ~" d1 D" } invoke SetEntriesInAcl,1,addr ea,pDacl,addr pNewDacl & X" w, N1 N$ Z2 ~" Icmp eax,ERROR_SUCCESS N E6 W# X; |% J jz @f 5 B5 h5 S% S5 Qjmp OutSet 3 Q0 d! i' n; M9 F@@: + P; N. c# B; o& E Z# Dinvoke SetSecurityInfo,hSection,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION, NULL,NULL,pNewDacl,NULL " L$ |/ t0 n3 K9 Z( T* W. I7 ~OutSet: 7 S1 b% k7 g* E: Xcmp pSD,0 Q: i8 v& |# kjz @f $ v/ x" h) w; M# X% hinvoke LocalFree,pSD 2 u( c4 f, _8 k$ j. ~" g@@:1 u! k8 Y. M2 \: B; b) t cmp pNewDacl,0: x- V2 v6 @0 o) w8 I- o* E jz @f , k2 I% O5 Q- M7 [invoke LocalFree,pNewDacl2 T- i* L2 K$ @6 a/ r @@: 0 K( w: k) Q& a* tret) _+ F& Q, h* t! j3 `# h SetPhyscialMemorySectionCanBeWrited endp# h, E. f6 Q; `' w/ v/ T/ h6 f " Q' `% t' C! n; K) l4 s6 ` MiniMmGetPhysicalAddress proc virtualaddress:dword , z6 ?! t2 y8 W1 h- u& C mov eax,virtualaddress4 m9 o* L) A; C$ ^4 q* ~' e cmp eax,80000000h* U- g2 E" @% ~' y) g0 ` i jb @f . ~, y, G9 c( [7 R# |% r7 D cmp eax,0a0000000h& H T8 _! k( G jae @f ; T+ |' w3 k/ I. ?. K/ L$ p9 S and eax,1FFFF000h# `0 y2 z( u5 H ret " A( U/ a( m# r4 v @@: 7 P- _* z. E! W% v. b0 g- x mov eax,08 k# B* ^5 R5 W4 ~" b ret& J. ?5 E, i* E' D" A' R @ MiniMmGetPhysicalAddress endp0 R1 W) {$ F; }* J: P& A 7 H% I6 i9 l/ C3 IExecRing0Proc proc # r0 }6 d0 j8 x: ?7 k/ Jlocal tmpSel:dword: X! M0 @3 i' L1 r# e8 Q local setcg:dword / A" F4 N) V# \% c& \2 O" L* Wlocal BaseAddress:dword 9 t* l% }! K5 Y- g+ e) G3 n; tlocal NtdllMod :dword: m2 v4 ]) X6 G% V: D2 z local hSection:HANDLE 0 J* O: \" X- U1 g local status:NTSTATUS* n2 z/ Q) r4 A1 e1 I' V1 j local objectAttributes:OBJECT_ATTRIBUTES + V; E5 \1 d7 V, w8 ~" B local objName:UNICODE_STRING 7 n* `; f- R4 }4 hmov status,STATUS_SUCCESS; , i$ m0 a' C. `% ? sgdt GdtLimit / t3 ?. ]) I0 R* s) Cinvoke MiniMmGetPhysicalAddress,GdtAddr( q2 j. }& M# p" T8 P/ O mov mapAddr,eax # s( c3 L+ n$ n0 z; ]test eax,eax" Q+ k" w4 X! l- K/ o jz Exit1) p3 q2 V! {2 a2 ` ~, K+ E call @f $ R% ?' f& D9 _+ i# ^( @3 b1 f" Udb "Ntdll.dll",0( H0 y* i- O ^; A6 x V% ~ @@: ) y6 ^9 g, P$ n5 @8 M/ Q1 T& hcall LoadLibraryA( Y: s1 U- r( R" t+ T mov NtdllMod,eax, O6 y8 m: {8 |' @ 9 |+ s' J# Y ]5 H3 X# `lea edx,objnamestr2 }$ y7 P: E; Y- d mov objnameptr,edx2 g2 r6 ~# e2 G+ }! }7 n/ b7 v9 @ lea edi,ObjAttr- F- D1 ?% B8 I" ` and di,0fffch ;align to 4 bytes,or ZwOpenSection will fail; j6 i/ s; D. W( B* D2 H push edi ;edi->ObjAttr * r0 s0 D' R. spush 24 ;length of <\Device\PhysicalMemory>9 f5 {' R& P \3 k0 M0 o2 ]5 J pop ecx 6 W+ J1 }1 A( dpush ecx. }9 Q2 _+ C+ ~ D3 a) g9 ^, ^ xor eax,eax3 ^5 [+ Z! K7 P( ]* g rep stosb ;put ObjAttr with 0 9 a) V* k! T/ bpop ecx / k5 u1 A$ [7 B7 Dpop edi% V! B9 I! x/ x9 c* f4 } mov esi,edi2 [% O, D. D! R2 | stosd 9 o P2 I% _( q: N8 r4 umov dword ptr[esi],ecx 0 C; I4 D9 D/ B- F! J$ Kstosd 5 p! a( Y3 M- a' e1 vlea eax,[edx-8] ;eax->objname $ S" }/ {, [6 ]; s! D3 u4 L1 Astosd ;ObjAddr(18h,00,00,00,00,00,00,00,offset objname,40,02,00,00,dd 2 dup(0)( ?. N" s; V7 C( G mov dword ptr [edi],240h 7 M6 |7 i c! S* I4 s4 }6 `' a- j7 |/ a/ m call @f2 E' ~8 J. ^& h* @ db "ZwOpenSection",0 5 m* ], J3 @6 F* \, W; _* N4 h@@:5 u/ c- j1 |! F1 Y' Z' o push NtdllMod! O8 n" G1 m) H( t1 L) V call GetProcAddress g# t! y. r8 }) i `) H4 s: l% [mov ebx,eax ;ebx=ZwOpenSection) h' a$ E. [: f/ M1 i9 R1 Z ' L. o/ `. M4 V! s9 a% [ \( z2 Q# ~ push esi ;esi->ObjAttr9 g0 v5 ^* p" [+ k push SECTION_MAP_READ or SECTION_MAP_WRITE1 R* o1 k7 e% p: P3 e% d lea edi,hSection! {$ z9 A ^2 c/ H1 y push edi ;edi->hSection \7 t, d: V# }7 p0 k) l call eax ;ZwOpenSection(&hSection,SECTION_MAP_READ or SECTION_MAP_WRITE,ObjAttr)) S D8 o& L5 k6 d+ f( E" m % F( Z+ [, Q4 E. [6 m# W+ Q; lmov status,eax 4 D ]$ ]2 s, lcmp status,STATUS_ACCESS_DENIED3 w8 ^8 C9 J3 \2 o6 q- r6 |& v8 ^ jnz AccessPermit4 Q: [1 n; i* ?9 s y' M mov eax,ebx2 {' c" A4 l3 s# y0 O+ c ?0 o 5 T) M) N" d, {% Q+ v push esi 2 J- ]% H( `4 ^' U* B: g6 Dpush READ_CONTROL or WRITE_DAC N3 J9 J' S; }4 F0 _3 H- M push edi 9 b# K, A) @( {4 \ call eax ' C% j. C6 w$ ]9 s# n! I ; X/ Q. f/ k' s" Z @' Q4 b mov status,eax+ `' Z0 k' G! `6 C3 i: C7 A% q invoke SetPhyscialMemorySectionCanBeWrited,hSection $ r+ v, V4 O1 `9 {; G/ u 7 \( [7 h @% O4 u. w call @f ) X! }6 L# C3 Rdb "ZwClose",06 {% b- K% t( \ @@: / x* p) E9 u9 K; opush NtdllMod ; i3 k% S2 N2 H& c/ u/ b& `6 vcall GetProcAddress, R7 M8 Y7 k3 C* T4 c 6 k- e$ o# U" V) j3 G1 I push hSection , f, H% n# a. x) Bcall eax ;zwClose hSection( d0 Y- Q$ F2 q% }; @9 h$ Y ; }8 U- J9 z* { mov eax,ebx 3 v* {7 \- U% L) j1 [/ `) T ? # B2 c! I7 q! V$ E, N5 L7 }% n& Bpush esi 0 g& X% ?$ l7 w" C4 u& R& b push SECTION_MAP_READ or SECTION_MAP_WRITE & q: R9 B H2 H0 {* p' jlea edi,hSection; X9 I- e9 |- K; k2 K' H8 z2 ]! a5 O2 { push edi % N9 c1 Z- [" L/ w( Acall eax % F. }1 h6 P4 F% Vmov status ,eax ' M6 o, U) j3 M/ {9 m# |;status =ZwOpenSection(&hSection,SECTION_MAP_WRITE|SECTION_MAP_WRITE,&objectAttributes); 6 V6 t& x$ p' H% y4 N2 \: ?2 N AccessPermit: / r4 |' w# ?3 \: G! j, y9 `cmp status ,STATUS_SUCCESS 2 L: \+ b L* k( D2 n4 J& U3 wjz @f ' p8 l) I$ Z+ J% e: N, o; C% y;printf("Error Open PhysicalMemory Section Object,Status:%08X\n",status); 2 K# C: Y* p# W& @ ;return 0;! J1 ~' [. I6 I6 o* X- A! a mov eax,0 2 t; k$ J8 k z+ |ret : D( Q6 |: }/ d2 v9 E7 I3 B1 {@@: 2 ^0 @0 `' m5 ]1 _ b6 kmovzx eax,word ptr[GdtLimit]4 Y4 P& G3 p' i* N, U inc eax 0 i# T# J+ H, R0 k/ z- Hinvoke MapViewOfFile,hSection, FILE_MAP_READ or FILE_MAP_WRITE, 0, mapAddr, eax % Q& I9 ?* K! E" E9 S' m" Pmov BaseAddress,eax1 Q l$ W/ M3 b6 G% `8 \6 V) r cmp BaseAddress,0( \% V; ~; a' z- J4 _) ~) J# T! u jnz @f $ i2 W9 N- `6 O6 [- a" L) F( b! F;printf("Error MapViewOffile:"); e k% |% K# v8 a' C/ U- `* urintWin32Error(GetLastError()); return 0; 5 h/ G2 N, Y+ k) B+ T3 J. {# ^mov eax,0 - b1 T. e( t s( ^ret" \; [6 T8 R, ~# C5 u @@: 3 Z. \5 X% W+ X/ c Z2 m- {; q mov esi,eax ;esi->gdt base5 B- g1 a7 } C- O mov ecx,3e0h - o6 {+ b* ~' D+ \mov eax,GdtAddr% \7 z2 A& I; D& @" M- G .if dword ptr [esi+ecx+2]!=0ec0003e8h |* E1 a1 O3 ~" H' w7 }* k) v' _mov byte ptr [esi],0c3h, i6 e7 \+ G9 `1 N, r . D- ]7 Y/ |4 H* {1 v! w+ p p: i$ H mov word ptr [esi+ecx],ax + O4 d) v& u: y2 R/ Nshr eax,162 A' O5 [$ L% a$ [) M4 F/ D* | mov word ptr [esi+ecx+6],ax; W7 s" d( h1 l4 w8 P, Y7 N" z6 i mov dword ptr [esi+ecx+2],0ec0003e8h : f& J/ E' a7 s1 x( l) r. ^ x! e) A1 r2 e! b mov dword ptr [esi+ecx+8],0000ffffh # N9 k) y9 B/ Omov dword ptr [esi+ecx+12],00cf9a00h: ]# W7 O5 c: L5 T .endif 0 h: ?+ e) @) B# E! C) z$ L0 L" P+ z6 T+ F mov setcg,TRUE . ?$ x) i! N" b; [cmp setcg,01 d8 M- r4 V# Y; l) u+ H1 P jnz ChangeOK 8 L8 h! Z! p0 F* D. E* b$ Gcall @f6 O! ] L, \2 L4 f) B5 s, @- n db "ZwClose",0% X% { ~% S1 w @@:( }: m Z9 o# r7 M* x2 J push NtdllMod+ v G$ @2 U# x+ S0 r call GetProcAddress 6 o! B0 [' [. d+ ^2 M9 Wpush hSection 1 m; S2 W) U4 `9 Z+ `& L& f/ xcall eax # _; ^4 H; ]/ {- d6 Y0 x; Kxor eax,eax# z P* n7 h1 o7 V1 n9 X ret/ ]1 _4 k# d2 C! l% Z: t; Y ChangeOK:% j" j6 `. n( O- |( \7 x and dword ptr Callgt,0 # I1 T' c; I) x. n9 Z: ] xor eax,eax N/ {4 t3 `3 m6 _* B3 j mov ax,3e0h/ O. M6 W. J P9 ~, | or al,3h 9 } ]" g: g" \4 F5 d. E: vmov word ptr [Callgt+4],ax 9 }4 h8 E- D* @3 U$ E;farcall[2]=((short)((ULONG)cg-(ULONG)BaseAddress))|3; //Ring 3 callgate; # N# y6 V1 h! x: l9 X lea eax,_Ring0Proc . x, E6 k9 s. x/ u0 f! N5 A;invoke VirtualLock,eax,seglen , b4 F) O6 c! j" i' x test eax,eax4 I* I( }! O4 M6 Z$ ^! g jnz @f , J, y5 R- ]0 }6 i9 N! Bxor eax,eax9 d ]2 e, G% q6 F ret2 W, C1 n" u2 H6 _6 G9 N/ w @@: / l1 F: ^, b$ Q. Q- l! yinvoke GetCurrentThread o _* f) x Q) a8 winvoke SetThreadPriority,eax,THREAD_PRIORITY_TIME_CRITICAL , G* m5 O- q9 A; T& ^ * ]3 t& J. K* z ?' ainvoke Sleep,0 1 e; N g% H* ~4 |+ ^& p3 w4 m2 o6 L! ^" E call fword ptr [Callgt] ;use callgate to Ring0! ( A5 ]: j& U! J: q/ f" T. b8 P4 ]4 ~;_asm call fword ptr [farcall] z' Z9 I. |; z$ w5 {3 G _Ring0Proc: ; Ring0 code here.. : L4 O& T2 k" q* X* u0 C0 f mov eax,esp ;save ring0 esp 1 }, @5 O- c# H( X3 @mov esp,[esp+4];->ring3 esp 7 O4 W3 W w# ` G: u7 tpush eax 3 n" E; F9 e6 |2 l9 D$ F mov ebx,offset stIDEINFO1 D. H! g6 _# H assume ebx:ptr IDEINFO * k* Q k4 y# m8 @. ?# @- H3 ~# o ;******************************************************************** I8 _5 j) N2 @2 i3 ^5 s5 W ; 等待硬盘就绪8 J' {6 z' j% }' w9 g ;******************************************************************** 4 {: e0 C) _" }) S5 T* i1 i8 U mov ecx,10000h3 w) `: @; k& C5 M3 d4 ?2 @ mov dx,01f7h% M' \# L. {5 w+ b* z7 z3 [; O. @+ R @@:( U2 M) [# A( X5 }+ |) D: { in al,dx. A O Z8 l/ M% c5 e cmp al,50h , Z0 g r- S9 a" I9 H' F jz @F 0 a3 x: p3 X+ D$ R. n, i4 i7 e loop @B9 S8 i' K% C' v. E jmp _II_TimeOut " R# E5 t6 e, T( H1 [ @@: : o* d. M* u M7 N;********************************************************************5 b( ]' r/ |- l8 L1 E: U ; 发送命令' U& N2 V2 F+ S0 A( E0 G ; 如果向主控制发送命令,则端口为 1f0h-1f7h6 j% B2 U" {/ @& W1 w. s ; 如果向副控制发送命令,则端口为 170h-177h 3 S2 l& `" u M# K I; 1f6h 如果要检测的设备为该IDE接口的主(MASTER)设备, , ^" a' N; u* F0 q8 c, G; 那么发送 a0,如果为从那么发送 b01 h5 @9 Q9 C' j2 `* m5 O0 u ; 1f7h 如果要检测的设备为 ATA 设备那么发送 ec + | n ^- D7 |& l' y8 z. h" `; 如果为 ATAPI 设备那么发送 a15 q; F& N' H: z1 \+ P5 F5 X ;********************************************************************3 w3 R/ c# H1 f9 d. n/ b, l mov al,0a0h ;Drive 0,Head 0) e0 D) D" b" q0 h; H mov dx,01f6h ;Drive and head port' H1 { j. q2 M4 N3 m% O+ C out dx,al" {' r0 |9 g! I' R) K) c 8 b0 _3 v& e: V1 t- x3 U5 \' | mov al,0ech , V5 D+ Z, m; ~& O# a+ B inc dx ;Command port 4 R6 P y9 W! G. ~ out dx,al4 ]/ x( Z4 ?4 e9 f( D6 R: w' S8 G ;******************************************************************** 1 T; y N: L( E; 等待硬盘就绪 3 T$ P% R- n$ ?/ E/ C! ^, F5 g;********************************************************************) t3 g% h; i. I& v mov ecx,10000h+ c7 V9 t" f+ _7 G$ a% Q @@:8 c& F8 f3 N2 {% }3 r) L# ? in al,dx;1f7 (r-status register) ) G; I y1 q+ a% U5 b5 P5 q L cmp al,58h;(driver is ready ,and seek complete)5 A0 v: T1 u3 x. o4 k3 N; \. { jz @F" V7 c( B7 E3 W/ {/ U loop @B ( c7 a1 p5 q7 X0 B, @, z! S* | jmp _II_TimeOut+ Y5 P/ r! ~, [2 @' j @@:3 n# ^# e2 r( u$ u6 l ;******************************************************************** 9 p7 ]6 g. I$ W6 m; 将返回信息读回9 k. H2 o0 V9 D, Z+ i3 U ; 注意一定要读满 100h 个字长) z0 c: U, O: Y' q3 Q! ] ;******************************************************************** 8 b# i$ c% Z) R$ ?0 Q7 _ cld + i0 W7 z) F, W! b7 ? mov edx,01f0h;data port - data comes in and out here 3 ?; J( D5 z& t: i/ n: n/ N8 U* z mov edi,ebx 0 W, T$ A3 l$ v. Q! d; {5 v9 j mov ecx,0100h4 b% e6 z* j. n( x c9 @ rep insw ) N/ X/ h2 R- Y0 Y;********************************************************************; M$ _: g1 v$ v& ?9 W- c ; 返回的信息中,型号、序列号、版本号为字形式 * B$ L( w* k6 U: q9 W7 l% U/ D) q& c3 O; 需要整理到字符串的形式2 i& b1 f. L1 d6 K' M2 x ;********************************************************************! v; i9 k7 g- O: ^4 F" t lea esi,[ebx].sSerialNumber 3 F& G" Q- W: \ mov edi,esi " z S" ~: g$ d& I! T" @& y" N mov ecx,10 % q( |. F% ]: b- h' d- }) f @@: 9 j9 J$ [3 s7 @/ K lodsw6 L! V4 R. ]0 O xchg ah,al h6 w$ c6 b9 E stosw 4 ^# n8 t' U7 x u0 q loop @B " \+ e5 J' ^5 [$ W ' {. h, ?/ h0 Y9 m: d( p lea esi,[ebx].sFirmwareRev / W. T* V% S9 ~ mov edi,esi+ K0 [# E9 L- R) Z) l9 D mov ecx,24# z6 B Z0 L$ Y' ?3 Z @@:- h6 B! Q& n" z( c lodsw % J; A* b, ]! P7 ^ xchg ah,al ' k8 W8 N# J$ \2 i. j stosw0 s4 g" |* [9 R, b. ?% } loop @B / Y# {7 {- K* |4 e+ x' I/ a" w: M_II_TimeOut: 5 ]7 ~# d; B6 c/ Q' zassume ebx:nothing7 B! a) k. y# C% S ( T/ l6 T% Y5 l5 ]/ d% O8 lpop esp ;restore ring0 esp, m2 J3 x# m0 z0 c7 @6 }8 H7 b push offset Ring3 ( S/ O- p. @7 P* h( Vretf 5 j( k5 ]- F: j# K2 M' U/ m$ U2 _Ring0CodeLen=$-_Ring0Proc 0 ~3 r9 Y& ?& e* W) d8 ~1 ?6 n/ H3 @/ U! O# O7 x8 \ Ring3:1 T: h+ `4 w+ w( N invoke GetCurrentThread 8 x0 Q2 u5 `' p/ }invoke SetThreadPriority,eax,THREAD_PRIORITY_NORMAL ) @+ i4 @) V& M& Q) Q3 j 1 X) m0 @% D/ w" n0 H;invoke VirtualUnlock,Entry,seglen 7 Z V) N: P/ c; r% \* M" e- o + G" ^: Z9 D/ Z7 |9 Rcall @f 6 Z. X- U: O- g3 k+ d/ Mdb "ZwClose",0. }' }) _" I1 m& E2 `0 T7 Y# l1 ` @@:' ]. s$ u' F& c$ g* N push NtdllMod2 E8 u! T* A$ g o call GetProcAddress . T9 A( o9 Z, [% \% Upush hSection( J, z8 v# a% x! E. L f5 { call eax - L3 H' j8 z8 I" R9 k- k: hmov eax,TRUE$ g, Z* X9 ?! p3 K5 g- [ ret9 ~7 ?% T) K2 T1 J u; k5 w ExecRing0Proc endp , |% M' g% s( x4 o0 C: Q% n+ i- a5 Y( M. g main: : W' R' f+ B) P( J5 }$ Q" xassume fs:nothing ) } \4 d* D% h1 W+ |. y1 xpush offset MySEH3 B! w% R% b k( ~5 ] push fs:[0]/ X0 p8 g8 S" J mov fs:[0],esp . }) e7 u" ?4 E" v4 h1 Kmov OldEsp,esp : L* x( p/ ~* R. T7 N- P- Omov ax,ds ;if Win9x?+ T- q& Q# n1 e. t+ J test ax,4. b( _9 p- l9 a( j2 O jnz Exit1& X s Z$ F- l3 f4 [- ^* D* }7 N+ J invoke ExecRing0Proc ( z! w" F, \; F/ u2 n ) u9 X% C* e9 }5 a, s.if stIDEINFO.wNumCyls 3 { r) y: z/ B. K1 I3 D0 s9 r lea esi,stIDEINFO.sModelNumber l9 a( {3 l- `4 U0 Z& w mov edi,offset szModelNumber( W l- O- n4 ~$ W! {8 ^ mov ecx,sizeof stIDEINFO.sModelNumber8 V- V; Q# U" F% g1 [7 A( k4 G rep movsb 8 e$ n3 }, H z6 d7 f5 t+ P: ]2 z - w. X D9 p _% J6 J' A O lea esi,stIDEINFO.sSerialNumber3 L4 `8 A5 e+ k% a1 A) e mov edi,offset szSerialNumber0 G/ _. u, }- `+ \4 C9 F( \, y3 ~4 i2 f mov ecx,sizeof stIDEINFO.sSerialNumber 6 H% G8 r( y6 N. C5 r8 R3 Q rep movsb ( X6 m( X) F" a. F6 s9 l 9 C% D) u4 ^! U: l6 K+ I* y lea esi,stIDEINFO.sFirmwareRev + d I$ f7 O8 C/ x9 n# w& Y mov edi,offset szFirmwareRev, Q5 i3 f/ Q' h' Z4 w" z) H1 c mov ecx,sizeof stIDEINFO.sFirmwareRev8 m8 a4 t! R2 P rep movsb 4 O; Z1 j5 t9 i9 X% y$ f& F$ z9 Z' f H4 B7 L3 t movzx eax,stIDEINFO.wNumCyls; Y: Q/ a. @; e9 L+ B6 }& P$ }8 X9 E movzx ebx,stIDEINFO.wNumHeads 3 I8 \0 \* p+ K- O& q8 a movzx ecx,stIDEINFO.wSectorsPerTrack" i1 f0 O: W1 f7 J/ Z) @, x movzx edx,stIDEINFO.wBufferSize / L8 T) ^5 w5 q2 L' }1 H) l invoke wsprintf,addr szBuffer,addr szIDEInfo, eax,ebx,ecx,edx, addr szModelNumber, addr szSerialNumber, addr szFirmwareRev + x1 e* O, H% Y6 K8 k# X: N mov eax,offset szBuffer 9 W/ t* ]" r: o# e- x* [4 Y3 n.else$ B; [$ k. M; _) S9 Q X mov eax,offset szErrInfo ; |9 k( H; U$ l% k% z, C" w.endif' V7 Y8 V- k, C' W @@: $ O* P. y7 Q/ I6 G5 @ Oinvoke MessageBox,NULL,eax,addr szTitle,MB_ICONINFORMATION or MB_OK: B+ { } G# ^: s5 j* X+ } Exit1:: A% B8 M$ H0 B K6 M# I8 S4 w pop fs:[0] * n8 ]' h* w9 M: u% r4 w. Aadd esp,49 x! c* L7 s" Z0 C* o% b invoke ExitProcess,0/ e9 T( A' |$ \- ]' ] 6 w" S# W# `& x2 P MySEH :/ U7 A* P2 J+ \, |$ W mov esp,OldEsp: M8 [+ z2 k0 T+ P: g! d1 l- U% q pop fs:[0]! }2 }5 k+ x! Z, ?2 I% z+ R add esp,4 j: k( U" v0 U+ x$ e/ c invoke ExitProcess,-1, |. [7 {' P+ ]6 R3 R y3 A end main+ u( u+ ~* o, j3 s# S; a8 O 7 q/ x/ M2 V! l" X9 [" h3 d
[此贴子已经被作者于2003-11-2 18:14:02编辑过]
1 l, c* _: g# `7 y _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩 转发到微博
bigfoot 该用户已被删除
2
发表于 2003-11-3 16:22:00 | 只看该作者
呵呵,ExecRing0Proc 这段程序甚妙,先得到gdt,然后构造一个调用门call gate's ,使程序从用户模式(ring 3)进入内核模式(ring 0)。进入内核模式之后,就可以没有限制地对系统干任何勾当。这段程序确实为高手所为,在下佩服得紧。) u, Z( S$ s/ C- [7 M
至于读硬盘序列号之类,只不过是在内核模式下的一个I/O应用罢了。1 R3 y0 H7 E0 s# `9 [
其实在NT/2000下读取硬盘序列号只要打开\\.\PhysicalDriveX(X:设备号0~26)设备,然后用DeviceIoControl()就可以读取了,不需要绕ring0这么一个大圈子
; W& M! u* Y6 l8 o3 \: }. P2 k4 b2 X; G7 d1 X6 o3 T
这个程序也可以C语言实现,不过中间必须嵌入几条汇编的指令,如sgdt GdtLimit/ G: D' ~$ T+ {* L5 ?
但还是用c来写更方便,例如:
  i8 m8 T7 o' n! E* Mcall @f; ^) r  m( o  }/ d) D' W6 g
db "ZwOpenSection",0
9 z! L( c4 v+ I. X4 t@@:
% M$ ], Z: k$ M/ x1 X+ d, I' {push NtdllMod
* g+ i$ ^* O. D( ?; Q! xcall GetProcAddress7 n( v( Y+ F% b$ Q! M8 {9 H0 |
mov ebx,eax ;ebx=ZwOpenSection
  |; o4 U6 H9 i5 upush esi ;esi->ObjAttr
( k) W" q5 P1 Rpush SECTION_MAP_READ or SECTION_MAP_WRITE) J  @. |  ^. y8 k9 [; u+ U; l
lea edi,hSection
3 \- U0 `- j' K( v/ |" }7 i# E- n  h8 S. `push edi ;edi->hSection
; U& H/ ]! P, A$ `; q6 l4 \8 f& t7 _call eax ;- h* @% L( {% H5 ^
) q" o/ l% Q  W% I) i
用c的话只要一句就可以了* e, d9 v! ?, B# n" o6 ?& D
ZwOpenSection(&hSection,SECTION_MAP_READ or SECTION_MAP_WRITE,ObjAttr);
8 f: j2 _3 N! ]- y- O& N因此懂汇编,然后用C/C++编程,是成为高手的捷径, D* x% E- {2 Q2 h% }, I
; y$ c6 t. v+ I2 A& Y8 s- b
[此贴子已经被作者于2003-11-3 16:46:50编辑过]

$ L4 W: @+ k6 y+ G( D

该用户从未签到

3
发表于 2003-11-19 00:12:00 | 只看该作者
win32位汇编,真的很不错,业余的时间,全都投进去了

该用户从未签到

4
发表于 2003-11-26 19:36:00 | 只看该作者
要能有台机器试一下多好,学汇编还从没想过去ring0,也感觉没哪个必要。4 \" _: ]2 S7 x4 Q/ j
现在闲着真相试试。这片文章我在家保存了有快一年了。不用感觉可惜了。一直停着不用,我都快忘了那些曾经那些依稀的记忆了。水能给我一台电脑,我力马高喊:有你这么富的吗?
fyer 该用户已被删除
5
发表于 2003-12-3 03:31:00 | 只看该作者
很久以前的一段代码

该用户从未签到

6
 楼主| 发表于 2003-12-3 15:33:00 | 只看该作者
很久以前?
8 c. b% c* J4 v5 d不是吧,这个是 轻描淡写 编程论坛的斑竹写的
fyer 该用户已被删除
7
发表于 2003-12-24 19:21:00 | 只看该作者
看到过的。

本版积分规则

关闭

下沙大学生网推荐上一条 /1 下一条

快速回复 返回顶部 返回列表