- UID
- 2
- 精华
- 积分
- 7750
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
本帖最后由 元始天尊 于 2014-8-8 12:11 编辑
bpx function_name
拦截keyfile.key的CreateFile bpx CreateFileA if(*(esp->4)=='keyf')
对于不从API第一个字节执行的保护机制,需要在中断和内核API上下断。
中断大全http://www.cs.cmu.edu/~ralf/files.html
内核API大全http://undocumented.ntinternals.net
ollydbg条件断点:EAX=="mypswd"
Delphi,Builder,MFC,VB库函数断点
消息断点:BMSG 句柄 WM_COMMAND
数据断点:对用户输入的判断、程序修改校验的破解
bpx CreateFileA DO "D esp->4 L 20;x;"
bpx CreateFileA if byte (*esp->4)=='a' DO xxx
反调试法:PUSHFD/POP REG读取FLAGS寄存器,检查TF位
跟踪:捕获特定指令
下面这些出于自己的研究:
IsDebuggerPresent()检查是否处于调试状态
- #include <Windows.h>
- void main()
- {
- if(IsDebuggerPresent())
- printf("Being debugged\n");
- else
- printf("Not Being debugged\n");
- }
复制代码
我在vs中使用了以后,单步调试,得到:
IsDebuggerPresent();
003513A0 call dword ptr [__imp__IsDebuggerPresent@0 (358198h)]
跟进以后:761EAFB3 jmp 761EAFA8
再跟进: 761EAFA8 jmp dword ptr ds:[761A1D8Ch]
再跟进: 75D67AAC mov eax,dword ptr fs:[00000018h]
75D67AB2 mov eax,dword ptr [eax+30h]
75D67AB5 movzx eax,byte ptr [eax+2]
75D67AB9 ret
fs中存的是TEB线程结构:
偏移 说明
000 指向SEH链指针
004 线程堆栈顶部
008 线程堆栈底部
00C SubSystemTib
010 FiberData
014 ArbitraryUserPointer
018 FS段寄存器在内存中的镜像地址
020 进程PID
024 线程ID
02C 指向线程局部存储指针
030 PEB结构地址(进程结构)
034 上个错误号
PEB结构:
- /*000*/ UCHAR InheritedAddressSpace;
- /*001*/ UCHAR ReadImageFileExecOptions;
- /*002*/ UCHAR BeingDebugged;
- /*003*/ UCHAR SpareBool; // Allocation size
- /*004*/ HANDLE Mutant;
- /*008*/ HINSTANCE ImageBaseAddress; // Instance
- /*00C*/ VOID *DllList;
- /*010*/ PPROCESS_PARAMETERS *ProcessParameters;
- /*014*/ ULONG SubSystemData;
- /*018*/ HANDLE DefaultHeap;
- /*01C*/ KSPIN_LOCK FastPebLock;
- /*020*/ ULONG FastPebLockRoutine;
- /*024*/ ULONG FastPebUnlockRoutine;
- /*028*/ ULONG EnvironmentUpdateCount;
- /*02C*/ ULONG KernelCallbackTable;
- /*030*/ LARGE_INTEGER SystemReserved;
- /*038*/ ULONG FreeList;
- /*03C*/ ULONG TlsExpansionCounter;
- /*040*/ ULONG TlsBitmap;
- /*044*/ LARGE_INTEGER TlsBitmapBits;
- /*04C*/ ULONG ReadOnlySharedMemoryBase;
- /*050*/ ULONG ReadOnlySharedMemoryHeap;
- /*054*/ ULONG ReadOnlyStaticServerData;
- /*058*/ ULONG AnsiCodePageData;
- /*05C*/ ULONG OemCodePageData;
- /*060*/ ULONG UnicodeCaseTableData;
- /*064*/ ULONG NumberOfProcessors;
- /*068*/ LARGE_INTEGER NtGlobalFlag; // Address of a local copy
- /*070*/ LARGE_INTEGER CriticalSectionTimeout;
- /*078*/ ULONG HeapSegmentReserve;
- /*07C*/ ULONG HeapSegmentCommit;
- /*080*/ ULONG HeapDeCommitTotalFreeThreshold;
- /*084*/ ULONG HeapDeCommitFreeBlockThreshold;
- /*088*/ ULONG NumberOfHeaps;
- /*08C*/ ULONG MaximumNumberOfHeaps;
- /*090*/ ULONG ProcessHeaps;
- /*094*/ ULONG GdiSharedHandleTable;
- /*098*/ ULONG ProcessStarterHelper;
- /*09C*/ ULONG GdiDCAttributeList;
- /*0A0*/ KSPIN_LOCK LoaderLock;
- /*0A4*/ ULONG OSMajorVersion;
- /*0A8*/ ULONG OSMinorVersion;
- /*0AC*/ USHORT OSBuildNumber;
- /*0AE*/ USHORT OSCSDVersion;
- /*0B0*/ ULONG OSPlatformId;
- /*0B4*/ ULONG ImageSubsystem;
- /*0B8*/ ULONG ImageSubsystemMajorVersion;
- /*0BC*/ ULONG ImageSubsystemMinorVersion;
- /*0C0*/ ULONG ImageProcessAffinityMask;
- /*0C4*/ ULONG GdiHandleBuffer[0x22];
- /*14C*/ ULONG PostProcessInitRoutine;
- /*150*/ ULONG TlsExpansionBitmap;
- /*154*/ UCHAR TlsExpansionBitmapBits[0x80];
- /*1D4*/ ULONG SessionId;
复制代码 mov eax,dword ptr fs:[00000018h] TEB偏移0x18处取出的值是镜像,所以EAX仍然指向TEB//见过很多次了,现在还不明白为什么不能直接用,而是先取镜像,,,难道为了某种兼容目的?
mov eax,dword ptr [eax+30h] TEB偏移0x30处取出的是TEB结构
movzx eax,byte ptr [eax+2] PEB偏移0x02处为BeingDebugged,作为返回
对于反检测方式,只需要在调试器中手工将该位改动回来即可
测试:程序中加入
- _asm
- {
- mov eax,dword ptr fs:[00000018h];
- mov eax,dword ptr [eax+30h];
- mov byte ptr [eax+2],0;
- }
复制代码 debug状态消除
下面这些代码检测TF位检测调试器
- #include <stdio.h>
- int _tmain(int argc, _TCHAR* argv[])
- {
- _asm PUSHFD;
- //在这里调试
- _asm
- {
- POP EAX;
- AND EAX,100h;
- JNZ BEINGDEBUGGED;
- }
- printf("Not being debugged");
- getchar();
- return 0;
- BEINGDEBUGGED:
- printf("Being debugged");
- getchar();
- return 0;
- }
复制代码 对于这种方式的检测,只需要在调试器执行入口时改动eflags即可
测试:程序中加入
- _asm
- {
- PUSHFD;
- POP EAX;
- AND EAX,~100h;
- POPFD;
- }
复制代码 debug状态消除 |
|