首页
社区
课程
招聘
[原创]利用OD逻辑进行反调试
发表于: 2014-10-6 03:10 20798

[原创]利用OD逻辑进行反调试

2014-10-6 03:10
20798
收藏
免费 3
支持
分享
最新回复 (31)
雪    币: 967
活跃值: (1138)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
26
我没有崩溃过 我也难得录像了
2014-10-10 13:55
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
27
你连断点位置都下错了.......看下我前面的回复
2014-10-10 15:28
0
雪    币: 967
活跃值: (1138)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
28
我按照你的回复弄了 是不是要再弄个视频啊
2014-10-10 17:50
0
雪    币: 135
活跃值: (63)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
29
十一的时候在家里调试了一会,32位系统,但是我没出现这个情况。不知道能不能表达清楚。
我在循环创建线程的下一句下了硬件断点(改了程序代码),然后断下来,取消,f8/f9。(刚又调试了下)
0041152F  ^\EB B6           jmp     short 004114E7                         ; 循环创建线程
00411531    8BF4            mov     esi, esp                               ; 线程函数的0x401000改成了0x411531
00411533    68 3C574100     push    0041573C                               ; ASCII "pause"
00411538    FF15 0C834100   call    dword ptr [<&MSVCR90D.system>]         ; MSVCR90D.system
0041153E    83C4 04         add     esp, 4
00411541    3BF4            cmp     esi, esp
00411543    E8 07FCFFFF     call    0041114F



不理解为什么会SetThreadContext失败(我没失败),好像是挂起所有线程再设置的硬件断点,但是又不知道是不是x64的问题,是我没有理解原理吗。
还有个问题,取值*(DWORD *) 0x401000 和Post(0,0,0,0)为什么能起到保护作用呢。
2014-10-13 18:59
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
30
SetThreadContext 失败的原因很多,比如线程状态,模式等等.
取值*(DWORD *) 0x401000 和Post(0,0,0,0)为什么能起到保护作用;因为他们能触发1号中断(因为SetThreadContext失败了),而这个中断是调试器不处理的异常,造成程序报错!

而且啊 我说的保护地方是函数跟地址,而不是我写的那几个线程.
2014-10-13 20:40
0
雪    币: 135
活跃值: (63)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
31
我还是没理解,为什么开了线程,就会SetThreadContext失败,好像我没失败。整个过程像下面的代码可以吗,改了一下。(调试的时候线程居然没有断,不理解,上班偷偷发帖晚上再研究。。)
#include <windows.h>
#include <stdio.h>

DWORD dwTarget = 123;
VOID WINAPI CheckThread(LPVOID lp)
{
  while (TRUE){
    Sleep(3 * 1000);
    DWORD dwPorcet;
//    VirtualProtect((PVOID)0x00417014, 5, PAGE_EXECUTE_READWRITE, &dwPorcet);
	VirtualProtect((PVOID)&dwTarget, 5, PAGE_EXECUTE_READWRITE, &dwPorcet);
//    DWORD dwAdder = *(DWORD*)0x401000;  ///保护这个地址
	DWORD x = dwTarget;
    PostMessageA(NULL, NULL, NULL, NULL);     ///保护这个函数执行过程
  }
}

HANDLE  hThread[25];


int main(int argc, char* argv[])
{
  for (int i = 0; i < 25; i++)
  {
    Sleep(10);
    hThread[i] = ::CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)CheckThread, NULL, NULL, NULL);

  }

  __asm nop								//调高优先级
  __asm nop	
  int x = dwTarget;						//下硬件断点,然后删除,F9
  __asm nop		 
  __asm nop	
  Sleep(1000);								//让线程访问
//  x = dwTarget;						//下硬件断点,然后删除,F9
  system("pause");
  return 0;
}

2014-10-14 11:07
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
OD确实有很多问题,系统自带的计算器,od附加上去,点运行都会崩溃!
2015-6-11 15:26
0
游客
登录 | 注册 方可回帖
返回
//