我试图从代码库中提取一些函数,以便它们可以在public class CreatePasswordUIController implements Initializable {
private PasswordList passList;
/**
* Initializes the controller class.
*/
@FXML
Parent root;
@FXML
TextField accountTxt;
@FXML
TextField usernameTxt;
@FXML
TextField passwordTxt;
@FXML
TextField passwordTxt2;
@FXML
TextArea commentArea;
@FXML
TextField passwordGeneratorTxt;
@FXML
Label rating;
@FXML
Label matching;
@FXML
Label incorrect;
@FXML
private void backButtonAction(ActionEvent event) throws Exception {
Stage stage = (Stage) root.getScene().getWindow();
FXMLLoader loader = new FXMLLoader(getClass().getResource("MainMenuUI.fxml"));
Pane mainMenuUI = (Pane)loader.load();
MainMenuController controller = loader.<MainMenuController>getController();
controller.setPassList(passList);
Scene scene = new Scene(mainMenuUI);
stage.setTitle("Main Menu");
stage.setScene(scene);
stage.show();
}
@FXML
private void submitButtonAction(ActionEvent event) throws Exception {
String account = accountTxt.getText();
String username = usernameTxt.getText();
String password = passwordTxt.getText();
String password2 = passwordTxt2.getText();
String comment = commentArea.getText();
if (password.equals(password2) && username.length()>2) {
PasswordList pList = passList;
Password thePass = new Password(account, username, password, comment);
pList.addPassword(thePass);
Stage stage = (Stage) root.getScene().getWindow();
FXMLLoader loader = new FXMLLoader(getClass().getResource("PasswordUI.fxml"));
Pane passwordUI = (Pane)loader.load();
PasswordUIController controller = loader.<PasswordUIController>getController();
controller.setPassList(pList);
Scene scene = new Scene(passwordUI);
stage.setTitle("Password");
stage.setScene(scene);
stage.show();
} else {
incorrect.setVisible(true);
}
}
@FXML
private void generateButtonAction(ActionEvent event) {
PasswordGenerator passGen = new PasswordGenerator();
String password = passGen.generatePassword(true);
passwordGeneratorTxt.setText(password);
}
@Override
public void initialize(URL url, ResourceBundle rb) {
PasswordRater rater = new PasswordRater();
passwordTxt.textProperty().addListener(new ChangeListener() {
@Override
public void changed(ObservableValue observable, Object oldVal,Object newVal) {
String password = passwordTxt.getText();
rater.setPassword(password);
String ratingStr = rater.displayLevel();
rating.setText(ratingStr);
rating.setVisible(true);
if (passwordTxt.getText().equals(passwordTxt2.getText()) && !password.equals("")) {
matching.setText("Good!");
}
else
{
matching.setText("Passwords do not match.");
}
}
});
passwordTxt2.textProperty().addListener(new ChangeListener() {
@Override
public void changed(ObservableValue observable, Object oldVal,Object newVal) {
String password = passwordTxt.getText();
String password2 = passwordTxt2.getText();
if (password.equals(password2) && !password.equals("")) {
matching.setText("Good!");
} else {
matching.setText("Passwords do not match.");
}
matching.setVisible(true);
}
});
}
/**
* @return the passList
*/
public PasswordList getPassList() {
return passList;
}
/**
* @param passList the passList to set
*/
public void setPassList(PasswordList passList) {
this.passList = passList;
}
}
中加密存储,然后只能使用正确的许可证密钥进行解密和访问。为此,我们需要(1)提取函数,(2)加载函数和(3)成功执行函数。
要提取我们依赖.text
函数的函数,这些函数似乎可以正常工作,因为gcc
似乎会产生正确的长度。但到目前为止,我还无法加载函数并成功执行它们,我发现了一个没有可理解信息的分段错误。
如何执行从FUNCTION_LENGTH
?
example.cpp
char* buffer
调试输出
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <stdlib.h>
#define _FNAME_CAT(name, suffix) name##suffix
#define FNAME_CAT(name, suffix) _FNAME_CAT(name, suffix)
#define FUNCTION_START(ftype, fname, ...) \
typedef ftype (*FNAME_CAT(func_, fname))(__VA_ARGS__); \
ftype fname(__VA_ARGS__)
#define FUNCTION_END(ftype, fname) \
void FNAME_CAT(fname, _end)() { }
#define FUNCTION_LENGTH(fname) \
(int) ((intptr_t) FNAME_CAT(fname, _end) - (intptr_t) fname)
FUNCTION_START(void, test, int a, int b) {
printf("a(%d), b(%d)\n", a, b);
} FUNCTION_END(void, test);
char* function_code(void* func, int flen) {
return (char*) malloc(flen * sizeof(char));
}
void* function_create(const char* buffer, int blen) {
void* func = mmap(0, blen, PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_PRIVATE | MAP_ANON, -1, 0);
return memcpy(func, buffer, blen);
}
int main(int argc, char** argv) {
char* code = function_code((void*) test, FUNCTION_LENGTH(test));
void* func = function_create((const char*) code, FUNCTION_LENGTH(test));
((func_test) test)(1, 2);
((func_test) func)(1, 2); // Program received signal SIGSEGV, Segmentation fault.
return 0;
}
答案 0 :(得分:6)
您的第一个问题是您实际上没有将func
参数实际用于function_code
...来自指定函数的代码字节永远不会进入缓冲区。
但是修复这些不会让你走得太远,因为你的整个方法存在很大的问题。 C或C ++标准无法保证函数在内存中以与源代码相同的顺序排列......实际上在任何工具链上都有任何关于优化的线索,它们不会。
我建议您使用特定于gcc的编译指示将函数放在特定代码段中以分隔感兴趣的函数,然后从可执行文件中存储和删除该段。作为一个单元对整个段执行加密/解密,而不是试图找出各个函数的开始和结束位置。
请注意,未加密的代码将在内存中可用,熟练的反向器肯定会找到它。因为您不知道自己在做什么,所以您可能已经花费了更多时间来排除功能长度代码,而不是逆向工程师花费在解密字节上。代码的运行时解密对于打包程序来说非常常见,并且具有执行访问权限的动态分配将像/proc/
pid
/maps
中的明亮信标一样突出。