Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Странности с загрузкой dll

2.4K
25 июня 2005 года
Lenin
51 / / 05.12.2004
здравствуйте
такая проблемаЖ
имеется код написанной мною проги:
Код:
#include <windows.h>
#include <Tlhelp32.h>
//#pragma comment(lib,"user32.lib")
#pragma comment(linker,"/BASE:0x13140000")
#include <iostream>
using namespace::std;

int i=0;

class Storage
{
public:
    Storage* next;
    int cId;
    char cName[100];
    int (*pf)(void* a,void* b,void* c,void* d);
    Storage()
    {
        cId=0;
        ZeroMemory(cName,sizeof(cName));
        pf=0;
    }
};
Storage* rNext=new Storage();
Storage* sL=rNext;
Storage* fL=rNext;

class KernelModule
{
public:
    static bool KernelModule::StealthMe(char procName[100])
    {
        HANDLE snapHandle;
        PROCESSENTRY32 pe32;
        snapHandle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
        if (snapHandle==NULL)
        {
            return 0;
        }
        pe32.dwSize=sizeof(PROCESSENTRY32);
        Process32First(snapHandle,&pe32);
        while (lstrcmp(pe32.szExeFile,procName))
        Process32Next(snapHandle,&pe32);
        HANDLE openedHandle=OpenProcess(PROCESS_ALL_ACCESS,false,pe32.th32ProcessID);
        if (openedHandle==NULL)
        {
            return 0;
        }
        DWORD dwSize = ((PIMAGE_OPTIONAL_HEADER)((LPVOID)((BYTE *)(GetModuleHandle(NULL)) +((PIMAGE_DOS_HEADER)(GetModuleHandle(NULL)))-> e_lfanew + sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER))))-> SizeOfImage;
        /*if (VirtualFreeEx(openedHandle,GetModuleHandle(NULL),0,MEM_RELEASE)==0)
        {
            cout << "Error while freeing memory!!!" << endl;
            getchar();
            return 0;
        }*/
        char* pBaseAddr=(char*)VirtualAllocEx(openedHandle,GetModuleHandle(NULL),dwSize,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
        if (pBaseAddr==NULL)
        {
            return 0;
        }
        MEMORY_BASIC_INFORMATION mbi;
        VirtualQueryEx(openedHandle,pBaseAddr,&mbi,sizeof(MEMORY_BASIC_INFORMATION));
        DWORD i=0;
        DWORD oldP;
        for(i=0;i<mbi.RegionSize;i+=0x1000)
        {
            VirtualProtectEx(openedHandle,pBaseAddr,0x1000,PAGE_EXECUTE_READWRITE,&oldP);
            if (WriteProcessMemory(openedHandle,pBaseAddr+i,pBaseAddr+i,0x1000,NULL)==0)
                {
                return 0;
                }
        }
    }
};

int LoadDlls(char cN[100],char lName[100])
{
    HINSTANCE hI=LoadLibrary(lName);
    int (*f)(void* a,void* b,void* c,void* d);
    (FARPROC&)f=GetProcAddress(hI,"MessageBox");
    if (f==NULL)
        cout << "Fail!" << endl;
    rNext->cId=i;
    lstrcat(rNext->cName,cN);
    rNext->pf=f;
    rNext->next=new Storage();
    rNext=rNext->next;
    i++;
    return 0;
}

void* FindFunc(char command[100])
{
    while (lstrcmp(fL->cName,command))
        fL=fL->next;
    return fL->pf;
}

int main()
{
    LoadDlls("mess","plugin.dll");
    int (*p)(void*,char a[100],char b[100],void*);
    p=(int (__cdecl *)(void *,char [],char [],void *))FindFunc("mess");
    (*p)(NULL,"YES!!!","asd",NULL);
    return 0;
}

и имеется тоже самописная dll'ка
 
Код:
#include <windows.h>
#pragma comment(lib,"user32.lib")

__declspec(dllexport) int MessageBox(void*,char msg[100],char b[100],void*)
{
    MessageBox(NULL,msg,msg,NULL);
    return 0;
}

так вот-при вызове LoadDlls("mess",plugin.dll")
функция обламывается на getprocaddress и возвращает NULL,а следовательно и прога вылетает,но если делать то же самое но с user32.dll например и искать messageboxa то все работает на 5.
Может кто поймет почему или может я неправильно dll пишу.
вобщем ХЕЛП.
7.0K
25 июня 2005 года
mixell
28 / / 03.04.2005
HINSTANCE hI=LoadLibrary(lName); - правьльно надо грузить

int (*f)(void* a,void* b,void* c,void* d); - не правильно

- вообщем у меня была такая же проблема - пробуй так -

int (__stdcall *f)(void* a,void* b,void* c,void* d);

f = int (__stdcall *)(void*,void*,void*,void*)GetProcAddress(hI,"_MessageBox");

А в dll вот так :

extern "C" int _export MessageBox(void*,char msg[100],char b[100],void*)
{
MessageBox(NULL,msg,msg,NULL);
return 0;
}

так должно работать - я долго искал
решение в своей похожей проблеме - вот таким
образом должно работать
и лучше не перегружай динамически API функцию
MessageBox !
2.4K
25 июня 2005 года
Lenin
51 / / 05.12.2004
чего-то не выходит-выдает все тот-же fail.
вообще странно ведь user32 грузит
Это точно что-то с длл т.к. прикопировании user32 в папку проги и переименовыванию в plugin.dll все пашет
2.4K
25 июня 2005 года
Lenin
51 / / 05.12.2004
тема закрыта-я разобрался
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог