**我愛秘籍論壇,這算是一篇比較好的文章了,網上關於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 ...