#include #include #include #include int main() { char data[] = "Hello, World from SCC PE Builder!\n\0"; /* clang-format off */ char code[] = { // sub rsp, 0x28 ; 为函数调用分配栈空间 0x48, 0x83, 0xEC, 0x28, // lea rcx, [rip + data_offset] ; 将字符串地址加载到RCX(第一个参数) 0x48, 0x8D, 0x0D, 0x00, 0x00, 0x00, 0x00, // call qword ptr [rip + puts_iat] ; 通过IAT调用puts 0xFF, 0x15, 0x00, 0x00, 0x00, 0x00, // add rsp, 0x28 ; 恢复栈空间 0x48, 0x83, 0xC4, 0x28, // xor eax, eax ; 设置返回值为0 0x33, 0xC0, // ret ; 返回 0xC3, }; /* clang-format on */ sccf_builder_t builder; sccf_builder_init(&builder); sccf_sect_data_t text_section = { .data = (u8 *)code, .size = sizeof(code), .cap = sizeof(code)}; sccf_sect_data_t data_section = { .data = (u8 *)data, .size = sizeof(data), .cap = sizeof(data)}; sccf_builder_add_text_section(&builder, &text_section); sccf_builder_add_data_section(&builder, &data_section); usize str_idx = sccf_builder_add_symbol(&builder, "str_data", &(sccf_sym_t){ .sccf_sect_offset = 0, .sccf_sect_type = SCCF_SECT_DATA, .sccf_sym_bind = SCCF_SYM_BIND_GLOBAL, .sccf_sym_size = sizeof(data), .sccf_sym_type = SCCF_SYM_TYPE_DATA, .sccf_sym_vis = SCCF_SYM_VIS_DEFAULT, }); usize puts_idx = sccf_builder_add_symbol(&builder, "puts", &(sccf_sym_t){ .sccf_sect_offset = 0, .sccf_sect_type = SCCF_SECT_NONE, .sccf_sym_bind = SCCF_SYM_BIND_GLOBAL, .sccf_sym_size = 8, .sccf_sym_type = SCCF_SYM_TYPE_EXTERN, .sccf_sym_vis = SCCF_SYM_VIS_DEFAULT, }); sccf_builder_add_reloc(&builder, (sccf_reloc_t){.addend = 4, .offset = 7, .sect_type = SCCF_SECT_CODE, .sym_idx = str_idx, .type = SCCF_RELOC_REL}); sccf_builder_add_reloc(&builder, (sccf_reloc_t){.addend = 4, .offset = 13, .sect_type = SCCF_SECT_CODE, .sym_idx = puts_idx, .type = SCCF_RELOC_REL}); const sccf_t *sccf = sccf_builder_to_sccf(&builder); scc_pe_builder_t pe_builder; sccf2pe(&pe_builder, sccf); scc_pe_dump_to_file(&pe_builder, __FILE__ "/../../test.exe"); }