首页
社区
课程
招聘
[讨论]这个dll居然没法被加载,神也,奇也,神奇是也
发表于: 2008-5-18 00:21 4849

[讨论]这个dll居然没法被加载,神也,奇也,神奇是也

2008-5-18 00:21
4849
#include "stdafx.h"
#include <windows.h>

BOOL WINAPI MyTerminateProcess(HANDLE hProcess,UINT uExitCode);
bool ApiHook(char*,PROC,PROC);

DWORD oldaddr;

BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
        oldaddr=(DWORD)TerminateProcess;
        ApiHook("Kernel32.dll",(PROC)oldaddr,(PROC)MyTerminateProcess);
    return TRUE;
}

BOOL WINAPI MyTerminateProcess(HANDLE hProcess,UINT uExitcode)
{
        MessageBox(NULL,"这次你结束不了了哇,给哥哥猖獗","毛毛虫",MB_OK);
    return IDOK;
}

bool WINAPI ApiHook(char *dllname,PROC oldapi,PROC newapi)
{
        HINSTANCE hInstance=GetModuleHandle(NULL);
        BYTE *baseaddr=(BYTE*)hInstance;
        IMAGE_DOS_HEADER *dos_header=(IMAGE_DOS_HEADER*)baseaddr;
        IMAGE_NT_HEADERS *nt_headers=(IMAGE_NT_HEADERS*)(baseaddr+dos_header->e_lfanew);
        IMAGE_IMPORT_DESCRIPTOR *import_descriptor=(IMAGE_IMPORT_DESCRIPTOR*)(baseaddr+nt_headers->OptionalHeader.DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES].VirtualAddress);
        char nowdllname[MAX_PATH]={0};
        IMAGE_THUNK_DATA *thunk_data;
        while(import_descriptor->OriginalFirstThunk!=0)
        {
                strcpy(nowdllname,(char*)(baseaddr+import_descriptor->Name));
                if (strcmp(strupr(nowdllname),strupr(dllname))==0)
                {
                        thunk_data=(IMAGE_THUNK_DATA*)(baseaddr+import_descriptor->FirstThunk);
                        DWORD *thisaddr;
                        while(thunk_data->u1.Function)
                        {
                                thisaddr=(DWORD*)&(thunk_data->u1.Function);
                                if ((DWORD)thisaddr==(DWORD)oldapi)
                                {
                                        DWORD protect,numwrite;
                                        if(VirtualProtectEx(GetCurrentProcess(),(void*)(thisaddr),sizeof(DWORD),PAGE_EXECUTE_READWRITE,&protect))
                                        {
                                                if(WriteProcessMemory(GetCurrentProcess(),(void*)(thisaddr),(void*)newapi,sizeof(DWORD),&numwrite))
                                                {
                                                        VirtualProtectEx(GetCurrentProcess(),(void*)(thisaddr),sizeof(DWORD),protect,&numwrite);
                                                        return true;
                                                }
                                                else
                                                        return false;
                                        }
                                        else
                                                return false;
                                }
                                thunk_data++;
                        }
                }
                import_descriptor++;
        }
        return false;
}

小弟在学习Hookapi时写的一个dll文件,但是始终不能被加载,望各位大侠,看官 指点一二

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

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
2
MessageBox(NULL,"这次你结束不了了哇,给哥哥猖獗","毛毛虫",MB_OK);

LZ真是幽默

你这个DLL没被加载是ApiHook这个函数内部有异常。
我没时间帮你仔细看了,自己检查下这个函数吧,有问题的话再说。
2008-5-18 00:30
0
雪    币: 62
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
北极星大哥,小弟检查了一便代码,最后终于发现不了错误~~~~~,还得麻烦大哥一下

bool WINAPI ApiHook(char *dllname,PROC oldapi,PROC newapi)
{
  HINSTANCE hInstance=GetModuleHandle(NULL);
  BYTE *baseaddr=(BYTE*)hInstance;          //得到了进程基地址
  IMAGE_DOS_HEADER *dos_header=(IMAGE_DOS_HEADER*)baseaddr;    //得到DOS MZ Header的位置
  IMAGE_NT_HEADERS *nt_headers=(IMAGE_NT_HEADERS*)  //PE header的地址(baseaddr+dos_header->e_lfanew);
  IMAGE_IMPORT_DESCRIPTOR *import_descriptor=(IMAGE_IMPORT_DESCRIPTOR*)(baseaddr+nt_headers->OptionalHeader.DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES].VirtualAddress);    //哈哈,这里是导入表的位置是也
  char nowdllname[MAX_PATH]={0};
  IMAGE_THUNK_DATA *thunk_data;
  while(import_descriptor->OriginalFirstThunk!=0)    //遍历加载进来的dll
  {
    strcpy(nowdllname,(char*)(baseaddr+import_descriptor->Name));
    if (strcmp(strupr(nowdllname),strupr(dllname))==0)     //找到了需要hook的函数所在的dll
    {
      thunk_data=(IMAGE_THUNK_DATA*)(baseaddr+import_descriptor->FirstThunk);
      DWORD *thisaddr;
      while(thunk_data->u1.Function)    //遍历每个函数的地址
      {
        thisaddr=(DWORD*)&(thunk_data->u1.Function);
        if ((DWORD)thisaddr==(DWORD)oldapi)    //终于找到我们要的函数了
        {
          DWORD protect,numwrite;
          if(VirtualProtectEx(GetCurrentProcess(),(void*)(thisaddr),sizeof(DWORD),PAGE_EXECUTE_READWRITE,&protect))   
          {
            if(WriteProcessMemory(GetCurrentProcess(),(void*)(thisaddr),(void*)newapi,sizeof(DWORD),&numwrite))     //开始修改
            {
              VirtualProtectEx(GetCurrentProcess(),(void*)(thisaddr),sizeof(DWORD),protect,&numwrite);
              return true;
            }
            else
              return false;
          }
          else
            return false;
        }
        thunk_data++;
      }
    }
    import_descriptor++;
  }
  return false;
}

还是找不到错误
2008-5-18 01:05
0
雪    币: 1946
活跃值: (248)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
4
蛮好笑的
2008-5-18 02:33
0
雪    币: 29200
活跃值: (7699)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
5
楼上这句话好经典啊- -
2008-5-18 04:18
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
6
import_descriptor这个计算错误,后面怎么有这么个东西IMAGE_NUMBEROF_DIRECTORY_ENTRIES
导入表在1号入口

可能还存在其他错误,我没看下去

由于这个函数比较独立,可以直接写在EXE程序中进行调试,这样方便
到可以正常执行后再搬到DLL也不迟
2008-5-18 12:10
0
雪    币: 62
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
7
问题已经解决了,谢谢各位大侠,看官了,还有北极星大哥
2008-5-18 17:04
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
那是什么问题呢?把解决的源码发一份上来嘛。
2008-5-19 14:51
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
DWORD *thisaddr;
      while(thunk_data->u1.Function)    //遍历每个函数的地址
      {
        thisaddr=(DWORD*)&(thunk_data->u1.Function);
        if ((DWORD)thisaddr==(DWORD)oldapi)    //终于找到我们要的函数了
        {



貌似应该是  *thisaddr吧
2008-5-22 03:48
0
雪    币: 62
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
10
楼上的好眼神,一眼就看出来了
2008-5-22 11:13
0
游客
登录 | 注册 方可回帖
返回
//