Memory Editing mit injected Dll

02/06/2009 15:24 ms​#1
Zuerst einmal möchte ich sagen, dass ich zuvor noch nie was mit Dll-Injections zu tun hatte. ;)

Also ich habe ein kleines Programm geschrieben, das eine Dll in einen Prozess injected und anschließend eine Prozedur innerhalb der Dll aufruft. Klappt auch alles wunderbar. Wenn ich nun in der Dll mit WriteProcessMemory() einen Opcode "wegNOPen" will, klappt das auch. Nun will ich aber wenn ich ja schon im Prozess bin, das ganze mit Assembler lösen.

So sieht meine Prozedur aus:
Code:
  [B]asm[/B]
   mov dword ptr ds:[$0043A83B], $90909090
   mov word ptr ds:[$0043A83F], $9090
  [B]end;[/B]
Wenn ich das machen will bekomme ich aber "Access Violation". Mit Minesweeper habe ich das auch schon versucht, bekomme da aber auch "Access Violation".
Programmsprache ist Delphi und OS Vista.

Edit: Hab gerade rausgefunden, dass ich nur die Opcodes nicht umschreiben kann, alle anderen Bytes im Speicher kann ich ohne Error ändern.

Edit2: Ich habe es selbst hinbekommen. Musste nur die entsprechende Speicherregion mit VirtualProtect() writable machen. Der Thread kann nun geschlossen/gelöscht werden.
02/06/2009 21:08 syntex#2
Quote:
Originally Posted by Disconnect View Post
Zuerst einmal möchte ich sagen, dass ich zuvor noch nie was mit Dll-Injections zu tun hatte. ;)

Also ich habe ein kleines Programm geschrieben, das eine Dll in einen Prozess injected und anschließend eine Prozedur innerhalb der Dll aufruft. Klappt auch alles wunderbar. Wenn ich nun in der Dll mit WriteProcessMemory() einen Opcode "wegNOPen" will, klappt das auch. Nun will ich aber wenn ich ja schon im Prozess bin, das ganze mit Assembler lösen.

So sieht meine Prozedur aus:
Code:
  [B]asm[/B]
   mov dword ptr ds:[$0043A83B], $90909090
   mov word ptr ds:[$0043A83F], $9090
  [B]end;[/B]
Wenn ich das machen will bekomme ich aber "Access Violation". Mit Minesweeper habe ich das auch schon versucht, bekomme da aber auch "Access Violation".
Programmsprache ist Delphi und OS Vista.

Edit: Hab gerade rausgefunden, dass ich nur die Opcodes nicht umschreiben kann, alle anderen Bytes im Speicher kann ich ohne Error ändern.

Edit2: Ich habe es selbst hinbekommen. Musste nur die entsprechende Speicherregion mit VirtualProtect() writable machen. Der Thread kann nun geschlossen/gelöscht werden.

Edit2: Ich habe es selbst hinbekommen. Musste nur die entsprechende Speicherregion mit VirtualProtect() writable machen. Der Thread kann nun geschlossen/gelöscht werden.

Wollte ich auch gerade schreiben ;)
02/07/2009 22:56 Tyrar#3
ich habs ma so gelöst (übergangsweise):
Code:
#include <windows.h>
#include <cstdio>
#include <iostream>

using namespace std;

typedef HINSTANCE (*fpLoadLibrary)(char*);
typedef LPVOID (*fpGetProcAddress)(HINSTANCE, char*);
typedef void (*fpFunktion)(void);

struct DllInjecter
{
       fpLoadLibrary LoadLibrary;
       fpGetProcAddress GetProcAddress;
       char path[255];
       char func[255];
};

DWORD WINAPI threadstart(LPVOID addr)
{
	HINSTANCE hDll;
	fpFunktion funktion;
	DllInjecter * is = (DllInjecter*)addr;       
	hDll = is->LoadLibrary(is->path);
	funktion = (fpFunktion)is->GetProcAddress(hDll, is->func);
	funktion();
	return 0;
}
void threadend()
{
}

bool EnableDebugPrivilege()
{
	TOKEN_PRIVILEGES priv;
	HANDLE hThis, hToken;
	LUID luid;
    hThis = GetCurrentProcess();
    OpenProcessToken(hThis, TOKEN_ADJUST_PRIVILEGES, &hToken);
    LookupPrivilegeValue(0, "seDebugPrivilege", &luid);
    priv.PrivilegeCount = 1;
	priv.Privileges[0].Luid = luid;
	priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken, false, &priv, 0, 0, 0);
    CloseHandle(hToken);
	CloseHandle(hThis);
	return true;
}

int main()
{
    EnableDebugPrivilege();
    HANDLE hProc;
    LPVOID start, thread;
    DWORD funcsize;
    HINSTANCE hDll;
    DllInjecter is;
    DWORD id;
    HWND hwnd;
    hwnd = FindWindow(0,"[WINTITLE]");
    if (!hwnd) 
    {
               WinExec("C:\\start3\\_win32.exe");
    }
    else
    {
        hDll = LoadLibrary("KERNEL32");
        is.LoadLibrary = (fpLoadLibrary)GetProcAddress(hDll, "LoadLibraryA");
        is.GetProcAddress = (fpGetProcAddress)GetProcAddress(hDll, "GetProcAddress");
        strcpy(is.path, "C:\\die_dll.dll");
        strcpy(is.func, "die_func");
        funcsize = (DWORD)threadend-(DWORD)threadstart;
        GetWindowThreadProcessId(hwnd,&id);
    	cout << "ID: " << id << endl;
        hProc = OpenProcess(PROCESS_ALL_ACCESS, false, id);
        printf("Prozess Handle:       %x\n", hProc);
        start = VirtualAllocEx(hProc, 0, funcsize+sizeof(DllInjecter), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    	printf("Memory:               %x\n", start);
        WriteProcessMemory(hProc, start, (LPVOID)&is, sizeof(DllInjecter), NULL);
        thread = (LPVOID)((DWORD)start+sizeof(DllInjecter));
        WriteProcessMemory(hProc, thread, (LPVOID)threadstart, funcsize, NULL);
        CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)thread, start, 0, 0);
        CloseHandle(hProc);
    }
 	return 0;
}
02/09/2009 14:36 verT!c4L#4
Quote:
Originally Posted by syntex View Post
Edit2: Ich habe es selbst hinbekommen. Musste nur die entsprechende Speicherregion mit VirtualProtect() writable machen. Der Thread kann nun geschlossen/gelöscht werden.
Aber sonst geht es euch gut, ja ? Das darf nicht gelöscht werden :P
Close meinetwegen ;)