杀掉本地进程其实很简单,取得进程ID后,调用OpenProcess函数打开进程句柄,然后调用TerminateProcess函数就可以杀掉进程了。有些情况下并不能直接打开进程句柄,例如WINLOGON等系统进程,因为权限不够。这个时候我们就得先提升自己的进程的权限了。提升权限过程也不复杂,先调用GetCurrentProcess函数取得当前进程的句柄,然后调用OpenProcessToken打开当前进程的访问令牌,接着调用LookupPrivilegeValue函数取得你想提升的权限的值,最后调用AdjustTokenPrivileges函数给当前进程的访问令牌增加权限就可以了。一般有了SeDebugPrivilege特权后,就可以杀掉除Idle外的所有进程了。
WAqR70{KM OK!那如何杀掉远程进程呢?说起来有点复杂,但其实也不难。
RL.%o?<&? <1>与远程系统建立IPC连接
[A*vl9= <2>在远程系统的系统目录admin$\system32中写入一个文件killsrv.exe
<JF78MD\ <3>调用函数OpenSCManager打开远程系统的Service Control Manager[SCM]
#vLDN R <4>调用函数CreateService在远程系统创建一个服务,服务指向的程序是在<2>中写入的程序killsrv.exe
rIW`(IG_ <5>调用函数StartService启动刚才创建的服务,把想杀掉的进程的ID作为参数传递给它
akJ{- <6>服务启动后,killsrv.exe运行,杀掉进程
mQVduG <7>清场
OaU} 9& 嗯!这样看来,我们需要两个程序了。Killsrv.exe的源代码如下:
t( p /***********************************************************************
dL6sb;7R Module:Killsrv.c
d/P$q MD Date:2001/4/27
.?!{. D Author:ey4s
gTO% Http://www.ey4s.org C(e!cOG ***********************************************************************/
P*I\FV #include
MT%ky #include
s![=F}ck #include "function.c"
5A~w_p*} #define ServiceName "PSKILL"
{\C$Bz /YUf('b SERVICE_STATUS_HANDLE ssh;
x9-K}s]% SERVICE_STATUS ss;
G\jr^d\ /////////////////////////////////////////////////////////////////////////
5XFhjVmEL void ServiceStopped(void)
(Clf]\_II {
k(%RX_]C ss.dwServiceType=SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;
$dorE~T ss.dwCurrentState=SERVICE_STOPPED;
e!eWwC9u ss.dwControlsAccepted=SERVICE_ACCEPT_STOP;
rLh490@ ss.dwWin32ExitCode=NO_ERROR;
,_\h)R_ ss.dwCheckPoint=0;
<0v'IHlZ8 ss.dwWaitHint=0;
.N/4+[2p( SetServiceStatus(ssh,&ss);
/~gM,* return;
Br\/7F }
V&h,v%$ /////////////////////////////////////////////////////////////////////////
IK~ur\3 void ServicePaused(void)
z_A%>E4 {
WYEvW<Hv ss.dwServiceType=SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;
pA+Qb.z5z ss.dwCurrentState=SERVICE_PAUSED;
-lb}}z+/ ss.dwControlsAccepted=SERVICE_ACCEPT_STOP;
X903;&Cim ss.dwWin32ExitCode=NO_ERROR;
_I5p
7X ss.dwCheckPoint=0;
+1h^9Y' ss.dwWaitHint=0;
bTHJb pt*- SetServiceStatus(ssh,&ss);
GN=F-*2 return;
~;bwfp_ }
ZPZ1
7- void ServiceRunning(void)
[r^f5;Z {
(z^2LaM `8 ss.dwServiceType=SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;
(:-DuUt ss.dwCurrentState=SERVICE_RUNNING;
LT'#0dCC ss.dwControlsAccepted=SERVICE_ACCEPT_STOP;
D=9x/ ) *G ss.dwWin32ExitCode=NO_ERROR;
>6jyd{ ss.dwCheckPoint=0;
R`TM@aaS: ss.dwWaitHint=0;
_@?]!J[ SetServiceStatus(ssh,&ss);
w:z_EV!& return;
r'xa'6& }
{) Y
&Vr5 /////////////////////////////////////////////////////////////////////////
tH>%`: void WINAPI servier_ctrl(DWORD Opcode)//服务控制程序
V+Cb.$@ {
My)}oN7\z switch(Opcode)
-VRu^l# {
3'1O}xO case SERVICE_CONTROL_STOP://停止Service
MKoN^(7 ServiceStopped();
]6=cSs! break;
%[NefA( case SERVICE_CONTROL_INTERROGATE:
Pw$'TE} SetServiceStatus(ssh,&ss);
wx<5*8zP break;
LjxTRtB_ }
F\,3z7s return;
]S;e#u{QE }
f)"O( c //////////////////////////////////////////////////////////////////////////////
e[Q(OV5(R //杀进程成功设置服务状态为SERVICE_STOPPED
^+,mxV'8! //失败设置服务状态为SERVICE_PAUSED
J8/>b{Y //
H(?z?2b p void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpszArgv)
u@==Ut {
'e{e>>03 ssh=RegisterServiceCtrlHandler(ServiceName,servier_ctrl);
VMen: if(!ssh)
+k8><_vr} {
9;h1;9sC| ServicePaused();
|$bZO`^ return;
|6_<4lmTxF }
pjbKMx ServiceRunning();
_|*3uGo: Sleep(100);
J
fsCkS //注意,argv[0]为此程序名,argv[1]为pskill,参数需要递增1
m#%5H //argv[2]=target,argv[3]=user,argv[4]=pwd,argv[5]=pid
]!0*k#i_. if(KillPS(atoi(lpszArgv[5])))
=_
-@1
1a ServiceStopped();
5%tIAbGW else
nwO;>Qr ServicePaused();
7p u*/W~ return;
FUq@
dUv }
9W'#4 /////////////////////////////////////////////////////////////////////////////
.lTGFeJqZ4 void main(DWORD dwArgc,LPTSTR *lpszArgv)
(CuaBHR
{
^IQC:21 SERVICE_TABLE_ENTRY ste[2];
-qx Z3
ste[0].lpServiceName=ServiceName;
Kj-:'jzW ste[0].lpServiceProc=ServiceMain;
ijyj}gpWha ste[1].lpServiceName=NULL;
F\Tlpp9 ste[1].lpServiceProc=NULL;
o^DiIoor StartServiceCtrlDispatcher(ste);
yDy3;*lE return;
27,WP-qie }
U
R@'J@V#: /////////////////////////////////////////////////////////////////////////////
2! &:V] function.c中有两个函数,一个是提升权限的,一个是提供进程ID,杀进程的。代码如
vQBfT% &Q- 下:
W dIr3 /***********************************************************************
hnE@+(d=qJ Module:function.c
$7|0{Dw Date:2001/4/28
gI\J sN Author:ey4s
3+n&Ya1 Http://www.ey4s.org \B2=E ***********************************************************************/
d@] 0 =Ax #include
,`-6!|: ////////////////////////////////////////////////////////////////////////////
/*D]4AK BOOL SetPrivilege(HANDLE hToken,LPCTSTR lpszPrivilege,BOOL bEnablePrivilege)
RQ/X{<lQ) {
<([o4% TOKEN_PRIVILEGES tp;
u!{P{C LUID luid;
r,yhc = |? r,W~9` if(!LookupPrivilegeValue(NULL,lpszPrivilege,&luid))
c#CX~ {
;[dcbyu@ printf("\nLookupPrivilegeValue error:%d", GetLastError() );
tLV9b %i( return FALSE;
#a}fI }
=A=er1~% tp.PrivilegeCount = 1;
.F
3v) tp.Privileges[0].Luid = luid;
2v%~KV if (bEnablePrivilege)
GHYgSS tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
hiP^*5h else
-V4@BKI8 tp.Privileges[0].Attributes = 0;
o*r\&!NIw // Enable the privilege or disable all privileges.
v?d~H`L AdjustTokenPrivileges(
JNX7]j\ hToken,
<R]?8L0{h FALSE,
B8B^@
&tp,
^>k [T. sizeof(TOKEN_PRIVILEGES),
wU+ofj;
+I (PTOKEN_PRIVILEGES) NULL,
na8A}\!< (PDWORD) NULL);
\>9%=32u. // Call GetLastError to determine whether the function succeeded.
K*CO%:,- if (GetLastError() != ERROR_SUCCESS)
% YU(,83(+ {
EJZl'CR printf("AdjustTokenPrivileges failed: %u\n", GetLastError() );
2/>AmVM return FALSE;
,v)@&1Wh: }
.sjM$#V= return TRUE;
z@<`] }
&?YQVwsN ////////////////////////////////////////////////////////////////////////////
-Ux/ Ug@ BOOL KillPS(DWORD id)
f4X?\e GT {
})T_D\2M HANDLE hProcess=NULL,hProcessToken=NULL;
v*]|1q%/ BOOL IsKilled=FALSE,bRet=FALSE;
5=Gq
d4&* __try
=@{H7z(p& {
W13$-hf9
U Y)YhXW if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hProcessToken))
|\N[EM%.@ {
.c~;/@{ printf("\nOpen Current Process Token failed:%d",GetLastError());
5O*.qp? __leave;
BnAia3z }
FV:{lC{h~ //printf("\nOpen Current Process Token ok!");
HOu<,9?>Q if(!SetPrivilege(hProcessToken,SE_DEBUG_NAME,TRUE))
j:]/AReOL {
gD&%$&q __leave;
zy5@K) }
\{NeDv{A printf("\nSetPrivilege ok!");
>JC.qjA 3-LO if((hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,id))==NULL)
N:gS]OI* {
JUwP<C[ printf("\nOpen Process %d failed:%d",id,GetLastError());
(lEWnf=2h __leave;
uX`Jc:1q3 }
Cw Z{& //printf("\nOpen Process %d ok!",id);
;:"~utL7 if(!TerminateProcess(hProcess,1))
,:;nq> ; {
u4+)lvt printf("\nTerminateProcess failed:%d",GetLastError());
m}F1sRkdQ __leave;
@c7 On)sy }
##R]$-<4dQ IsKilled=TRUE;
G^ n|9)CVW }
"o[\Aec: __finally
.KRh59yg {
D~2,0K if(hProcessToken!=NULL) CloseHandle(hProcessToken);
?]$.3azO if(hProcess!=NULL) CloseHandle(hProcess);
jd(=? !_ }
!BK^5,4?-- return(IsKilled);
|{ *ce<ip5 }
}$g5:k! //////////////////////////////////////////////////////////////////////////////////////////////
?^,GaZ^V OK!服务端的程序已经好了。接下来还需要一个客户端。如果通过在客户端运行的时候,把killsrv.exe COPY到远程系统上,那么就需要提供两个exe文件给用户,这样显得不是很专业,呵呵。不如我们就把killsrv.exe的二进制码作为buff保存在客户端吧,这样在运行的时候,我们直接把buff中的内容写过去,这样提供给用户一个exe文件就可以了。Pskill.c的源代码如下:
T[ky7\ /*********************************************************************************************
/mqEc9sq, ModulesKill.c
SU
H^ ]4> Create:2001/4/28
l2n>Wce9 Modify:2001/6/23
I>ofSaN Author:ey4s
8kO|t!?:U Http://www.ey4s.org b4,yLVi<T PsKill ==>Local and Remote process killer for windows 2k
~_^nWT*BV **************************************************************************/
b/
~&M+) #include "ps.h"
]iPTB #define EXE "killsrv.exe"
?uh7m2l0D #define ServiceName "PSKILL"
js k<N C{e:xGJK #pragma comment(lib,"mpr.lib")
uXK$5" //////////////////////////////////////////////////////////////////////////
]RGun
GJ //定义全局变量
%;ny SERVICE_STATUS ssStatus;
:vV?Yv%P)n SC_HANDLE hSCManager=NULL,hSCService=NULL;
bpKb<c BOOL bKilled=FALSE;
GAz;4pUZ char szTarget[52]=;
(8H
"' //////////////////////////////////////////////////////////////////////////
|urohua BOOL ConnIPC(char *,char *,char *);//建立IPC连接函数
dR $@vDm BOOL InstallService(DWORD,LPTSTR *);//安装服务函数
+a;:7[%& BOOL WaitServiceStop();//等待服务停止函数
Qv']*C[!z BOOL RemoveService();//删除服务函数
~-'nEA TE /////////////////////////////////////////////////////////////////////////
aD%")eP%& int main(DWORD dwArgc,LPTSTR *lpszArgv)
X0P<ifIv {
~#(bX]+A BOOL bRet=FALSE,bFile=FALSE;
mufF_e) char tmp[52]=,RemoteFilePath[128]=,
Z\LW<**b szUser[52]=,szPass[52]=;
xr.fZMOh4 HANDLE hFile=NULL;
}bjTb! DWORD i=0,dwIndex=0,dwWrite,dwSize=sizeof(exebuff);
.5_w^4`b 7\5 [lM //杀本地进程
K<\TF+ if(dwArgc==2)
>f}rM20Vm {
cAIS?]1 if(KillPS(atoi(lpszArgv[1])))
W 4 )^8/ printf("\nLoacl Process %s have beed killed!",lpszArgv[1]);
$yc&f(Tv else
^\Jg
{9a printf("\nLoacl Process %s can't be killed!ErrorCode:%d",
ihs@
'jh lpszArgv[1],GetLastError());
6VCw>x return 0;
vgsu~(L; }
IvH0sS`F //用户输入错误
MPNBA1s else if(dwArgc!=5)
bha_bj {
~Dgui/r9J printf("\nPSKILL ==>Local and Remote Process Killer"
Sh{odrMj* "\nPower by ey4s"
x!LUhX ' "\nhttp://www.ey4s.org 2001/6/23"
<fN?=u+ "\n\nUsage:%s <==Killed Local Process"
u3"F7
lJ "\n %s <==Killed Remote Process\n",
X8?|5$Ey lpszArgv[0],lpszArgv[0]);
.XYSO return 1;
QeU>%qKT }
-u)06C*39 //杀远程机器进程
X~n Kuo strncpy(szTarget,lpszArgv[1],sizeof(szTarget)-1);
[ub,&j^ strncpy(szUser,lpszArgv[2],sizeof(szUser)-1);
5E}0<& strncpy(szPass,lpszArgv[3],sizeof(szPass)-1);
KHdj#3<AR 8Ck:c45v //将在目标机器上创建的exe文件的路径
$6ITa }o sprintf(RemoteFilePath,"\\%s\admin$\system32\%s",szTarget,EXE);
D|_}~T>;& __try
DF9Br
D0{ {
p2w/jJMD //与目标建立IPC连接
GawLQst[+ if(!ConnIPC(szTarget,szUser,szPass))
ZLo3
0* {
:t9(T?2 printf("\nConnect to %s failed:%d",szTarget,GetLastError());
H6e^"E return 1;
Q/0;r{@Tq} }
_khQ printf("\nConnect to %s success!",szTarget);
7|"11^q //在目标机器上创建exe文件
-XD\,y%zi RI-whA8+ hFile=CreateFile(RemoteFilePath,GENERIC_ALL,FILE_SHARE_READ|FILE_SHARE_WRIT
.8fOc.h8h E,
W6~<7 NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
ou96
P<B if(hFile==INVALID_HANDLE_VALUE)
Ntg#-_] {
0^{zq|%Q! printf("\nCreate file %s failed:%d",RemoteFilePath,GetLastError());
M!mTNIj8~ __leave;
A5
8i}G9 }
z?FZu,h} //写文件内容
n |.- :Zy while(dwSize>dwIndex)
AE^&hH0^ {
m,]Tl;f *)u_m h if(!WriteFile(hFile,&exebuff[dwIndex],dwSize-dwIndex,&dwWrite,NULL))
@{XN}tWDOp {
$F\&?B1. printf("\nWrite file %s
%Sxy!gGz%% failed:%d",RemoteFilePath,GetLastError());
\h_hd%'G __leave;
${e(#bvGZ }
<6-(a;T!7 dwIndex+=dwWrite;
,cgC_% }
~5]AXi'e~ //关闭文件句柄
ZL~}B.nqS CloseHandle(hFile);
d|DIqT~{W bFile=TRUE;
ZYu^Q6b3 //安装服务
0~BQ8O=+mn if(InstallService(dwArgc,lpszArgv))
zB 7wGl9 {
I]ywO4 //等待服务结束
zXZy:SD if(WaitServiceStop())
:sM|~gT {
("mW=Ln //printf("\nService was stoped!");
h7(twct }
<%) :'0q& else
u%v^(9z {
s7df<dBC //printf("\nService can't be stoped.Try to delete it.");
r|0C G^:C }
Re,0RM\ Sleep(500);
^!Bpev //删除服务
,gD30Pylz RemoveService();
:GGsQ
n }
|oO0%#1H }
^k u~m5v __finally
hFQC%N.' {
/A##Yv!biR //删除留下的文件
"B)DX*-\? if(bFile) DeleteFile(RemoteFilePath);
C|z`hNp //如果文件句柄没有关闭,关闭之~
~oSLWA9 if(hFile!=NULL) CloseHandle(hFile);
BAqu@F\): //Close Service handle
q_HD`tW if(hSCService!=NULL) CloseServiceHandle(hSCService);
9n9/[?S //Close the Service Control Manager handle
Zj`eR\7~ if(hSCManager!=NULL) CloseServiceHandle(hSCManager);
TX;OA"3=\- //断开ipc连接
%'^m6^g; wsprintf(tmp,"\\%s\ipc$",szTarget);
.8.ivfmJh WNetCancelConnection2(tmp,CONNECT_UPDATE_PROFILE,TRUE);
vP&*(WfO) if(bKilled)
t"RgEH@ printf("\nProcess %s on %s have been
X2sK<Qluql killed!\n",lpszArgv[4],lpszArgv[1]);
F"B! r -J else
?Vt$ printf("\nProcess %s on %s can't be
`b9oH^}n j killed!\n",lpszArgv[4],lpszArgv[1]);
0Dh a1[= }
Z(U&0GH` return 0;
y "7TO# }
G++kUo< //////////////////////////////////////////////////////////////////////////
9n@jK%m BOOL ConnIPC(char *RemoteName,char *User,char *Pass)
P`U5kNN {
I0)iC[s8; NETRESOURCE nr;
L~vNW6#W char RN[50]="\\";
z[OW%(vrm H]@Zp"7 strcat(RN,RemoteName);
X3a:*1N strcat(RN,"\ipc$");
b/ZX}<s(1= :(I)+;M}P nr.dwType=RESOURCETYPE_ANY;
@JN%P}4) nr.lpLocalName=NULL;
$o]suF;3 nr.lpRemoteName=RN;
EXb{/4 nr.lpProvider=NULL;
%y8w9aGt Jz3 q
Pr if(WNetAddConnection2(&nr,Pass,User,FALSE)==NO_ERROR)
j:{<
return TRUE;
8|yhe%-O else
T5Pc2R return FALSE;
?&/9b)c S }
aY3kww` /////////////////////////////////////////////////////////////////////////
~zYp(#0op BOOL InstallService(DWORD dwArgc,LPTSTR *lpszArgv)
'HOcK8}b {
E*RP8 BOOL bRet=FALSE;
hkW"D<ii- __try
T
0^U
]C {
,QG,tf? //Open Service Control Manager on Local or Remote machine
Z/Mp=273 hSCManager=OpenSCManager(szTarget,NULL,SC_MANAGER_ALL_ACCESS);
Za=<euc7 if(hSCManager==NULL)
:Z1_;`>CT {
yd>kJk^~/ printf("\nOpen Service Control Manage failed:%d",GetLastError());
Z\dILt:#z __leave;
XUMCz7&j }
Or6'5e?N //printf("\nOpen Service Control Manage ok!");
9';0vrFeM //Create Service
ts9N$?0:V hSCService=CreateService(hSCManager,// handle to SCM database
%>24.i"l ServiceName,// name of service to start
fI"`[cA"] ServiceName,// display name
CGv(dE,G&] SERVICE_ALL_ACCESS,// type of access to service
[nG/>Z]W SERVICE_WIN32_OWN_PROCESS,// type of service
iW |]-Ba\ SERVICE_AUTO_START,// when to start service
/dWuHS SERVICE_ERROR_IGNORE,// severity of service
j}h50*6KO failure
a&Z|3+ZA EXE,// name of binary file
m=%W <8[V NULL,// name of load ordering group
94K;=5h NULL,// tag identifier
(y(V,kXwa8 NULL,// array of dependency names
TXrC5AJx NULL,// account name
](8XC_-U' NULL);// account password
Uv%"45&7 //create service failed
p8F|]6Z if(hSCService==NULL)
NPf,9c; {
>@ EQarD //如果服务已经存在,那么则打开
_Zb_9& if(GetLastError()==ERROR_SERVICE_EXISTS)
'| Ag,x[ {
sy>P n //printf("\nService %s Already exists",ServiceName);
q$EVd9aN //open service
w8@MUz}/# hSCService = OpenService(hSCManager, ServiceName,
XtQ3$0{*% SERVICE_ALL_ACCESS);
uiiA)j*! if(hSCService==NULL)
" I _T {
1
C[#]krh printf("\nOpen Service failed:%d",GetLastError());
0*tEuJ7 __leave;
* z{D}L-& }
>8>.o[Q& //printf("\nOpen Service %s ok!",ServiceName);
xFyMg& }
!q7M+j4 else
#2cH.`ty {
IXzad printf("\nCreateService failed:%d",GetLastError());
,QKG$F __leave;
[3/P
EDkw }
YK}(VF?& }
av`b8cGg //create service ok
zb;2xTH+ else
"rAm6b-` {
.X:{s,@ //printf("\nCreate Service %s ok!",ServiceName);
%lV>Nc|iz= }
.h7b 4J P *%bG 4 // 起动服务
YjdH7.js if ( StartService(hSCService,dwArgc,lpszArgv))
n,AN&BZ {
^//N-?Fx //printf("\nStarting %s.", ServiceName);
lg!1q8 Sleep(20);//时间最好不要超过100ms
.|iUDp6vz while( QueryServiceStatus(hSCService, &ssStatus ) )
4J I;NN {
!gT6So if ( ssStatus.dwCurrentState == SERVICE_START_PENDING)
!;R{- {
f_z2d+ printf(".");
czHO)uQ?d` Sleep(20);
yK}#|b'cM }
d628@~Ekn else
co~TQpy^ break;
)hQ`l d7B }
mTs[3opg if ( ssStatus.dwCurrentState != SERVICE_RUNNING )
^[id8 printf("\n%s failed to run:%d",ServiceName,GetLastError());
L(8Q%oX%o }
h\.UUC&< else if(GetLastError()==ERROR_SERVICE_ALREADY_RUNNING)
# ^%'*/z {
BwL:B\ //printf("\nService %s already running.",ServiceName);
071wo7 }
XeZv%` ? else
?G8 D6 {
kdoE)C printf("\nStart Service %s failed:%d",ServiceName,GetLastError());
yGN<.IP75 __leave;
"CZ`hx1|^ }
_L:
/2 bRet=TRUE;
*$hO C%( }//enf of try
~xHr/: __finally
w$&10 {
Y
%<B, 3 return bRet;
_~_Hup }
'nCBLc8 return bRet;
.Qi`5C:U }
g`1*p| /////////////////////////////////////////////////////////////////////////
w5&UG/z%l BOOL WaitServiceStop(void)
q.g!WLiI {
{AcKBib BOOL bRet=FALSE;
*qq %)7 //printf("\nWait Service stoped");
:b.#h7Qt< while(1)
<p<gx*% {
_$, .NK,6 Sleep(100);
G=b`w;oL: if(!QueryServiceStatus(hSCService, &ssStatus))
!\"C<*5 {
yV`!Fq 1k printf("\nQueryServiceStatus failed:%d",GetLastError());
DU[UGJg break;
D|+H!f{k }
2+Fq'! if(ssStatus.dwCurrentState==SERVICE_STOPPED)
>\@6i
s {
?.,cWKGQ} bKilled=TRUE;
A\: =p bRet=TRUE;
=-vk}O0C break;
"3\)@ }
#s]]\ if(ssStatus.dwCurrentState==SERVICE_PAUSED)
#}B~V3UD {
KIuYWr7& //停止服务
^K;,,s;0 bRet=ControlService(hSCService,SERVICE_CONTROL_STOP,NULL);
<89js87 break;
\x|(`;{ }
lSbAZ6 else
S:t7U% {
pR~PB //printf(".");
i#Wl?(-i continue;
VW'e&v1 . }
9@:&