Если я явно указать адрес в DLL инъекции работаетDll injection с GetFullPathNameA не работает?
char s[1000]="E:\\worldisnotenough.dll"; //Works
Если я использую GetFullPathNameA
DLL инъекции не работают, и они не дают каких-либо времени выполнения или ошибки компиляции времени. Я проверил это:
char s[1000];
int ax =GetFullPathNameA("worldisnotenough.dll",
1000,
s, //Output to save the full DLL path
NULL);
std::cout<<s; //prints the correct path. Working.
Линия cout << s
печатает правильный путь, но DLL инъекции не происходит. Ошибок не возникает. Я проверил VirtualAllocEx, WriteProcessMemory и CreateRemoteThread, и все они работают исправно.
Edit: полный код
#include <QCoreApplication>
#include<windows.h>
#include<tchar.h>
#include<iostream>
#include "E:/Users/Gen/qt project freiza/FreizaLibrary/freizalibrary.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// FreizaLibrary lib;
// QTextStream s(stdin);
// QString value = s.readLine();
// lib.injection(value.toInt());
int procID = 13044;
HANDLE hHandle = OpenProcess(PROCESS_CREATE_THREAD |
PROCESS_QUERY_INFORMATION |
PROCESS_VM_OPERATION |
PROCESS_VM_WRITE |
PROCESS_VM_READ,
FALSE,
procID);
QString dllName = "worldisnotenough.dll";
QFile myDllFile(dllName);
QFileInfo dllInfo(dllName);
QString str =dllInfo.absoluteFilePath();
char s[]="E:\\Users\\Gen\\qt project freiza\\build-libtester-FreizaKit-Release\\release\\worldisnotenough.dll";
std::cout<<strlen(s)<<"\n";
int ax =GetFullPathNameA("worldisnotenough.dll",
86, //I set it to 1000 before posting this question.
s, //Output to save the full DLL path
NULL);
//qDebug()<< QString::fromUtf8(s) <<" "<< ax;
std::cout<<s<<"size "<<ax;
LPVOID dllPathAddr = VirtualAllocEx(hHandle,
0,
strlen(s),
MEM_RESERVE|MEM_COMMIT,
PAGE_EXECUTE_READWRITE);
std::cout<<" test \n";
std::cout<<(int*)dllPathAddr<<endl;
if(dllPathAddr==NULL)
{
qDebug()<<"virtual failed";
}
size_t x;
int n= WriteProcessMemory(hHandle,
dllPathAddr,
s,
strlen(s),
&x);
if(n==0)
{
qDebug()<<"write failed";
}
std::cout<<endl<<n<<"\t"<<x;
LPVOID addr = (LPVOID)GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA");
if(addr==NULL)
{
qDebug()<<"get proc failed";
}
HANDLE rThread = CreateRemoteThread(hHandle, NULL, 0, (LPTHREAD_START_ROUTINE)addr,dllPathAddr, 0, NULL);
if(rThread==NULL)
{
qDebug()<<"create remote failed";
}
WaitForSingleObject(rThread, INFINITE);
VirtualFreeEx(hHandle, dllPathAddr, 0, MEM_RELEASE);
CloseHandle(hHandle);
qDebug()<< "done";
return a.exec();
}
А почему отрицательные голоса? Когда я отправляю полный код. Люди говорят, что только пост сегмент кода, который не работает. И я объяснил ситуацию в полной мере. Из-за этих отрицательных голосов сейчас я не буду задавать вопросы о stackoverflow. Спасибо.
вы можете включить код, где что-то не работает? В какой момент вы обнаруживаете, что инъекция DLL не происходит? Можете ли вы установить точку останова и убедиться, что содержимое массива 's' идентично жестко кодированной версии? –
Нам нужно больше кода, если cout << s печатает правильное значение, тогда GetFullPathNameA работает правильно, а ошибка - в другом месте вашего кода. – Mathemats
VirtualAllocEx возвращает адрес. WriteProcessMemory возвращает количество записанных байтов, CreateRemoteThread возвращает допустимый дескриптор в обоих случаях. – Freiza