杀掉本地进程其实很简单,取得进程ID后,调用OpenProcess函数打开进程句柄,然后调用TerminateProcess函数就可以杀掉进程了。有些情况下并不能直接打开进程句柄,例如WINLOGON等系统进程,因为权限不够。这个时候我们就得先提升自己的进程的权限了。提升权限过程也不复杂,先调用GetCurrentProcess函数取得当前进程的句柄,然后调用OpenProcessToken打开当前进程的访问令牌,接着调用LookupPrivilegeValue函数取得你想提升的权限的值,最后调用AdjustTokenPrivileges函数给当前进程的访问令牌增加权限就可以了。一般有了SeDebugPrivilege特权后,就可以杀掉除Idle外的所有进程了。
JC MUK<CG OK!那如何杀掉远程进程呢?说起来有点复杂,但其实也不难。
6_s(Kx>j <1>与远程系统建立IPC连接
Nq%ir8hE <2>在远程系统的系统目录admin$\system32中写入一个文件killsrv.exe
eaC%&k <3>调用函数OpenSCManager打开远程系统的Service Control Manager[SCM]
'451H3LC0 <4>调用函数CreateService在远程系统创建一个服务,服务指向的程序是在<2>中写入的程序killsrv.exe
bksv2@ar <5>调用函数StartService启动刚才创建的服务,把想杀掉的进程的ID作为参数传递给它
?I[*{}@n" <6>服务启动后,killsrv.exe运行,杀掉进程
^TtL-|I <7>清场
3vs{*T" 嗯!这样看来,我们需要两个程序了。Killsrv.exe的源代码如下:
P)l_ :;& /***********************************************************************
f"*k>=ETI Module:Killsrv.c
=C2KHNc Date:2001/4/27
o! l Ykud Author:ey4s
)n]"~I^ Http://www.ey4s.org o1vK2V ***********************************************************************/
5Xf]j=_ #include
;I&XG #include
j4<K0-? #include "function.c"
Xhq7)/jp #define ServiceName "PSKILL"
NS65F7<& P(3k1SM SERVICE_STATUS_HANDLE ssh;
[#9i@40 SERVICE_STATUS ss;
* bd3^mP /////////////////////////////////////////////////////////////////////////
$J^fp XO void ServiceStopped(void)
t/}NX[q {
^v`naA( ss.dwServiceType=SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;
$AT@r" ss.dwCurrentState=SERVICE_STOPPED;
o]Xt2E ss.dwControlsAccepted=SERVICE_ACCEPT_STOP;
41x"Q?.bY ss.dwWin32ExitCode=NO_ERROR;
/O5&)%N ss.dwCheckPoint=0;
eP,bFc ss.dwWaitHint=0;
QtwQVOK SetServiceStatus(ssh,&ss);
pI:,Lt1B return;
.faf!3d }
m8=n `XI /////////////////////////////////////////////////////////////////////////
drMMf[ void ServicePaused(void)
{#:31)P {
M.K^W ` ss.dwServiceType=SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;
XC5/$3'M& ss.dwCurrentState=SERVICE_PAUSED;
AN:yL
a! ss.dwControlsAccepted=SERVICE_ACCEPT_STOP;
J\Hv42 ss.dwWin32ExitCode=NO_ERROR;
j.ucv ss.dwCheckPoint=0;
qiB~ ss.dwWaitHint=0;
D#G%WT/" SetServiceStatus(ssh,&ss);
o K>(yC[ return;
CxTmW5l }
`sCn4-$8 void ServiceRunning(void)
,sIC=V + {
@AF<Xp{ ss.dwServiceType=SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;
5Yhcnwdm! ss.dwCurrentState=SERVICE_RUNNING;
BZ=I/L ss.dwControlsAccepted=SERVICE_ACCEPT_STOP;
1$8@CT^m ss.dwWin32ExitCode=NO_ERROR;
Z2gWa~dBC ss.dwCheckPoint=0;
{nbT$3=Zt ss.dwWaitHint=0;
<)p.GAZ SetServiceStatus(ssh,&ss);
Lo~;pvv return;
1_<x%>zG }
59O-"Sc[ /////////////////////////////////////////////////////////////////////////
o//h|f U@ void WINAPI servier_ctrl(DWORD Opcode)//服务控制程序
%uN<^`JZ {
]q.%_ switch(Opcode)
-?-XO<I {
h7E~I
J case SERVICE_CONTROL_STOP://停止Service
g"Y_!)X ServiceStopped();
<(q(5jG break;
]'`E case SERVICE_CONTROL_INTERROGATE:
m/1FVC@* SetServiceStatus(ssh,&ss);
b?l>vUgAg break;
GPGE7X' }
0muC4 return;
B
ytx.[zbX }
{Q3OT //////////////////////////////////////////////////////////////////////////////
+?Ii=* 7n //杀进程成功设置服务状态为SERVICE_STOPPED
6,A|9UX=` //失败设置服务状态为SERVICE_PAUSED
d?8OY //
*m}8L%<HT void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpszArgv)
X>Vc4n<} {
=w!ik9 ssh=RegisterServiceCtrlHandler(ServiceName,servier_ctrl);
~x^y5[5{ if(!ssh)
HiA E9 {
`^Vd* ServicePaused();
}! EVf return;
dgjK\pH`h }
-B H/)$-$ ServiceRunning();
O|V0WiY< Sleep(100);
!,$#i //注意,argv[0]为此程序名,argv[1]为pskill,参数需要递增1
K9lekevB //argv[2]=target,argv[3]=user,argv[4]=pwd,argv[5]=pid
ZQ]qJDk if(KillPS(atoi(lpszArgv[5])))
?1D!%jfi ServiceStopped();
BS*79heY else
$
]s^M=8 ServicePaused();
hO]F\0+ return;
b3^:Bh9 }
`*3A7y /////////////////////////////////////////////////////////////////////////////
bGCC?}\ void main(DWORD dwArgc,LPTSTR *lpszArgv)
==OUd6e} {
>jX" SERVICE_TABLE_ENTRY ste[2];
&t^*0/~ ste[0].lpServiceName=ServiceName;
c|k_[8L ste[0].lpServiceProc=ServiceMain;
2n,z`(= ste[1].lpServiceName=NULL;
k1<^Ept ste[1].lpServiceProc=NULL;
`Pvi+:6\Y StartServiceCtrlDispatcher(ste);
8f9wUPr return;
ZC N}iQu4 }
[(heE
/////////////////////////////////////////////////////////////////////////////
%dzt'uz function.c中有两个函数,一个是提升权限的,一个是提供进程ID,杀进程的。代码如
AH#mL 下:
%):_ /***********************************************************************
cu N9RG Module:function.c
Y"H`+UV Date:2001/4/28
"pM>TMAE Author:ey4s
@."K"i'Bl Http://www.ey4s.org w.q`E@ T* ***********************************************************************/
=&z+7Pe[ #include
2y
-
QH ////////////////////////////////////////////////////////////////////////////
@G"nkB
BOOL SetPrivilege(HANDLE hToken,LPCTSTR lpszPrivilege,BOOL bEnablePrivilege)
QN#"c {
bzFac5n)Q TOKEN_PRIVILEGES tp;
a+E
8s7C/D LUID luid;
pUHgjwT'U KL'1)G"OH if(!LookupPrivilegeValue(NULL,lpszPrivilege,&luid))
o8R_Ojh {
9;+&}:IVS printf("\nLookupPrivilegeValue error:%d", GetLastError() );
h$&Tg_/'#D return FALSE;
VcrMlcnO }
@Chl>s tp.PrivilegeCount = 1;
`;j1H<L tp.Privileges[0].Luid = luid;
uO]D=Z\S( if (bEnablePrivilege)
+MX~1RU+ tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
zR<{z else
)#m{"rk[x, tp.Privileges[0].Attributes = 0;
I?'*vAW< // Enable the privilege or disable all privileges.
8\rca:cF
AdjustTokenPrivileges(
#yochxF_ hToken,
,D;8~llM FALSE,
\}$|Uo$O &tp,
#c:s2EL sizeof(TOKEN_PRIVILEGES),
^3dc#5]Xf (PTOKEN_PRIVILEGES) NULL,
I{89chi (PDWORD) NULL);
K,g6y#1" // Call GetLastError to determine whether the function succeeded.
M{J>yN if (GetLastError() != ERROR_SUCCESS)
9<u&27. {
h-96 2(LG printf("AdjustTokenPrivileges failed: %u\n", GetLastError() );
U4"^NLAq return FALSE;
nnyT,e% }
v#?DWeaFS_ return TRUE;
?{ )'O+s }
\6wltTW]# ////////////////////////////////////////////////////////////////////////////
@rYZ0`E9 BOOL KillPS(DWORD id)
+j 9+~ {
LO_Xrj HANDLE hProcess=NULL,hProcessToken=NULL;
uVqc:Q" BOOL IsKilled=FALSE,bRet=FALSE;
jlBsm'M<m __try
h>`[p,o {
H1k)ya x4_ -s0SQe{!_ if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hProcessToken))
zIF1A*UH {
%@PcQJg U< printf("\nOpen Current Process Token failed:%d",GetLastError());
N/o?\q8 __leave;
`j{3|C= }
16AlmegDk //printf("\nOpen Current Process Token ok!");
2H`r:x<Z- if(!SetPrivilege(hProcessToken,SE_DEBUG_NAME,TRUE))
(2;Aqx5i {
mfj{_fR3 __leave;
w5i*pOG)Z }
X"TL'"?fo printf("\nSetPrivilege ok!");
K6->{!8]k ] V/5<O1 if((hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,id))==NULL)
8XH;<z<oJ {
=8l' [ printf("\nOpen Process %d failed:%d",id,GetLastError());
DghyE` __leave;
0kUhz\"R:q }
&`m.]RV //printf("\nOpen Process %d ok!",id);
P'Y(f!% if(!TerminateProcess(hProcess,1))
u0wu\ {
96\FJHtZ printf("\nTerminateProcess failed:%d",GetLastError());
$*{,Z<|2 __leave;
;l;jTb ^l }
%g7j7$c IsKilled=TRUE;
bSIY|/d+ }
N6[Z*5efR __finally
'gN[LERT {
- k0a((? if(hProcessToken!=NULL) CloseHandle(hProcessToken);
`lY-/Ty if(hProcess!=NULL) CloseHandle(hProcess);
=_OJ
7K' }
z"<S$sDh return(IsKilled);
;rf{T[i }
f4S}Nga( //////////////////////////////////////////////////////////////////////////////////////////////
oT}$N_gFT OK!服务端的程序已经好了。接下来还需要一个客户端。如果通过在客户端运行的时候,把killsrv.exe COPY到远程系统上,那么就需要提供两个exe文件给用户,这样显得不是很专业,呵呵。不如我们就把killsrv.exe的二进制码作为buff保存在客户端吧,这样在运行的时候,我们直接把buff中的内容写过去,这样提供给用户一个exe文件就可以了。Pskill.c的源代码如下:
d[h=<?E5 /*********************************************************************************************
c^_+<C-F ModulesKill.c
;ab[YMkH Create:2001/4/28
5i6Ji( Modify:2001/6/23
j/Kul}Ml\* Author:ey4s
#sU>L= Http://www.ey4s.org w?D= PsKill ==>Local and Remote process killer for windows 2k
8;qOsV)UDT **************************************************************************/
mg*iW55g #include "ps.h"
NkUY_rKPb #define EXE "killsrv.exe"
F42^Uoaz #define ServiceName "PSKILL"
;R+Gf!1 r`ftflNh( #pragma comment(lib,"mpr.lib")
n'ZPB //////////////////////////////////////////////////////////////////////////
&DQ_qOKD //定义全局变量
[p4([ef
' SERVICE_STATUS ssStatus;
x<t?Yc9 SC_HANDLE hSCManager=NULL,hSCService=NULL;
\/dOv[ BOOL bKilled=FALSE;
p_xJKQS char szTarget[52]=;
%5L~&W}^" //////////////////////////////////////////////////////////////////////////
l%V+]skS BOOL ConnIPC(char *,char *,char *);//建立IPC连接函数
."Pn[$'. BOOL InstallService(DWORD,LPTSTR *);//安装服务函数
Ks3YrKk;p BOOL WaitServiceStop();//等待服务停止函数
-wUT@a BOOL RemoveService();//删除服务函数
=n.&N
/////////////////////////////////////////////////////////////////////////
<YCjo[(~ int main(DWORD dwArgc,LPTSTR *lpszArgv)
GB+$ed5@< {
7IUJHc[R? BOOL bRet=FALSE,bFile=FALSE;
[?6+ r char tmp[52]=,RemoteFilePath[128]=,
G9S3r3 szUser[52]=,szPass[52]=;
*[>{9V HANDLE hFile=NULL;
~&,S xQT DWORD i=0,dwIndex=0,dwWrite,dwSize=sizeof(exebuff);
m!INbIh h9d*N 9!;M //杀本地进程
Urw =a$ if(dwArgc==2)
#+i5'p(4 {
MNh:NFCRA if(KillPS(atoi(lpszArgv[1])))
{%2p(5FB printf("\nLoacl Process %s have beed killed!",lpszArgv[1]);
5bZ0}^FYF else
JiqhCt\ printf("\nLoacl Process %s can't be killed!ErrorCode:%d",
rxxVLW lpszArgv[1],GetLastError());
Eb,M+c? return 0;
oVl:g:K40 }
?RE"<L //用户输入错误
eLH=PDdO else if(dwArgc!=5)
U7LCd+Z5X {
G=e'H- printf("\nPSKILL ==>Local and Remote Process Killer"
"Ml#,kU<T "\nPower by ey4s"
,H|K3nh "\nhttp://www.ey4s.org 2001/6/23"
pw))9~XU "\n\nUsage:%s <==Killed Local Process"
u$qasII "\n %s <==Killed Remote Process\n",
VaonG]Ues lpszArgv[0],lpszArgv[0]);
;Zf7|i`R3 return 1;
<'T DOYb }
9AWP`~l` //杀远程机器进程
ga'G)d3oS strncpy(szTarget,lpszArgv[1],sizeof(szTarget)-1);
{#=o4~u%;H strncpy(szUser,lpszArgv[2],sizeof(szUser)-1);
. Z`xNp strncpy(szPass,lpszArgv[3],sizeof(szPass)-1);
U4"&T,'lTL )REegFN@ //将在目标机器上创建的exe文件的路径
55b/giX sprintf(RemoteFilePath,"\\%s\admin$\system32\%s",szTarget,EXE);
Ct(^nn$A __try
RSeav {
n1x3q/~ //与目标建立IPC连接
Vf(..8 if(!ConnIPC(szTarget,szUser,szPass))
AO-~dV {
aEEb1Y printf("\nConnect to %s failed:%d",szTarget,GetLastError());
8VpmcGvc3 return 1;
;5|d[r}k3 }
p;%5 o0{1 printf("\nConnect to %s success!",szTarget);
e[Z-&' //在目标机器上创建exe文件
tPk>hzW ^S|}<6~6b hFile=CreateFile(RemoteFilePath,GENERIC_ALL,FILE_SHARE_READ|FILE_SHARE_WRIT
D=f$-rn E,
Y|#<kS NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
Zirp_[KZ% if(hFile==INVALID_HANDLE_VALUE)
6!6R3Za$ {
TCgW^iu printf("\nCreate file %s failed:%d",RemoteFilePath,GetLastError());
{iQ4jJ`n __leave;
,7d#t4 }
7OPRf9+o //写文件内容
xyV7MW\?w while(dwSize>dwIndex)
xNJ*TA[+ {
nh+h3"-d Ix@nRc' if(!WriteFile(hFile,&exebuff[dwIndex],dwSize-dwIndex,&dwWrite,NULL))
~1Ffu x {
"-HWw?rx/ printf("\nWrite file %s
jlyuu failed:%d",RemoteFilePath,GetLastError());
u3cl7~- yW __leave;
on7?V< }
l>oJ^J dwIndex+=dwWrite;
: t
D`e< }
;Rxc(tR!n //关闭文件句柄
aMK\&yZD CloseHandle(hFile);
z2A,*|I bFile=TRUE;
9+Wf*:*EW //安装服务
Ln4Dq[M if(InstallService(dwArgc,lpszArgv))
kK&AK2 {
1#zD7b~ //等待服务结束
i\>?b)a> if(WaitServiceStop())
^= kr`5 {
'~{kR=+ //printf("\nService was stoped!");
2/))Y\~
}
4?_^7(%p else
CQ{pv3) {
/BS yanro //printf("\nService can't be stoped.Try to delete it.");
M3fTUCR }
s?9`dv}P Sleep(500);
=+VDb5= TV //删除服务
02[*b RemoveService();
TD/ 4lL~(x }
[.;I} }
#8WHIDS> __finally
2p *!up( {
8y4t9V //删除留下的文件
b6""q9S! if(bFile) DeleteFile(RemoteFilePath);
tt&{f <* //如果文件句柄没有关闭,关闭之~
:c:}_t{% if(hFile!=NULL) CloseHandle(hFile);
bIuOB| //Close Service handle
|/u,6` if(hSCService!=NULL) CloseServiceHandle(hSCService);
5^{2g^jH6 //Close the Service Control Manager handle
Sq`Zuu9t if(hSCManager!=NULL) CloseServiceHandle(hSCManager);
.;dI&0Z //断开ipc连接
/i"1e:cK wsprintf(tmp,"\\%s\ipc$",szTarget);
OP``+z> WNetCancelConnection2(tmp,CONNECT_UPDATE_PROFILE,TRUE);
WuQ;Da0+_F if(bKilled)
|QyZ:`0u printf("\nProcess %s on %s have been
FW4#/H killed!\n",lpszArgv[4],lpszArgv[1]);
rj29$d?Y9 else
rLp0)Go printf("\nProcess %s on %s can't be
<.
V*]g/; killed!\n",lpszArgv[4],lpszArgv[1]);
~T=a]V }
\O*W/9
+ return 0;
cU "uKR }
wk2Ff*& //////////////////////////////////////////////////////////////////////////
&!>.)I` BOOL ConnIPC(char *RemoteName,char *User,char *Pass)
<Ug1g0. {
=>e>
r~cW NETRESOURCE nr;
+[V.yY/t|> char RN[50]="\\";
pWeD,!f Wm!cjGK strcat(RN,RemoteName);
\5#eBJ strcat(RN,"\ipc$");
IRsyy\[kp8 cOdgBi nr.dwType=RESOURCETYPE_ANY;
f5*hOzKG6 nr.lpLocalName=NULL;
-S%Uw nr.lpRemoteName=RN;
RV@mAw.T nr.lpProvider=NULL;
NC"X{$o2 ,H]S-uK~ if(WNetAddConnection2(&nr,Pass,User,FALSE)==NO_ERROR)
(Wn^~-`=+ return TRUE;
Xz'o<S else
p-6T,') return FALSE;
G[zVGqk }
G4EuW *~ /////////////////////////////////////////////////////////////////////////
dlDO?T BOOL InstallService(DWORD dwArgc,LPTSTR *lpszArgv)
[n$6T {
&3 x
[0DV BOOL bRet=FALSE;
K*tomy __try
xE6hE'rh.O {
p%+'iDb //Open Service Control Manager on Local or Remote machine
_"#n%@ hSCManager=OpenSCManager(szTarget,NULL,SC_MANAGER_ALL_ACCESS);
5~RR
_G if(hSCManager==NULL)
xQxq33\ {
mfk^t`w_ printf("\nOpen Service Control Manage failed:%d",GetLastError());
!wo __leave;
G9~ 4?v6: }
/!pJ" @ //printf("\nOpen Service Control Manage ok!");
\[]4rXZN0 //Create Service
N}'2GBqfU4 hSCService=CreateService(hSCManager,// handle to SCM database
I$ ?.9&.& ServiceName,// name of service to start
=<r1sqf
ServiceName,// display name
p|w0
i[hc SERVICE_ALL_ACCESS,// type of access to service
oUL4l=dj. SERVICE_WIN32_OWN_PROCESS,// type of service
rotu#?B SERVICE_AUTO_START,// when to start service
CE|rn8MB SERVICE_ERROR_IGNORE,// severity of service
Lr*\LP6jx3 failure
[$`%ve EXE,// name of binary file
.|KBQMI NULL,// name of load ordering group
/Uni6O)oc NULL,// tag identifier
OyIIJ!( NULL,// array of dependency names
dlioa Yc NULL,// account name
d*LW32B@ NULL);// account password
zCmx 1Djz //create service failed
.i3_D?? if(hSCService==NULL)
xC 4L`\ {
m(^nG_eX //如果服务已经存在,那么则打开
2I_~]X53[ if(GetLastError()==ERROR_SERVICE_EXISTS)
7DWGYvv[ {
8Q73h/3 //printf("\nService %s Already exists",ServiceName);
kK.[v'[>& //open service
ZDm Y${J hSCService = OpenService(hSCManager, ServiceName,
wAc;{60s] SERVICE_ALL_ACCESS);
bg^<e}{<H if(hSCService==NULL)
{vp*m:K {
[G"Va_A8 printf("\nOpen Service failed:%d",GetLastError());
5Rae?*XH __leave;
yVyh\u\ }
,: qk+ //printf("\nOpen Service %s ok!",ServiceName);
gvFCsVv<{ }
[=^Wj`; else
Yb%#\.M/y {
vU9:`@beu printf("\nCreateService failed:%d",GetLastError());
L fZF __leave;
;]W@W1)$ }
rXq{WS` }
]&X}C{v)G //create service ok
mTL JajE/ else
]$I}r=
Em {
/z: mi //printf("\nCreate Service %s ok!",ServiceName);
=G`g-E2 }
dEZlJo@J XmN8S_M>v // 起动服务
;KT5qiqYH if ( StartService(hSCService,dwArgc,lpszArgv))
&W{v(@ {
wJh/tb=$o //printf("\nStarting %s.", ServiceName);
?HeUU Sleep(20);//时间最好不要超过100ms
<,y> W! while( QueryServiceStatus(hSCService, &ssStatus ) )
Y;kiU {
Yw_!40` if ( ssStatus.dwCurrentState == SERVICE_START_PENDING)
ZWQ/BgKB {
Hz>Dp
! printf(".");
jW>K#vj Sleep(20);
"NTiQ}i }
XJ7pX1nf else
"6Z(0 iu:{ break;
\t)`Cp6,[b }
]AX3ov6z9; if ( ssStatus.dwCurrentState != SERVICE_RUNNING )
\;JZt[ printf("\n%s failed to run:%d",ServiceName,GetLastError());
uc/W/c u, }
|mcc?*%t8 else if(GetLastError()==ERROR_SERVICE_ALREADY_RUNNING)
pk0{*Z?@ {
^%!#Q]. //printf("\nService %s already running.",ServiceName);
y2=yh30L0E }
~7m+N)5 else
"Cs36k {
-,2CMS#N printf("\nStart Service %s failed:%d",ServiceName,GetLastError());
.aR9ulS __leave;
z7TyS.z }
6w[EJ;=p_ bRet=TRUE;
wOsg,p;\' }//enf of try
I{=Yuc __finally
45WJb+$ {
fg4mP_ return bRet;
U*?`tdXJ$ }
Zn[ppsz| return bRet;
`@#rAW D }
b7B|$T, /////////////////////////////////////////////////////////////////////////
nlA:C>= BOOL WaitServiceStop(void)
(p<pF]. {
}b/P\1#z BOOL bRet=FALSE;
Nnq1&j"m //printf("\nWait Service stoped");
iUk#hLLC while(1)
zE~Xxp {
o7@C$R_# Sleep(100);
zjOOEvi if(!QueryServiceStatus(hSCService, &ssStatus))
cQm4q19 {
K~B printf("\nQueryServiceStatus failed:%d",GetLastError());
=}.gU WV break;
3 FV -&Y }
F<XOt3VY. if(ssStatus.dwCurrentState==SERVICE_STOPPED)
QWtDZ> {
$m A2AI bKilled=TRUE;
4]6-)RHFB bRet=TRUE;
+}PN+:yV break;
Je}0KW3G9L }
+wxsAGy_j if(ssStatus.dwCurrentState==SERVICE_PAUSED)
c94=>p6 {
\`E^>6!]q //停止服务
Ov^##E bRet=ControlService(hSCService,SERVICE_CONTROL_STOP,NULL);
~H1<