关于vc里面如何重定义windows api的问题

vcmmx 2008-06-25 10:19:43
我的问题简单举例是这样的,已有1个文件
a.cpp
char *getStr()
{
static char *str;
str = GetCommandLine();
return str;
}
我现在要写一个对这个函数的测试程序,并且这个测试程序要独立出来不能写在a.cpp里面
比如说我写一个test.cpp
void main()
{
extern char *getStr();
char *str = getStr();
assert(!strcmp("123.exe -a -b", str));
}
我想让GetCommandLine()函数返回“123.exe -a -b”来测试getStr函数对不对,我怎么才能
重写或者说重定向这个函数呢?

菜鸟期待大牛指导,非常感谢
...全文
119 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
vcmmx 2008-06-25
  • 打赏
  • 举报
回复
看来要Hook API 了, 网上有没有相关资料??
cnzdgs 2008-06-25
  • 打赏
  • 举报
回复
同一个项目还是不同项目?
如果是同一个项目,在头文件最后加入:
#undef GetCommandLine
#define GetCommandLine MyGetCommandLine
LPTSTR WINAPI MyGetCommandLine();
在任意cpp文件中加入:
LPTSTR WINAPI MyGetCommandLine()
{
return _T("123.exe -a -b");
}
如果是不同项目就需要Hook API了。
vcmmx 2008-06-25
  • 打赏
  • 举报
回复
to draculacsdn :
文中我提到过“测试程序要独立出来不能写在a.cpp里面 ”, 现在是已经有了一个项目,我不能对这个项目进行更改,我只能另外建立一个测试工程来测试这个项目的函数
另外,你这个改法,会造成GetCommandLine函数重复定义错误

to healer_kx :
这么做直接写内存貌似比较冒风险吧, 还有我如何得到GetCommandLine的调用位置?

to KeSummer:
detours 好复杂,我现在就是要求对GetCommandLine()函数重定向,能不能简化下?
Amuro1987218 2008-06-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 KeSummer 的回复:]
引用 5 楼 healer_kx 的回复:
本文提供一种超级简单的Hook进程内API的方法。
主要使用到的Win32 API有以下这么多,不熟悉的朋友可以先看看它们的文档。
GetCurrentProcess(...)
WriteProcessMemory(...)

所以说他简单,是因为在这个程序里没有太多的计算相对地址的东西。
而且这个例子还有一个算是幸运的地方。那就是当我得到一个函数的地址的时候,然后去调用它的机器码恰好是5个字节。
8B 45 F8
FF D0
这个与
E8 2…
[/Quote]
vcmmx 2008-06-25
  • 打赏
  • 举报
回复
to zaodt :
本人比较菜,呵呵,感谢大牛指导
KeSummer 2008-06-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 healer_kx 的回复:]
本文提供一种超级简单的Hook进程内API的方法。
主要使用到的Win32 API有以下这么多,不熟悉的朋友可以先看看它们的文档。
GetCurrentProcess(...)
WriteProcessMemory(...)

所以说他简单,是因为在这个程序里没有太多的计算相对地址的东西。
而且这个例子还有一个算是幸运的地方。那就是当我得到一个函数的地址的时候,然后去调用它的机器码恰好是5个字节。
8B 45 F8
FF D0
这个与
E8 20 15 FF FF, call add…
[/Quote]

不使用长度反汇编引擎将会死得好惨,,并不是开头5字节都是整数条指令,并且你引入了需要同步的麻烦。。至于为什么可以参考此贴:
http://topic.csdn.net/u/20080612/19/10154bd2-09e8-42cb-935d-a1521f597728.html
推荐LZ使用detours进行api的重定向。
healer_kx 2008-06-25
  • 打赏
  • 举报
回复
本文提供一种超级简单的Hook进程内API的方法。
主要使用到的Win32 API有以下这么多,不熟悉的朋友可以先看看它们的文档。
GetCurrentProcess(...)
WriteProcessMemory(...)

所以说他简单,是因为在这个程序里没有太多的计算相对地址的东西。
而且这个例子还有一个算是幸运的地方。那就是当我得到一个函数的地址的时候,然后去调用它的机器码恰好是5个字节。
8B 45 F8
FF D0
这个与
E8 20 15 FF FF, call addr地址等长度。

我们这里以Hook 本进程内的WriteFile为例子。我们声明一个和它同型的函数:

BOOL
WINAPI
MyWriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);

我们将要所有的WriteFile都先走我们的函数MyWriteFile,然后再执行真正的WriteFile实现部分。
于是我们首先要跟踪WriteFile的调用位置。改写那里的机器码。

void* m = MyWriteFile;
__asm {
mov eax, m
call eax
}
我们先得到以上代码的Shellcode,就是8B 45 F8 FF D0;
我们写它到一个我们找到的固定地址,
CHAR szBuffer[5] = { 0x8B, 0x45, 0xF8, 0xFF, 0xD0 };
DWORD d = 0;
WriteProcessMemory(GetCurrentProcess(), (VOID*)0x7C810FA6, szBuffer, 5, &d);

这样,调用WriteFile的时候,就会跳转到MyWriteFile上了。
当然了,我们还要能够调用真正的WriteFile,我们只要在MyWriteFile的开始把那段机器码改回来就可以了。
这个和上面的方法是一样的。

BOOL WINAPI
MyWriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped)
{
CHAR szBuffer[5] = { 0xe8, 0x20, 0x15, 0xff. 0xff };
DWORD d = 0;
BOOL b = WriteProcessMemory(GetCurrentProcess(), (VOID*)0x7C810FA6, szBuffer, 5, &d);
return WriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped);
}
这样就可以了,简单吧? 这么改来改去的好处是,你不用自己出来太多的栈指针的问题。否则自己弄汇编来处理这些事情,既要写很多代码,又容易出现错误。

OK,全篇结束,这么做的价值不是很大,要是Hook 其他进程的API了,那就做屏幕取词好了。呵呵。但是原理都是相同的啊。
healer_kx 2008-06-25
  • 打赏
  • 举报
回复
哦,忘记了,我BLOG被一群IBM的白痴给淹了。
healer_kx 2008-06-25
  • 打赏
  • 举报
回复
嗯,能做到的,你按照我blog里面写得就可以了,
在进程内Hook这个API就可以了。

draculacsdn 2008-06-25
  • 打赏
  • 举报
回复
a.cpp
char *GetCommandLine()
{
return _T("123.exe -a -b");
}

char *getStr()
{
static char *str;
str = GetCommandLine();
return str;
}
zaodt 2008-06-25
  • 打赏
  • 举报
回复

看来,楼主基础还没打好啊,好多都是基础问题。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧