Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

《软件调试》的示例程序

帖子发起人: 想睡觉   发起时间: 2008-11-11 23:57 下午   回复: 4

Print Search
帖子排序:    
   2008-11-11, 23:57 下午
whereisthesymbol 离线,最后访问时间: 2008/11/14 23:06:43 想睡觉

发帖数前500位
注册: 2008-11-11
发 贴: 2
Zip it! [:#] ETHREAD为什么会出错?
Reply Quote
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 上午
WANGyu 离线,最后访问时间: 2012/9/10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: ETHREAD为什么会出错?
Reply Quote
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 离线,最后访问时间: 2009/12/24 22:33:41 MJ0011

发帖数前10位
注册: 2008-04-24
发 贴: 112
Re: ETHREAD为什么会出错?
Reply Quote
cross flag & systemdebugcontrol

both S H I T
IP 地址: 已记录   报告
   2008-11-12, 09:14 上午
whereisthesymbol 离线,最后访问时间: 2008/11/14 23:06:43 想睡觉

发帖数前500位
注册: 2008-11-11
发 贴: 2
Re: ETHREAD为什么会出错?
Reply Quote
我主要针对的是XP SP2,x86的系统。实际上第一个ETHREAD的MemChunks写入成功了,后面的遍历我用WinDbg调试跟踪也找到了第1个线程的ETHREAD的cross flag ,其标志为0x10是正确的。我不明白的是通过_LIST_ENTRY遍历线程为什么会出错???!!!地址偏移是匹配的。我是要在Ring3级实现。不是病毒啊,我只是要保护我的2个UI线程和4个工作线程。因为是关系到数据安全的,不能随便关闭的,要权限的。

我的防杀不能使用守护线程之类的方法,它不是病毒。是不是要设置什么线程的Alert状态?我是菜鸟,请高手指教!谢谢.

IP 地址: 已记录   报告
   2008-11-12, 12:49 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: ETHREAD为什么会出错?
Reply Quote
与王宇和MJ一样,我也不赞成使用这样的方法,从这个角度努力是不可能根本解决问题的,而且容易引入额外的问题。不清楚你要达到的根本目的是什么?防止线程被其它程序杀掉,还是防止意外退出?建议你还是从算法和设计方面彻底解决问题,比如要让每个工作线程的关键操作原子化,有守护线程来监视工程线程,等等。
IP 地址: 已记录   报告
高端调试 » 图书 » 《软件调试》的示例程序 » Re: ETHREAD为什么会出错?

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.