#include #include #include #include #include #include #include #include "util.h" #include "vm.h" void hex2bytes(char *hex) { size_t len = strlen(hex); char bytes[len + 1]; for (size_t i = 0; i < len; ++i) { char hdig[3] = { hex[i*2], hex[i*2+1], '\0' }; sscanf(hdig, "%hhx", &bytes[i]); } memcpy(hex, bytes, len); hex[len] = '\0'; } int main(int argc, char *argv[]) { if (argc < 2) { ERROR("Usage: %s \n", argv[0]); } int pid; if ((pid = atoi(argv[1])) == 0) { ERROR("Invalid pid '%s'\n", argv[1]); } ptrace(PTRACE_ATTACH, pid, NULL, NULL); waitpid(pid, NULL, __WALL); LOG("Attached to process %d\n", pid); char *byte_seq = "DEADBEEF"; size_t byte_seq_len = strlen(byte_seq); MemscanResult *head = memscan(pid, (uint8_t*)byte_seq, byte_seq_len); MemscanResult *cur = head; printf("\n\n\nMemory scan results:\n"); printf("%-16s|%-16s|%-10s|%-s\n", "Address", "Base", "Offset", "Name"); puts("--------------------------------------------------"); while (cur) { printf("%-16p|%-16p|%#-10lx|%-s\n", cur->mapping->begin + cur->offset, cur->mapping->begin, cur->offset, cur->mapping->name); cur = cur->next; } printf("\n\n"); char *buf = "CAFEBABE"; size_t len = strlen(buf); cur = head; while (cur) { void *address = cur->mapping->begin + cur->offset; memwrite(pid, address, (uint8_t*)buf, len); cur = cur->next; } ptrace(PTRACE_DETACH, pid, NULL, NULL); LOG("Detached from process %d\n", pid); return 0; }