Here是一種混淆技術,其中條件跳轉由跳轉表替換。每個數組只包含一個有效的函數指針,它們是基於crc值調用的。我只保留了函數指針在程序集中查找數組
#include <stdio.h>
#include <inttypes.h>
typedef void (*crc_check_fn)(uint32_t *);
static void crc_nib2 (uint32_t *crc) { printf("OK\n"); }
crc_check_fn b1[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, crc_nib2, 0, 0, 0 };
int main(){
uint32_t crc = 0xFFF7FB7C;
int index = crc & 0x0F;
(*b1[index])(&crc);
}
的單個陣列我有幾個問題:
可這陣位於二進制的組裝?我不太瞭解裝配,所以檢查它我無法告訴。
我假設上一個問題的答案是肯定的,因爲原來的帖子建議初始化
b1
就像{ ..., crc_nib2-8, crc_nib2, crc_ni2+8, ... };
。這是否安全?難道不可能說這些是無效指針嗎?不應該是更好的選擇來實現大量真正的虛擬功能嗎?編譯與
gcc -S
我B1: ...
.quad 0
.quad crc_nib2 .quad 0
...
上運行objdump -d
二進制產生一個沒有上述行的程序集。爲什麼組件不同?我沒有刪除符號。
關於'objdump -d',分割在段上的elf,.text(帶代碼),'.rodata'常量等等,'objdump -d'僅反彙編'.text'段,而你的數據可能在另一部分。 – fghj