首页
社区
课程
招聘
隐含调用API的新的想法,98/Me/2000/XP上已经验证通过.
发表于: 2004-12-18 10:33 4852

隐含调用API的新的想法,98/Me/2000/XP上已经验证通过.

2004-12-18 10:33
4852
我们不希望一些API调用被截获,常用的方法是检测API的开头处是否有断点,但是这样对于硬件断点就没有办法了.我想了一个方法,已经验证.请各位看看,讨论讨论.

说明: 我们要查看是否有 \\.\NTICE的设备在系统中.
我们需要调用
h = CreateFile("\\\\.\\NTICE", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
看看是不是能打开这个设备. 当Cracker截获这个调用,很容易发现我们的企图.

但是,
我们可以这样构造,首先我们给\\.\NTICE定义一个ID, 比如 0xfefefefe, 注意,这个ID一定要是一个非法的内存,可以用IsBadReadPtr or IsBadWritePtr检验一下先. 然后我们调用 CreateFile(0xfefefefe, ....);
这时候当CreateFile访问0xfefefefe的时候,就是说CreateFile想用这个字符串了,我们可以捕获这个异常,然后修改CreateFile运行过程中的寄存器,使CreateFile能正常工作.
这样我们就能检测到这个设备是否在使用了.而Cracker在CreateFile上设置断点,不会事先知道我们要干什么.

static int _OnHandleException(DWORD dwID, LPEXCEPTION_POINTERS p)
{
        BOOL bFindOurID = false;
        int* pn = (int*)&(p->ContextRecord->Edi);
        for (int i = 0; i < 12; i++)
        {
                int ids = *(pn + i);
                if (ids == dwID)
                {
                        *(pn + i) = "\\\\.\\NTICE";
                        bFindOurID = true;
                }
        };
        if (bFindOurID)
                return EXCEPTION_CONTINUE_EXECUTION;
        else
                return EXCEPTION_CONTINUE_SEARCH;
}

static HANDLE _SafeOpenFile(DWORD dwID0xfefefefe)
{
        HANDLE h = NULL;
       
        __try
        {
                h = CreateFile((const char*)dwID0xfefefefe, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        }
        __except(_OnHandleException(dwID0xfefefefe, GetExceptionInformation()))
        {
        }
        return h;
}

欢迎指教.

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (11)
雪    币: 390
活跃值: (707)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
2
很有价值。

不过想问一下。如果作为Crack的我,安装了VEH,那么我应该比你先捕获异常(XP下)。如果我忽略呢?

另外,我要是不动CreateFile,写文件过滤驱动的话,你怎么办???!!!!
2004-12-18 10:52
0
雪    币: 216
活跃值: (101)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
我知道这种方法是防不住高手的.

1 如果忽略异常,程序应该不能继续运行,内存访问违例.
2 文件过滤,这种办法就歇菜了 :(

这只是一个想法,只是在一定程度上能躲过菜鸟的侦察而已我想.
2004-12-18 11:04
0
雪    币: 390
活跃值: (707)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
4
也不要文件驱动。因为你是搞CreateFile,我只要Hook了ZwCreateFile就可以了。

另外,我看见异常ID,就会去找你的SEH。还有,你在程序里放个
\\\\.\\NTICE,不要跟踪也知道你想干什么。除非你加密。

只是瞎掰一下,还真说中了。

不过应该没人会为了Crack去专门写file filter,代价高了点。另外,我说的只是原理,真要做,代价挺高,但你的方法代价不大。所以较有实用价值
2004-12-18 11:34
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
5
楼主的方法,像一般的 SEH 异常的做法一样,利用 SEH 去避开 cracker 的跟踪,但是 cracker 在你安装 SEH 的时候,已经可以知道你的路向

你的 C 程序编译后,会产生出一段设定 FS 暂存器的代码,在 OD 下也会出现 SEH 安装的提示
2004-12-18 11:50
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
6
没有用啊,最终还是在CreateFileA,等着你修复参数就可以
2004-12-18 13:17
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
7
赞成楼上的说法
2004-12-18 14:13
0
雪    币: 390
活跃值: (707)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
8
最初由 forgot 发布
没有用啊,最终还是在CreateFileA,等着你修复参数就可以


那我要是挂CreateFileA和CreateFileW呢?
2004-12-18 20:44
0
雪    币: 213
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
那就在到了里面一点,
挂不是办法,
模拟最好
2004-12-18 21:15
0
雪    币: 260
活跃值: (162)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
SEH修复后 最终还是需要运行到CreateFile入口的
2004-12-19 11:59
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
11
最初由 firstrose 发布


那我要是挂CreateFileA和CreateFileW呢?

rpwt,误解我了,见vcasm
2004-12-19 12:15
0
雪    币: 390
活跃值: (707)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
12
最初由 forgot 发布

rpwt,误解我了,见vcasm


汗一个,RPWT……连SEH的特点都忘掉了……

但是这应该是反静态分析的好方法。
2004-12-19 13:59
0
游客
登录 | 注册 方可回帖
返回
//