摘要:一、几个重要的数据结构,可以通过windbg的dt命令查看其详细信息_PEB、_PEB_LDR_DATA、_LDR_DATA_TABLE_ENTRY二、技术原理1、通过fs:[30h]获取当前进程的_PEB结构2、通过_PEB的Ldr成员获取_PEB_LDR_DATA结构3、通过_PEB_LDR_DATA的InMemoryOrderModuleList成员获取_LIST_ENTRY结构4、通过_LIST_ENTRY的Flink成员获取_LDR_DATA_TABLE_ENTRY结构,注意:这里的Flink指向的是_LDR_DATA_TABLE_ENTRY结构中的InMemoryOrderLink
阅读全文
摘要:反调试技巧总结-原理和实现-------------------------------------------------------------------------------------------------------2008.8.7shellwolf一、前言前段学习反调试和vc,写了antidebug-tester,经常会收到message希望交流或索要实现代码,我都没有回复。其实代码已经在编程版提供了1个版本,另其多是vc内嵌asm写的,对cracker而言,只要反下就知道了。我想代码其实意义不是很大,重要的是理解和运用。做个简单的总结,说明下实现原理和实现方法。也算回复了那
阅读全文
摘要:1.fs寄存器指向TEB结构 2.在TEB+0x30地方指向PEB结构 3.在PEB+0x0C地方指向PEB_LDR_DATA结构 4.在PEB_LDR_DATA+0x1C地方就是一些动态连接库地址了,如第一个指向ntdll.dll,第二个就是kernel32.dll的地址。 其结构示意图如图 利用PEB查找kernerl32地址的汇编实现 mov eax, fs:0x30 ;PEB的地址 mov eax, [eax + 0x0c] ;Ldr的地址 mov esi, [eax + 0x1c] ;Flink地址 lodsd mov eax, [eax + 0x08] ;eax就是kernel3.
阅读全文
摘要:FS寄存器指向当前活动线程的TEB结构(线程结构)偏移 说明000 指向SEH链指针004 线程堆栈顶部008 线程堆栈底部00C SubSystemTib010 FiberData014 ArbitraryUserPointer018 FS段寄存器在内存中的镜像地址020 进程PID024 线程ID02C 指向线程局部存储指针030 PEB结构地址(进程结构)034 上个错误号fs:[30]->PEBtypedefstruct_PEB{//Size:0x1D8000hUCHARInheritedAddressSpace;001hUCHARReadImageFileExecOptions
阅读全文
摘要:1 #include <windows.h> 2 #include <winnt.h> 3 //下面这行告诉链接器在PE文件中要创建TLS目录 4 #pragma comment(linker, "/INCLUDE:__tls_used") 5 //这是PIMAGE_TLS_CALLBACK()函数的原型 6 //其中第一个和第三个参数保留,第二个参数决定函数在那种情况下 7 void NTAPI my_tls_callback(PVOID h, DWORD reason, PVOID pv) 8 { 9 ///共有四个选项DLL_PROCESS_A
阅读全文
摘要:PE文件结构的目录表(directory table)中有一个是IMAGE_DIRECTORY_ENTRY_TLS (9)线程级局部存储目录,如果此处非零的话,PE将会有一个tls节,tls节以结构IMAGE_TLS_DIRECTORY(winnt.h)开始 typedef struct _IMAGE_TLS_DIRECTORY32 { DWORD StartAddressOfRawData; DWORD EndAddressOfRawData; PDWORD AddressOfIndex; PIMAGE_TLS_CALLBACK *AddressOfCallBacks; DWORD Size
阅读全文
摘要:1.什么是TLS?TLS是ThreadLocalStorage(线程局部存储)的简称,是一项解决多线程内部变量使用问题的技术。用于将某些数据和一特定线程关联起来,即,这些数据为关联线程所独有(私有)。在多线程编程中,同一个变量,如果要让多个线程共享访问,那么这个变量可以使用关键字volatile进行声明;而如果一个变量不想被多个线程共享访问,那么就应该使用TLS。2.如何使用TLS编程?TLS使用非常简单,只要对变量声明时使用__declspec(thread)修饰就可以了。例如:__declspec(thread) int g_nData = 0;3.一个使用TLS的例子 1 #includ
阅读全文
摘要:首先1od下运行程序,F12暂停;2View菜单中选击Windows项,在打开的窗口中可以从Title栏看到目标按钮,从而找到它的Handle(xxxxxxxx);对不同平台生成的程序,分别处理:一、VB,Delphi,CBuilder程序:3在CallWindowProcA入口下条件断点:[esp+8]==xxxxxxxx&&[esp+0c]==202;4F9继续程序,点击目标按钮,程序中断;5Alt+F4,在代码段(.text)上下访问断点;6F9执行程序,程序中断,1).VB程序中断在下面代码PUSHDWORDPTRDS:[EAX+EBX];yyyyyyy上面[EAX+E
阅读全文
摘要:对于SqlServer的优化来说,可能优化查询是很常见的事情。关于数据库的优化,本身也是一个涉及面比较的广的话题,本文只谈优化查询时如何看懂SqlServer查询计划。由于我对SqlServer的认识有限,如有错误,也恳请您在发现后及时批评指正。首先,打开【SQL Server Management Studio】,输入一个查询语句看看SqlServer是如何显示查询计划的吧。说明:本文所演示的数据库,是我写的一个演示程序专用的数据库, selectv.OrderID,v.CustomerID,v.CustomerName,v.OrderDate,v.SumMoney,v.Finishedfr
阅读全文
摘要:查看sql次数和逻辑次数的语句SELECTcreation_timeN'语句编译时间',last_execution_timeN'上次执行时间',total_physical_readsN'物理读取总次数',total_logical_reads/execution_countN'每次逻辑读次数',total_logical_readsN'逻辑读取总次数',total_logical_writesN'逻辑写入总次数',execution_countN'执行次数',total_work
阅读全文
摘要:分析sql执行计划重用次数,查看绑定变量使用情况selecttotal_elapsed_time/execution_count平均时间,total_logical_reads/execution_count逻辑读,usecounts重用次数,SUBSTRING(d.text,(statement_start_offset/2)+1,((CASEstatement_end_offsetWHEN-1THENDATALENGTH(text)ELSEstatement_end_offsetEND-statement_start_offset)/2)+1)语句执行fromsys.dm_exec_cac
阅读全文
摘要:dmv分析索引的使用情况,包括扫描次数,更新次数,有利于你评估设计的索引使用效率,sql server 2005的确比2000在性能分析上提高很多。user_seeks :通过用户查询执行的搜索次数。个人理解: 此统计索引seek的次数user_scans:通过用户查询执行的扫描次数。个人理解:此统计表扫描的次数,无索引配合user_lookups:通过用户查询执行的查找次数。个人理解:用户通过索引查找,在使用RID或聚集索引查找数据的次数,对于堆表或聚集表数据而言和索引配合使用次数user_updates: 通过用户查询执行的更新次数。个人理解:索引或表的更新次数---使用很少的索引排在最先
阅读全文
摘要:--查询死锁和阻塞的sql语句SELECTCAST(REPLACE(REPLACE(XEventData.XEvent.value('(data/value)[1]','varchar(max)'),'<victim-list>','<deadlock><victim-list>'),'<process-list>','</victim-list><process-list>')ASXML)ASDeadlockGraphFROM
阅读全文
摘要:createPROCEDURE[dbo].[auto_checkblocks]ASsetnocountonifexists(select*frommaster..sysprocesseswhereblocked<>0)begin/**//*showtopblockers,butnoduplicates*/select'请尝试使用KILL[SPID]来杀进程'--select'请尝试使用SP_LOCK[SPID]来显示锁信息,用OBJECT_NAME(ID)来显示锁对象名称或用sp_who[SPID]来显示信息'--select'在使用OBJE
阅读全文
摘要:寄存器是CPU内部用来放置数据和地址的存储单元,各种32位CPU中与微机原理有关的寄存器(编程可见)是一样的。本节仍以80486为例机来讨论,但结论可以不加修改地用于其它32位CPU。位于CPU内部不同部件的寄存器有不同的作用,每个寄存器都有自己的功能。根据寄存器的性质,把编程可见的寄存器分成9组,并给每个编程可见的寄存器(以后简称寄存器)取一个名称1 通用寄存器通用寄存器中,32位寄存器EAX,EBX,ECX,EDX,EBP,ESP,ESI和EDI,它们既可保存逻辑和算术运算中的操作数,也可保存地址运算中的操作数(ESP寄存器不能用作基址寄存器)。这些寄存器的名称源于8086处理机的通用寄存
阅读全文
摘要:今天查资料的时候发现 VS 编译器 CL 的一个编译选项可以查看 C++ 类的内存布局,非常有用。使用如下,从开始程序菜单找到 Visual Stdio 2008/2005 Command Prompt,选择 VS 的命令行工具,按如下格式使用:>cl –d1reportSingleClassLayout[classname] test.cpp而使用 –d1reportAllClassLayout 则可以查看源文件中所有类及结构体的内存布局。其中,classname 为类名,-d1reportSingleClassLayout[classname] 之间没有空格。编写程序测试:比较奇怪,
阅读全文
摘要:作为一个经验丰富的C/C++程序员, 肯定亲手写过各种功能的代码, 比如封装过数据库访问的类, 封装过网络通信的类,封装过日志操作的类, 封装过文件访问的类, 封装过UI界面库等, 也在实际的项目中应用过, 但是回过头仔细想想,其实以前自己写过的这些代码,只能是在特定的项目或者特定的环境中使用, 对于自己来说, 在不同的项目中应用, 只需要复制代码, 改改也就可以了, 因为自己写的代码自己很熟悉。问题是, 你封装的这些库, 在给别人使用的时候, 别人用起来是否很方便, 跨平台方面是不是也很通用, 性能是不是足够的好, 是不是支持多线程, 功能是不是也足够强大,可以适用于各种不同的需求。如果..
阅读全文