2015-02-25 2 views
-2

Если я явно указать адрес в 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. Спасибо.

+0

вы можете включить код, где что-то не работает? В какой момент вы обнаруживаете, что инъекция DLL не происходит? Можете ли вы установить точку останова и убедиться, что содержимое массива 's' идентично жестко кодированной версии? –

+0

Нам нужно больше кода, если cout << s печатает правильное значение, тогда GetFullPathNameA работает правильно, а ошибка - в другом месте вашего кода. – Mathemats

+0

VirtualAllocEx возвращает адрес. WriteProcessMemory возвращает количество записанных байтов, CreateRemoteThread возвращает допустимый дескриптор в обоих случаях. – Freiza

ответ

1

Ваша проблема в том, что вы пытаетесь использовать статически определенный массив символов в качестве буфера для GetFullPathNameA!

Смотрите здесь:

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, //1000 is no good, MAX_PATH is 260 
        s, //Using 's' as a buffer? Don't do that please! 
        NULL); 

Кроме того, при использовании версии ANSI, которые вы, как обозначено в «A», максимальная длина пути 260 символов максимум. MAX_PATH == 260

«В версии этой функции ANSI имя ограничено символами MAX_PATH. Чтобы увеличить этот предел до 32 767 символов, вызовите версию функции Unicode и добавьте« \? »» «

Исправлен код: (Однако я не использую QT, так что отсутствует здесь, не имеет значения, хотя, как она не была использована для чего-нибудь необходимого для инъекционного работы)

#include <windows.h> 
#include <iostream> 
#include <tlhelp32.h> 

HANDLE GetProcessHandle(wchar_t *ProcessName,ULONG *ReturnedProcessId); 

int main(int argc, char *argv[]) 
{ 
    ULONG procID; 
    HANDLE hHandle=GetProcessHandle(L"ExeToInjectInto.exe",&procID); 

    /*HANDLE hHandle=OpenProcess(PROCESS_CREATE_THREAD|PROCESS_QUERY_INFORMATION|PROCESS_VM_OPERATION| 
           PROCESS_VM_WRITE|PROCESS_VM_READ,FALSE,procID);*/ 

    std::cout<<"handle: "<<hHandle<<" process ID: "<<procID<<"\n"; 

    char s[]="C:\\Users\\DBVM_OS\\CodeBlocksProjects\\HelpFreizaProject\\bin\\Debug\\mytestdll.dll"; 
    std::cout<<s<<"\n"<<strlen(s)<<"\n"; 

    //First Problem: 
    /*In the ANSI version of this function, the name is limited to MAX_PATH characters. 
    To extend this limit to 32,767 wide characters, call the Unicode version of the function and prepend "\\?\" 
    */ 
    //Second Problem: 
    /* Don't use a defined static char[] as a buffer! allocate some memory or use the stack */ 
    //char s2[MAX_PATH]; 
    //int ax=GetFullPathNameA("mytestdll.dll",MAX_PATH,s2,0); 

    char *s2=new char[MAX_PATH]; 
    if(s2==0) return 0; 
    int ax=GetFullPathNameA("mytestdll.dll",MAX_PATH,s2,0); 

    std::cout<<s2<<"\nsize returned: "<<ax<<" strlen: "<<strlen(s2)<<"\n"; 

    LPVOID dllPathAddr=VirtualAllocEx(hHandle,0,(strlen(s2)+1),MEM_COMMIT,PAGE_EXECUTE_READWRITE); 

    std::cout<<"Remotely Allocated String Address: \n"; 
    std::cout<<(int*)dllPathAddr<<"\n"; 

    if(dllPathAddr==0) 
    { 
     OutputDebugStringA("VirtualAllocEx failed..."); 
     return 0; 
    } 

    SIZE_T x; 
    BOOL n=WriteProcessMemory(hHandle,dllPathAddr,s2,(strlen(s2)+1),&x); 
    if(n==FALSE) 
    { 
     OutputDebugStringA("write failed"); 
     VirtualFreeEx(hHandle,dllPathAddr,0,MEM_RELEASE); 
     CloseHandle(hHandle); 
     return 0; 
    } 

    std::cout<<"WriteProcessMemory Success: "<<n<<", Bytes Written: "<<x<<"\n"; 

    LPVOID addr=(LPVOID)GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "LoadLibraryA"); 
    if(addr==0) 
    { 
     OutputDebugStringA("get proc failed"); 
     VirtualFreeEx(hHandle,dllPathAddr,0,MEM_RELEASE); 
     CloseHandle(hHandle); 
     return 0; 
    } 

    std::cout<<"LoadLibraryA: "<<addr<<"\n"; 

    HANDLE rThread=CreateRemoteThread(hHandle,0,0,(LPTHREAD_START_ROUTINE)addr,dllPathAddr,0,0); 
    if(rThread==0) 
    { 
     OutputDebugStringA("create remote failed"); 
     VirtualFreeEx(hHandle,dllPathAddr,0,MEM_RELEASE); 
     CloseHandle(hHandle); 
     return 0; 
    } 


    WaitForSingleObject(rThread,INFINITE); 
    std::cout<<"DLL Should have been injected successfully at this point...\nFreeing remote string"; 

    BOOL freed=VirtualFreeEx(hHandle,dllPathAddr,0,MEM_RELEASE); 
    if(freed==0) OutputDebugStringA("Freeing Remote String Failed..."); 

    delete[] s2; //if you dynamically allocated s2 like I've done... 
    CloseHandle(hHandle); 
    return 0; 
} 

HANDLE GetProcessHandle(wchar_t *ProcessName,ULONG *ReturnedProcessId) 
{ 
    PROCESSENTRY32W pe; 
    HANDLE Snap; 

    ZeroMemory(&pe, sizeof(PROCESSENTRY32W)); 
    pe.dwSize=sizeof(PROCESSENTRY32W); 
    Snap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 

    if(Snap==INVALID_HANDLE_VALUE) return 0; 

    BOOL bProcess=Process32FirstW(Snap,&pe); 
    while(bProcess) 
    { 
     if(_wcsicmp(pe.szExeFile,ProcessName)==0) 
     { 
      HANDLE ProcessHandle=OpenProcess(PROCESS_CREATE_THREAD|PROCESS_QUERY_INFORMATION|PROCESS_VM_OPERATION| 
           PROCESS_VM_WRITE|PROCESS_VM_READ,FALSE,pe.th32ProcessID); 

      if(ReturnedProcessId!=0) 
       *ReturnedProcessId=pe.th32ProcessID; 

      CloseHandle(Snap); 
      return ProcessHandle; 
     } 

     bProcess=Process32NextW(Snap, &pe); 
    } 
    if(ReturnedProcessId!=0) *ReturnedProcessId=0; 
    CloseHandle(Snap); 
    return 0; 
} 
1

вам нужно использовать

strlen(s)+1 

причиной его returnes в длину строки, не включая завершающий нулевой символ непосредственно! Таким образом, VirtualAllocEx и WriteProcessMemory не будут писать символ «\ 0», и имя файла прекратится в «случайной» позиции в памяти.

Также

char s[]="E:\\Users\\Gen\\qt project freiza\\build-libtester-FreizaKit-Release\\release\\worldisnotenough.dll"; //- Length: 93+1 

int ax =GetFullPathNameA("worldisnotenough.dll", 
       sizeof(s), //<-- old: 86 but s[] is 93 + 1 if this has to hold the total path may it was to small? 
       s, //Output to save the full DLL path 
       NULL); 

выглядит Wong ?!

+0

Все еще не работает. – Freiza

+0

@Freiza Вы заменили все струны? Что не работает? – Mathemats

+0

Да заменил все strlen на strlen (s) +1, но все равно он не работает. – Freiza

Смежные вопросы