| 187 | } |
| 188 | |
| 189 | static PVOID FindPayloadInRemoteDetourSection(_In_ HANDLE hProcess, |
| 190 | _In_ REFGUID rguid, |
| 191 | _Out_opt_ DWORD *pcbData, |
| 192 | _In_ PVOID pvRemoteDetoursSection) |
| 193 | { |
| 194 | if (pcbData) { |
| 195 | *pcbData = 0; |
| 196 | } |
| 197 | |
| 198 | PBYTE pbData = (PBYTE)pvRemoteDetoursSection; |
| 199 | |
| 200 | DETOUR_SECTION_HEADER header; |
| 201 | if (!ReadProcessMemory(hProcess, pbData, &header, sizeof(header), NULL)) { |
| 202 | DETOUR_TRACE(("ReadProcessMemory(dsh@%p..%p) failed: %lu\n", |
| 203 | pbData, |
| 204 | pbData + sizeof(header), |
| 205 | GetLastError())); |
| 206 | return NULL; |
| 207 | } |
| 208 | |
| 209 | if (header.cbHeaderSize < sizeof(DETOUR_SECTION_HEADER) || |
| 210 | header.nSignature != DETOUR_SECTION_HEADER_SIGNATURE) { |
| 211 | SetLastError(ERROR_EXE_MARKED_INVALID); |
| 212 | return NULL; |
| 213 | } |
| 214 | |
| 215 | if (header.nDataOffset == 0) { |
| 216 | header.nDataOffset = header.cbHeaderSize; |
| 217 | } |
| 218 | |
| 219 | for (PVOID pvSection = pbData + header.nDataOffset; pvSection < pbData + header.cbDataSize;) { |
| 220 | DETOUR_SECTION_RECORD section; |
| 221 | if (!ReadProcessMemory(hProcess, pvSection, §ion, sizeof(section), NULL)) { |
| 222 | DETOUR_TRACE(("ReadProcessMemory(dsr@%p..%p) failed: %lu\n", |
| 223 | pvSection, |
| 224 | (PBYTE)pvSection + sizeof(section), |
| 225 | GetLastError())); |
| 226 | return NULL; |
| 227 | } |
| 228 | |
| 229 | if (DetourAreSameGuid(section.guid, rguid)) { |
| 230 | if (pcbData) { |
| 231 | *pcbData = section.cbBytes - sizeof(section); |
| 232 | } |
| 233 | SetLastError(NO_ERROR); |
| 234 | return (DETOUR_SECTION_RECORD *)pvSection + 1; |
| 235 | } |
| 236 | |
| 237 | pvSection = (PBYTE)pvSection + section.cbBytes; |
| 238 | } |
| 239 | |
| 240 | return NULL; |
| 241 | } |
| 242 | |
| 243 | _Success_(return != NULL) |
| 244 | PVOID WINAPI DetourFindRemotePayload(_In_ HANDLE hProcess, |
no test coverage detected
searching dependent graphs…