aobscan原理及實現

2021-07-16 06:33:08 字數 1258 閱讀 6066

**我愛秘籍論壇,這算是一篇比較好的文章了,網上關於aobscan的實現十分少(我倒是見過乙個vb實現的,找不到了)

上面這個aobscan經過測試,10次搜尋至少3次失敗,且效率低下,這篇文章實現乙個十分高效的aobscan演算法,準確率高達100%,效率是上面這個的十倍以上。

aobscan原理,即遍歷目標程序的記憶體空間,找出一段特徵碼,這段特徵碼通常是一段指令,aobscan得到的位址多用於hook,對於外掛程式編寫意義重大。

/*

記憶體搜尋

a:被搜尋記憶體起始位址。

alen:被搜尋記憶體大小。

b:待搜尋記憶體起始位址。

blen:待搜尋記憶體大小。

返回值:b相對於a的位置。

*/int memmem(char * a, int alen, char * b, int blen)

}return -1;}/*

根據十六進製制字元獲得對應的十六進製制數

hex:十六進製制字元

返回值:對應的十六進製制數

*/int ctoh(char hex)

/*通過特徵碼文字獲得特徵碼十六進製制陣列

str:特徵碼文字。

res:儲存得到的陣列。

返回值:陣列的長度。

*/int gethexcode(const char *str,byte *res)

else if(j%2==0)

j++;}}

return k;}/*

主方法hprocess:目標程序控制代碼。

aob:將要搜尋的特徵碼,類似於"6a 1b 4e"這樣的字串,當然空格可以省略。

beginaddr:搜尋起始位址。

返回值:查到的特徵碼的位址,沒有查到返回-1。

*/int aobscan(handle hprocess,char *aob,int beginaddr)

if(mbi.protect!=page_execute_readwrite||mbi.state!=mem_commit)//如果一塊記憶體不符合要求即跳過該記憶體,上面的方法效率低就是因為沒有這一步

//下面將符合要求的記憶體塊分為多個4096大小的記憶體進行搜尋,因為每個符合要求的塊的大小一定會是4096的倍數。

int j;

for(j=0; j<(int)mbi.regionsize/4096; j++)

i+=4096;}}

return -1;

}

主函式的引數只有三個,且說明很清楚,就不寫例子了。

SSH原理及實現

a.ssh 是種通用的網路傳輸加密機制 b.ssh採用的是不對稱加密方式傳輸,分乙個公匙和乙個私匙 公匙用來加密 私匙用來解密 ssh 目錄下可能存在的檔案 authorized keys 其他機器生成的公匙放在本機的,名字必須是這個 id dsa 密匙 id dsa.pub 公匙 known ho...

棧原理及實現

棧原理及實現 棧的定義 棧 stack 是限制僅在表的一端進行插入和刪除運算的線性表。1 通常稱插入 刪除的這一端為棧頂 top 另一端稱為棧底 bottom 2 當表中沒有元素時稱為空棧。3 棧為後進先出 last in first out 的線性表,簡稱為 lifo 表。棧的修改是按後進先出的原...

bitmap原理及實現

以二進位制位來表示數字 例如 第27位為1,第28位為0。表示在map中27存在28不存在 實現 新增,即設定對應位為1 param arg return this public function set arg else return this 判斷數字是否存在 param arg return ...