?
Hey sorry das ich erst jetzt wieder schreib, aber ich war jetzt 5Tage aufn Taubertal Festival :D.
hab jetzt das problem mal ein bissle eingeschränkt.
Irgendwie liegt es dran, dass die Funktion WriteProcessMemory immer ein byte weiter hinten anfängt zu schreiben.
Bspl:
Orginal FindNextFileW
7C80EF5A k> 6A 2C PUSH 2C ; FindNextFileW
7C80EF5C 68 58F0807C PUSH kernel32.7C80F058
7C80EF61 E8 6035FFFF CALL kernel32.7C8024C6
als Argument für WriteProcess Memory wird "7C80EF5A" übergeben aber nach dem Aufruf steht das da:
7C80EF5A k> 6A 90 PUSH -70 ; FindNextFileW
7C80EF5C 90 NOP
7C80EF5D 90 NOP
7C80EF5E 90 NOP
7C80EF5F 90 NOP
7C80EF60 90 NOP
Obwohl ich ja ab "7C80EF5A" "NOPen" wollte .
Und in mein Array liest er au ned die ersten 7bytes von FindNextFileW sondern:
CC 2C 68 58 F0 80 7C
Hier mal der Hook:
void DLL_EXPORT func_hook(unsigned source_addr, unsigned bytes_to_save, unsigned new_addr, unsigned instead_call, DWORD proc_id)
{
unsigned char byte = 0;
DWORD rw = 0;
HANDLE hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id);
unsigned temp_addr[10];
unsigned char* ar_to_save = malloc(bytes_to_save);
temp_addr[0] = source_addr;
temp_addr[1] = new_addr;
if(hproc != NULL)
{
//OPs von Source_Func lesen
if(ReadProcessMemory( hproc, (LPVOID) source_addr, ar_to_save, bytes_to_save, &rw) == 0)
MessageBox(NULL, TEXT("Error while readind OPs from source"), TEXT("Error"), MB_OK);
//OPs von Source_func an new_func schreiben
if(WriteProcessMemory( hproc, (LPVOID) new_addr, ar_to_save, bytes_to_save, &rw) == 0)
MessageBox(NULL, TEXT("Error while writing OPs to new_addr"), TEXT("Error"), MB_OK);
memset(ar_to_save, NOP, bytes_to_save);
//save_bytes von source mit NOPs füllen
if(WriteProcessMemory( hproc, (LPVOID) source_addr, ar_to_save, bytes_to_save, &rw) == 0)
MessageBox(NULL, TEXT("Error while writing NOPs to source"), TEXT("Error"), MB_OK);
source_addr = temp_addr[0];
byte = JUMP;
//an anfang von source nen jump schreiben
WriteProcessMemory( hproc, (LPVOID) source_addr, &byte, sizeof(byte), &rw);
temp_addr[2] = sprungoffset(source_addr, instead_call);
source_addr += 1;
//an source sprungweite schreiben
WriteProcessMemory( hproc, (LPVOID) source_addr, &temp_addr[2], sizeof(temp_addr[2]), &rw);
byte = JUMP;
new_addr = temp_addr[1];
new_addr += bytes_to_save;
//an new_addr + bytes_to_save ein jump schrieben
WriteProcessMemory( hproc, (LPVOID) new_addr, &byte, sizeof(byte), &rw);
temp_addr[3] = sprungoffset( temp_addr[1] + bytes_to_save, temp_addr[0] + 5);
new_addr += 1;
//sprungoffset an new_addr schrieben
WriteProcessMemory( hproc, (LPVOID) new_addr, &temp_addr[3], sizeof(temp_addr[3]), &rw);
CloseHandle( hproc );
}
else
intprintf("coudl not open the process with id: %i\n",proc_id);
}
Wenn so noch iwelche Infos nötig sind sagt bescheid.
Gruß Pingu-Group