uint32_t tmp_args[var_dump.argc];
uint32_t tmp_envs[var_dump.envc];
- PrintDebug("Initiating copy into guest (32bit)\n");
+ PrintDebug(core->vm_info, core, "Initiating copy into guest (32bit)\n");
ret = v3_gva_to_hva(core, get_addr_linear(core, gva, &(core->segments.ds)), &hva);
if (ret == -1) {
- PrintDebug("Error translating gva in v3_copy_chunk_2guest\n");
+ PrintDebug(core->vm_info, core, "Error translating gva in v3_copy_chunk_2guest\n");
return -1;
}
host_cursor -= strlen(var_dump.envp[i]) + 1;
guest_cursor -= strlen(var_dump.envp[i]) + 1;
while (i < var_dump.envc) {
- //PrintDebug("Copying envvar#%d: %s\n", i, var_dump.envp[i]);
+ //PrintDebug(core->vm_info, core, "Copying envvar#%d: %s\n", i, var_dump.envp[i]);
strcpy(host_cursor, var_dump.envp[i]);
tmp_envs[i] = guest_cursor;
i++;
host_cursor -= strlen(var_dump.argv[i]) + 1;
guest_cursor -= strlen(var_dump.argv[i]) + 1;
while (i < var_dump.argc) {
- //PrintDebug("Copying arg #%d: %s\n", i, var_dump.argv[i]);
+ //PrintDebug(core->vm_info, core, "Copying arg #%d: %s\n", i, var_dump.argv[i]);
strcpy(host_cursor, var_dump.argv[i]);
tmp_args[i] = guest_cursor;
i++;
uint_t argc = 0, envc = 0, bytes = 0;
char * cursor;
- PrintDebug("Initiating copy into vmm\n");
+ PrintDebug(core->vm_info, core, "Initiating copy into vmm\n");
int ret = v3_gva_to_hva(core, get_addr_linear(core, core->vm_regs.rdx, &(core->segments.ds)), &envp);
if (ret == -1) {
- PrintDebug("Error translating address in rdx\n");
+ PrintDebug(core->vm_info, core, "Error translating address in rdx\n");
return 0;
}
ret = v3_gva_to_hva(core, get_addr_linear(core, core->vm_regs.rcx, &(core->segments.ds)), &argv);
if (ret == -1) {
- PrintDebug("Error translating address in rcx\n");
+ PrintDebug(core->vm_info, core, "Error translating address in rcx\n");
return 0;
}
addr_t argvn;
ret = v3_gva_to_hva(core, get_addr_linear(core, (addr_t)*((uint32_t*)cursor), &(core->segments.ds)), &argvn);
if (ret == -1) {
- PrintDebug("Error translating address for argvn\n");
+ PrintDebug(core->vm_info, core, "Error translating address for argvn\n");
}
argc++;
cursor += 4;
/* account for new args */
argc += argcnt;
var_dump.argv = (char**)V3_Malloc(sizeof(char*)*argc);
+
+ if (!var_dump.argv) {
+ PrintError(core->vm_info, core, "Cannot allocate in copying\n");
+ return -1;
+ }
+
var_dump.argc = argc;
bytes += sizeof(uint32_t)*argc;
addr_t argvn;
ret = v3_gva_to_hva(core, get_addr_linear(core, (addr_t)*((uint32_t*)cursor), &(core->segments.ds)), &argvn);
if (ret == -1) {
- PrintDebug("Error translating argvn address\n");
+ PrintDebug(core->vm_info, core, "Error translating argvn address\n");
}
/* malloc room for the string */
char * tmpstr = (char*)V3_Malloc(strlen((char*)argvn) + 1);
+ if (!tmpstr) {
+ PrintError(core->vm_info, core, "Cannot allocate temporary\n");
+ return -1;
+ }
+
/* copy the pointer */
var_dump.argv[i] = tmpstr;
/* copy the string */
+ // this is guaranteed to alwys null terminate tmpstr
strncpy(tmpstr, (char*)argvn, strlen((char*)argvn) + 1);
+
i++;
cursor += 4;
bytes += strlen((char*)argvn) + 1;
int j = 0;
while (j < argcnt) {
char * tmpstr = (char*)V3_Malloc(strlen(argstrs[j]) + 1);
+
+ if (!tmpstr) {
+ PrintError(core->vm_info, core, "Cannot allocate temp string\n");
+ return -1;
+ }
+
+ // will always null-terminate tmpstr
strncpy(tmpstr, argstrs[i], strlen(argstrs[j]) + 1);
var_dump.argv[i] = tmpstr;
bytes += strlen(argstrs[j]) + 1;
addr_t envpn;
ret = v3_gva_to_hva(core, get_addr_linear(core, (addr_t)*((uint32_t*)cursor), &(core->segments.ds)), &envpn);
if (ret == -1) {
- PrintDebug("Error translating address for envpn\n");
+ PrintDebug(core->vm_info, core, "Error translating address for envpn\n");
}
envc++;
cursor += 4;
envc += envcnt;
var_dump.envp = (char**)V3_Malloc(sizeof(char*)*envc);
+
+ if (!var_dump.envp) {
+ PrintError(core->vm_info, core, "Cannot allocate var dump\n");
+ return -1;
+ }
+
var_dump.envc = envc;
bytes += sizeof(uint32_t)*envc;
addr_t envpn;
ret = v3_gva_to_hva(core, get_addr_linear(core, (addr_t)*((uint32_t*)cursor), &(core->segments.ds)), &envpn);
if (ret == -1) {
- PrintDebug("Error translating address for envpn\n");
+ PrintDebug(core->vm_info, core, "Error translating address for envpn\n");
}
/* malloc room for the string */
char * tmpstr = (char*)V3_Malloc(strlen((char*)envpn) + 1);
+
+ if (!tmpstr) {
+ PrintError(core->vm_info, core, "Cannot allocate temp string\n");
+ return -1;
+ }
/* copy the pointer */
var_dump.envp[i] = tmpstr;
/* deepcopy the string */
+ // will always null-terminate tmpstr
strncpy(tmpstr, (char*)envpn, strlen((char*)envpn) + 1);
i++;
cursor += 4;
j = 0;
while (j < envcnt) {
char * tmpstr = (char*)V3_Malloc(strlen(envstrs[j]) + 1);
+
+ if (!tmpstr) {
+ PrintError(core->vm_info, core, "Cannot allocate temp string\n");
+ return -1;
+ }
+ // will always null-terminate tmpstr
strncpy(tmpstr, envstrs[j], strlen(envstrs[j]) + 1);
var_dump.envp[i] = tmpstr;
bytes += strlen(envstrs[j]) + 1;
/* copy out all of the arguments and the environment to the VMM */
if ((bytes_needed = v3_copy_chunk_vmm32(core, argstrs, envstrs, argcnt, envcnt)) == -1) {
- PrintDebug("Error copying out environment and arguments\n");
+ PrintDebug(core->vm_info, core, "Error copying out environment and arguments\n");
return -1;
}
- PrintDebug("environment successfully copied into VMM\n");
+ PrintDebug(core->vm_info, core, "environment successfully copied into VMM\n");
inject_gva = v3_prepare_guest_stack(core, bytes_needed);
if (!inject_gva) {
- PrintDebug("Not enough space on user stack\n");
+ PrintDebug(core->vm_info, core, "Not enough space on user stack\n");
return -1;
}
uint64_t tmp_args[var_dump.argc];
uint64_t tmp_envs[var_dump.envc];
- PrintDebug("Initiating copy into guest (64bit)\n");
+ PrintDebug(core->vm_info, core, "Initiating copy into guest (64bit)\n");
ret = v3_gva_to_hva(core, get_addr_linear(core, gva, &(core->segments.ds)), &hva);
if (ret == -1) {
- PrintDebug("Error translating gva in v3_copy_chunk_2guest64\n");
+ PrintDebug(core->vm_info, core, "Error translating gva in v3_copy_chunk_2guest64\n");
return -1;
}
host_cursor -= strlen(var_dump.envp[i]) + 1;
guest_cursor -= strlen(var_dump.envp[i]) + 1;
while (i < var_dump.envc) {
- //PrintDebug("Copying envvar#%d: %s\n", i, var_dump.envp[i]);
+ //PrintDebug(core->vm_info, core, "Copying envvar#%d: %s\n", i, var_dump.envp[i]);
strcpy(host_cursor, var_dump.envp[i]);
tmp_envs[i] = guest_cursor;
i++;
host_cursor -= strlen(var_dump.argv[i]) + 1;
guest_cursor -= strlen(var_dump.argv[i]) + 1;
while (i < var_dump.argc) {
- //PrintDebug("Copying arg #%d: %s\n", i, var_dump.argv[i]);
+ //PrintDebug(core->vm_info, core, "Copying arg #%d: %s\n", i, var_dump.argv[i]);
strcpy(host_cursor, var_dump.argv[i]);
tmp_args[i] = guest_cursor;
i++;
uint_t argc = 0, envc = 0, bytes = 0;
char * cursor;
- PrintDebug("Initiating copy into vmm\n");
+ PrintDebug(core->vm_info, core, "Initiating copy into vmm\n");
int ret = v3_gva_to_hva(core, get_addr_linear(core, core->vm_regs.rdx, &(core->segments.ds)), &envp);
if (ret == -1) {
- PrintDebug("Error translating address in rdx\n");
+ PrintDebug(core->vm_info, core, "Error translating address in rdx\n");
return 0;
}
ret = v3_gva_to_hva(core, get_addr_linear(core, core->vm_regs.rcx, &(core->segments.ds)), &argv);
if (ret == -1) {
- PrintDebug("Error translating address in rcx\n");
+ PrintDebug(core->vm_info, core, "Error translating address in rcx\n");
return 0;
}
addr_t argvn;
ret = v3_gva_to_hva(core, get_addr_linear(core, (addr_t)*((uint64_t*)cursor), &(core->segments.ds)), &argvn);
if (ret == -1) {
- PrintDebug("Error translating address for argvn\n");
+ PrintDebug(core->vm_info, core, "Error translating address for argvn\n");
}
argc++;
cursor += 8;
/* account for new strings */
argc += argcnt;
var_dump.argv = (char**)V3_Malloc(sizeof(char*)*argc);
+
+ if (!var_dump.argv) {
+ PrintError(core->vm_info, core, "Cannot allocate var dump\n");
+ return -1;
+ }
+
var_dump.argc = argc;
bytes += sizeof(char*)*argc;
addr_t argvn;
ret = v3_gva_to_hva(core, get_addr_linear(core, (addr_t)*((uint64_t*)cursor), &(core->segments.ds)), &argvn);
if (ret == -1) {
- PrintDebug("Error translating argvn address\n");
+ PrintDebug(core->vm_info, core, "Error translating argvn address\n");
}
/* malloc room for the string */
char * tmpstr = (char*)V3_Malloc(strlen((char*)argvn) + 1);
+ if (!tmpstr) {
+ PrintError(core->vm_info, core, "Cannot allocate temp string\n");
+ return -1;
+ }
+
/* copy the pointer */
var_dump.argv[i] = tmpstr;
/* copy the string */
+ // will always null-terminate tmpstr
strncpy(tmpstr, (char*)argvn, strlen((char*)argvn) + 1);
i++;
cursor += 8;
int j = 0;
while (j < argcnt) {
char * tmpstr = (char*)V3_Malloc(strlen(argstrs[j]) + 1);
+
+ if (!tmpstr) {
+ PrintError(core->vm_info, core, "Cannot allocate temp string\n");
+ return -1;
+ }
+
+ // will always null-terminate tmpstr
strncpy(tmpstr, argstrs[j], strlen(argstrs[j]) + 1);
var_dump.argv[i] = tmpstr;
bytes += strlen(argstrs[j]) + 1;
addr_t envpn;
ret = v3_gva_to_hva(core, get_addr_linear(core, (addr_t)*((uint64_t*)cursor), &(core->segments.ds)), &envpn);
if (ret == -1) {
- PrintDebug("Error translating address for envpn\n");
+ PrintDebug(core->vm_info, core, "Error translating address for envpn\n");
}
envc++;
cursor += 8;
envc += envcnt;
var_dump.envp = (char**)V3_Malloc(sizeof(char*)*envc);
+
+ if (!var_dump.envp) {
+ PrintError(core->vm_info, core, "Cannot allocate var dump\n");
+ return -1;
+ }
+
var_dump.envc = envc;
bytes += sizeof(uint64_t)*(envc);
addr_t envpn;
ret = v3_gva_to_hva(core, get_addr_linear(core, (addr_t)*((uint64_t*)cursor), &(core->segments.ds)), &envpn);
if (ret == -1) {
- PrintDebug("Error translating address for envpn\n");
+ PrintDebug(core->vm_info, core, "Error translating address for envpn\n");
}
/* malloc room for the string */
char * tmpstr = (char*)V3_Malloc(strlen((char*)envpn) + 1);
+
+ if (!tmpstr) {
+ PrintError(core->vm_info, core, "Cannot allocate temp string\n");
+ return -1;
+ }
/* copy the pointer */
var_dump.envp[i] = tmpstr;
/* deepcopy the string */
+ // will always null-terminate tmpstr
strncpy(tmpstr, (char*)envpn, strlen((char*)envpn) + 1);
i++;
cursor += 8;
j = 0;
while (j < envcnt) {
char * tmpstr = (char*)V3_Malloc(strlen(envstrs[j]) + 1);
+
+ if (!tmpstr) {
+ PrintError(core->vm_info, core, "Cannot allocate temp string\n");
+ return -1;
+ }
+ // will always null-terminate tmpstr
strncpy(tmpstr, envstrs[i], strlen(envstrs[j]) + 1);
var_dump.envp[i] = tmpstr;
bytes += strlen(envstrs[j]) + 1;
/* copy out all of the arguments and the environment to the VMM */
if ((bytes_needed = v3_copy_chunk_vmm64(core, argstrs, envstrs, argcnt, envcnt)) == -1) {
- PrintDebug("Error copying out environment and arguments\n");
+ PrintDebug(core->vm_info, core, "Error copying out environment and arguments\n");
return -1;
}
- PrintDebug("environment successfully copied into VMM\n");
+ PrintDebug(core->vm_info, core, "environment successfully copied into VMM\n");
inject_gva = v3_prepare_guest_stack(core, bytes_needed);
if (!inject_gva) {
- PrintDebug("Not enough space on user stack\n");
+ PrintDebug(core->vm_info, core, "Not enough space on user stack\n");
return -1;
}
if (core->cpu_mode == LONG) {
if (v3_inject_strings64(core, argstrs, envstrs, argcnt, envcnt) == -1) {
- PrintDebug("Error injecting strings into environment (64)\n");
+ PrintDebug(core->vm_info, core, "Error injecting strings into environment (64)\n");
return -1;
}
} else {
if (v3_inject_strings32(core, argstrs, envstrs, argcnt, envcnt) == -1) {
- PrintDebug("Error injecting strings into environment (32)\n");
+ PrintDebug(core->vm_info, core, "Error injecting strings into environment (32)\n");
return -1;
}
}