#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
такая проблемаЖ
имеется код написанной мною проги:
Код:
и имеется тоже самописная 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;
}
#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 пишу.
вобщем ХЕЛП.
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 !
вообще странно ведь user32 грузит
Это точно что-то с длл т.к. прикопировании user32 в папку проги и переименовыванию в plugin.dll все пашет
тема закрыта-я разобрался