Beispielprogramm:
Code:
.386
.model flat, stdcall
option casemap :none
include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib
.data
szMsgTitle db "Process ID", 0
szFormat db "PID über Exenamen : %04d", 13, 10, "PID über ein Fenster: %04d", 0
szExe db "notepad.exe", 0
szClass db "Notepad", 0
szTitle db "Unbenannt - Editor", 0
.data?
dwWindowThreadProcessId dd ?
pBuffer db 60h dup (?)
pe32 PROCESSENTRY32 <?>
.code
GetPID proc pExe:DWORD
local hProc:DWORD ;ebp - 4 push ebp mov ebp, esp add esp, -4
invoke CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS, 0
cmp eax, INVALID_HANDLE_VALUE
je @@end
mov [hProc], eax
mov [pe32.dwSize], size PROCESSENTRY32
invoke Process32First, [hProc], offset pe32
test eax, eax
jz @@e
@@l:
invoke lstrcmpi, offset pe32.szExeFile, pExe
test eax, eax
jnz @f
mov eax, [pe32.th32ProcessID]
jmp @@e
@@:
invoke Process32Next, [hProc], offset pe32
test eax, eax
jnz @@l
@@e:
push eax
invoke CloseHandle, hProc
pop eax
ret;n 4, mov esp, ebp pop ebp
GetPID endp
main:
invoke FindWindow, offset szClass, offset szTitle
test eax, eax
mov [dwWindowThreadProcessId], 0
jz @f
invoke GetWindowThreadProcessId, eax, offset dwWindowThreadProcessId
@@:
invoke GetPID, offset szExe
push [dwWindowThreadProcessId]
push eax
push offset szFormat
push offset pBuffer
call wsprintf
add esp, 16
invoke MessageBox, 0, offset pBuffer, offset szMsgTitle, 0
invoke ExitProcess, 0
end main
Code:
ml.exe /Dmasm /c /coff /I..\include\ src.asm link.exe /SUBSYSTEM:WINDOWS /LIBPATH:..\lib\ src.obj
Code:
DWORD GetPID(char *pName) {
HANDLE hProc;
PROCESSENTRY32 pe32;
hProc = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProc == INVALID_HANDLE_VALUE) {
return 0;
}
pe32.dwSize = sizeof(PROCESSENTRY32);
if(Process32First(hProc, &pe32)) {
do {
if(!strnicmp(pName, pe32.szExeFile, strlen(pName))) {
CloseHandle(hProc);
return pe32.th32ProcessID;
}
} while(Process32Next(hProc, &pe32));
}
CloseHandle(hProc);
return 0;
}
Um ein Handle zu erhalten, müsste man dann folgende Instruktion implementieren (In C):
Code:
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, GetPID("notepad.exe"));
Code:
BOOL InjectDll(HANDLE hProc, char *pName) {
void *lpAlloc;
PTHREAD_START_ROUTINE pThread;
lpAlloc = VirtualAllocEx(hProc, NULL, strlen(pName), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
pThread = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
WriteProcessMemory(hProc, (LPVOID)lpAlloc, pName, strlen(pName), NULL);
if(!CreateRemoteThread(hProc, NULL, 0, pThread, lpAlloc, 0, NULL)) {
return FALSE;
}
return TRUE;
}
Code:
InjectDll proc hProc:DWORD, pName:DWORD .data szKernelDll db "kernel32.dll", 0 szLoadLibrary db "LoadLibraryA", 0 .code push ebx push edi invoke GetModuleHandle, offset szKernelDll invoke GetProcAddress, eax, offset szLoadLibrary mov ebx, eax invoke lstrlen, [pName] mov edi, eax invoke VirtualAllocEx, [hProc], NULL, eax, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE push eax invoke WriteProcessMemory, [hProc], eax, [pName], edi, NULL pop eax invoke CreateRemoteThread, [hProc], NULL, 0, ebx, eax, 0, NULL test eax, eax jz @f mov eax, TRUE jmp @@e @@: mov eax, FALSE @@e: pop edi pop ebx retn 8 InjectDll endp






