  | 
					  | 
					  |  
					
					
	
    
 | 
                  
                    | 
                    | 					
				  
				            
					            
						            
							            
								            | 
									            
								             | 
            								
								            
									            
	《软件调试》的示例程序
	帖子发起人: 想睡觉   发起时间: 2008-11-11 23:57 下午   回复: 4
	
	
 
 
	 
		
			
				
					
						
							
							   
							
   
							
							
						 | 
						
						    
						      
						        | 
							          帖子排序: 
							            
						         | 
						        
							          
							          
						         | 
						       
						     
						 | 
					 
				 
			 | 
		 
	 
	
			
				
					
						
							
								
									
										
											
												
												 
                            2008-11-11, 23:57 下午
                        
											 | 
										 
										
											
												
													 
													
														想睡觉
													
													
														 
														
  
														 注册: 2008-11-11
														
														 发 贴: 2
														
													
											  | 
											
												
													
														
															
																 
																
																	ETHREAD为什么会出错? 
																
															
														 | 
													 
													
														| 
														  
														 | 
													 
												 
												
											 | 
										 
										
											
												
													
														
															 
														 | 
														
															
																
																	
																		
1
 ulETHREAD为得到的某进程的第1个线程的ETHREAD
 
 2
 ulETHNext 为下1个ETHREAD结构的首地址
 ULONG dwETHNext = (*(ULONG*)(ulETHREAD+0x1b0))-0x1b0;  
 
 3
 dwPIDTemp 为ETHREAD结构的进程ID
 ULONG ulPIDTemp = (ULONG)((*(ULONG*)(ulETHREAD+0x220))+0x084);
 
 4
 while(dwETHNext != dwETHREAD)  
 {
        //5
       if(dwPID == dwPIDTemp)
      {
 	datas.Address = dwETHREAD+0x248;//CrossThreadFlags的偏移
 				datas.Data = &g_dwProtectCode;
 				datas.Length = 4;
 				status = NtSystemDebugControl(0x9,&datas,
 					sizeof(MEMORY_CHUNKS),NULL,0,&dwRetLen);
 
      }
 
 //6
 dwETHNext = (*(ULONG*)(dwETHREAD+0x1b0))-0x1b0;
 
 
 dwPIDTemp = (ULONG)((*(ULONG*)(dwETHREAD+0x220))+0x084);
 }
 
 
 张老师,我的地址都是通过WINDGB计算得到的,可是程序运行出错(崩溃了),权限没有问题。
 请帮我看看,主要作用是线程防杀。
 
 代码写得很乱!!!
																		 
																	 | 
																 
															 
														 | 
													 
													
														| 
															
														 | 
														
															IP 地址: 已记录  
														 | 
														
															报告
														 | 
													 
												 
											 | 
										 
									 
								 | 
							 
						 
					 | 
				 
			 
		
			
				
					
						
							
								
									
										
											
												
												 
                            2008-11-12, 00:20 上午
                        
											 | 
										 
										
											
												
													 
													
														王宇
													
													
														 
														
  
  
														 注册: 2007-05-08
														
														 发 贴: 306
														
													
												 
											 | 
											
												
												
											 | 
										 
										
											
												
													
														
															 
														 | 
														
															
																
																	
																		
1. 硬编码太多无法跨平台
 2. 这么硬生生的遍历线程链, 夸张了吧?
 3. 分析Bug还是要贴DMP文件出来
 4. 防杀有非常多的方法 APC就不错
 (KiXXX Inline 一下过滤,另自己实现请参考:http://hi.baidu.com/iceboy%5F/blog/item/5267adc21300f853b319a8ef.html)
																		 
																	 | 
																 
															 
														 | 
													 
													
														| 
															
														 | 
														
															IP 地址: 已记录  
														 | 
														
															报告
														 | 
													 
												 
											 | 
										 
									 
								 | 
							 
						 
					 | 
				 
			 
		
			
				
					
						
							
								
									
										
											
												
												 
                            2008-11-12, 03:08 上午
                        
											 | 
										 
										
											
												
													 
													
														MJ0011
													
													
														 
														
  
														 注册: 2008-04-24
														
														 发 贴: 112
														
													
											  | 
											
												
												
											 | 
										 
										
											
												
													
														
															 
														 | 
														
															
																
																	
																		
cross flag & systemdebugcontrol 
 
 both S H I T
																		 
																	 | 
																 
															 
														 | 
													 
													
														| 
															
														 | 
														
															IP 地址: 已记录  
														 | 
														
															报告
														 | 
													 
												 
											 | 
										 
									 
								 | 
							 
						 
					 | 
				 
			 
		
			
				
					
						
							
								
									
										
											
												
												 
                            2008-11-12, 09:14 上午
                        
											 | 
										 
										
											
												
													 
													
														想睡觉
													
													
														 
														
  
														 注册: 2008-11-11
														
														 发 贴: 2
														
													
												 
											 | 
											
												
												
											 | 
										 
										
											
												
													
														
															 
														 | 
														
															
																
																	
																		
我主要针对的是XP SP2,x86的系统。实际上第一个ETHREAD的MemChunks写入成功了,后面的遍历我用WinDbg调试跟踪也找到了第1个线程的ETHREAD的cross flag ,其标志为0x10是正确的。我不明白的是通过_LIST_ENTRY遍历线程为什么会出错???!!!地址偏移是匹配的。我是要在Ring3级实现。不是病毒啊,我只是要保护我的2个UI线程和4个工作线程。因为是关系到数据安全的,不能随便关闭的,要权限的。
 
 我的防杀不能使用守护线程之类的方法,它不是病毒。是不是要设置什么线程的Alert状态?我是菜鸟,请高手指教!谢谢.
 
																		 
																	 | 
																 
															 
														 | 
													 
													
														| 
															
														 | 
														
															IP 地址: 已记录  
														 | 
														
															报告
														 | 
													 
												 
											 | 
										 
									 
								 | 
							 
						 
					 | 
				 
			 
		
			
				
					
						
							
								
									
										
											
												
												 
                            2008-11-12, 12:49 下午
                        
											 | 
										 
										
											
												
													 
													
														格蠹老雷
													
													
														 
														
  
														 注册: 2005-12-19
														
														 发 贴: 1,303
														
													
											  | 
											
												
												
											 | 
										 
										
											
												
													
														
															 
														 | 
														
															
																
																	
																		
与王宇和MJ一样,我也不赞成使用这样的方法,从这个角度努力是不可能根本解决问题的,而且容易引入额外的问题。不清楚你要达到的根本目的是什么?防止线程被其它程序杀掉,还是防止意外退出?建议你还是从算法和设计方面彻底解决问题,比如要让每个工作线程的关键操作原子化,有守护线程来监视工程线程,等等。
																		 
																	 | 
																 
															 
														 | 
													 
													
														| 
															
														 | 
														
															IP 地址: 已记录  
														 | 
														
															报告
														 | 
													 
												 
											 | 
										 
									 
								 | 
							 
						 
					 | 
				 
			 
		
	
	
		
			| 
				高端调试 » 图书 » 《软件调试》的示例程序 » ETHREAD为什么会出错?
			 | 
			
				
			 | 
		 
	 
	
 
								             | 
                                              | 					
								            
									            
								             | 
							             
						             
					             
				             
			          
                     |