回 帖 发 新 帖 刷新版面

主题:[讨论]诡异的程序,连续三次调用 help() 函数?

[code=c]
// VC6.0 
#include "stdio.h"
#include "windows.h"
#include "tchar.h"

BYTE addr_old[8] = {0};
BYTE addr_new[8] = { 0xB8, 0x20, 0x10, 0x40, 0x00, 0xFF, 0xE0, 0x00 }; 
DWORD pfnMsgBox=0; //API函数地址

int help()
{
    printf(" help ??\n");
    return 0;
}

//----------------------------------------------程序入口
int main()
{
    DWORD dwOldProtect;
    MEMORY_BASIC_INFORMATION   mbi;
    
    MessageBox(NULL,_T("Hook Demo!"),_T("API Hook"),MB_ICONINFORMATION);
    pfnMsgBox=(DWORD)GetProcAddress(GetModuleHandle(_T("user32.dll")),_T("MessageBoxA"));
    printf("api 入口地址: %x\n",pfnMsgBox);
    
    VirtualQuery( (void *)pfnMsgBox, &mbi, sizeof(mbi) );
    //修改我们要改的地址的页属性,为可读可写
    VirtualProtect( (void *)pfnMsgBox, 8, PAGE_READWRITE, &dwOldProtect);
    
    // 保存原来的执行代码
    memcpy(addr_old, (void *)pfnMsgBox, 8);
    
    // 写入新的执行代码
    WriteProcessMemory( GetCurrentProcess(),
        (void *)pfnMsgBox,
        addr_new,
        sizeof(DWORD)*2,
        NULL);
    //修改为原来的属性属性
    VirtualProtect((void *)pfnMsgBox, 8, mbi.Protect, 0);
    
    //当调用这个函数的时候就跳到我的函数上面了
    MessageBox(NULL,_T("Hook Demo!"),_T("API Hook"),MB_ICONINFORMATION);
    
    
    getchar();
    return 0;
}
[/code]

大家能看到我的程序中哪里调用了 help() 函数吗?

回复列表 (共5个回复)

沙发

貌似是一个hack手法。我在我们的工作项目里面也看到了这样的代码,但是写得更加隐晦一点。
这个恐怕移植性比较差,我刚才用Visual C++ 2008编译运行,结果崩溃了。

板凳

是的,不同的编译器有不同的效果
即使使用vc6.0,release下也是失败的

3 楼

形似于栈溢出攻击的示例代码。
在反跟踪时也常用类似的代码:)
不过反跟踪用的更多的是在jmp后增加随机数(混乱法)及用return来调用函数、call来返回(障眼法)
无非就是修改栈值:)

4 楼

恩,最终查明是硬编码的地址值 0x20, 0x10, 0x40, 0x00 就对应help函数地址(VC6.0的debug模式)

5 楼

你好.我是全职网赚工作者.
如果你有时间有电脑.
想在网络上创业.请联系我..
项目绝对真实.详情QQ空间资料
加盟请联系 QQ908889846

我来回复

您尚未登录,请登录后再回复。点此登录或注册