<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
LyScript外掛中提供了三種基本的堆疊操作方法,其中push_stack
用於入棧,pop_stack
用於出棧,而最有用的是peek_stack
函數,該函數可用於檢查指定堆疊位置處的記憶體引數,利用這個特性就可以實現,對堆疊地址的檢測,或對堆疊的掃描等。
LyScript專案地址:https://github.com/lyshark/LyScript
peek_stack命令傳入的是堆疊下標位置預設從0開始,並輸出一個十進位制有符號長整數,首先實現有符號與無符號數之間的轉換操作,為後續堆疊掃描做準備。
from LyScript32 import MyDebug # 有符號整數轉無符號數 def long_to_ulong(inter,is_64 = False): if is_64 == False: return inter & ((1 << 32) - 1) else: return inter & ((1 << 64) - 1) # 無符號整數轉有符號數 def ulong_to_long(inter,is_64 = False): if is_64 == False: return (inter & ((1 << 31) - 1)) - (inter & (1 << 31)) else: return (inter & ((1 << 63) - 1)) - (inter & (1 << 63)) if __name__ == "__main__": dbg = MyDebug() connect_flag = dbg.connect() print("連線狀態: {}".format(connect_flag)) for index in range(0,10): # 預設返回有符號數 stack_address = dbg.peek_stack(index) # 使用轉換 print("預設有符號數: {:15} --> 轉為無符號數: {:15} --> 轉為有符號數: {:15}". format(stack_address, long_to_ulong(stack_address),ulong_to_long(long_to_ulong(stack_address)))) dbg.close()
通過上述封裝函數,即可實現對有符號和無符號數的轉換。
繼續完善該功能,我們使用get_disasm_one_code()
函數,掃描堆疊地址並得到該地址處的反組合程式碼。
from LyScript32 import MyDebug # 有符號整數轉無符號數 def long_to_ulong(inter,is_64 = False): if is_64 == False: return inter & ((1 << 32) - 1) else: return inter & ((1 << 64) - 1) # 無符號整數轉有符號數 def ulong_to_long(inter,is_64 = False): if is_64 == False: return (inter & ((1 << 31) - 1)) - (inter & (1 << 31)) else: return (inter & ((1 << 63) - 1)) - (inter & (1 << 63)) if __name__ == "__main__": dbg = MyDebug() connect_flag = dbg.connect() print("連線狀態: {}".format(connect_flag)) for index in range(0,10): # 預設返回有符號數 stack_address = dbg.peek_stack(index) # 反組合一行 dasm = dbg.get_disasm_one_code(stack_address) # 根據地址得到模組基址 if stack_address <= 0: mod_base = 0 else: mod_base = dbg.get_base_from_address(long_to_ulong(stack_address)) print("stack => [{}] addr = {:10} base = {:10} dasm = {}".format(index, hex(long_to_ulong(stack_address)),hex(mod_base), dasm)) dbg.close()
得到的堆疊引數如下:
由此我們可以得到堆疊處的反組合引數,但如果我們需要檢索堆疊特定區域內是否存在返回到模組的地址,該如何實現呢?
其實很簡單,首先我們需要得到程式全域性狀態下的所有載入模組的基地址,然後得到當前堆疊記憶體地址內的實際地址,並通過實際記憶體地址得到模組基地址,對比全域性表即可拿到當前模組是返回到了哪裡。
from LyScript32 import MyDebug # 有符號整數轉無符號數 def long_to_ulong(inter,is_64 = False): if is_64 == False: return inter & ((1 << 32) - 1) else: return inter & ((1 << 64) - 1) # 無符號整數轉有符號數 def ulong_to_long(inter,is_64 = False): if is_64 == False: return (inter & ((1 << 31) - 1)) - (inter & (1 << 31)) else: return (inter & ((1 << 63) - 1)) - (inter & (1 << 63)) if __name__ == "__main__": dbg = MyDebug() connect_flag = dbg.connect() print("連線狀態: {}".format(connect_flag)) # 得到程式載入過的所有模組資訊 module_list = dbg.get_all_module() # 向下掃描堆疊 for index in range(0,10): # 預設返回有符號數 stack_address = dbg.peek_stack(index) # 反組合一行 dasm = dbg.get_disasm_one_code(stack_address) # 根據地址得到模組基址 if stack_address <= 0: mod_base = 0 else: mod_base = dbg.get_base_from_address(long_to_ulong(stack_address)) # print("stack => [{}] addr = {:10} base = {:10} dasm = {}".format(index, hex(long_to_ulong(stack_address)),hex(mod_base), dasm)) if mod_base > 0: for x in module_list: if mod_base == x.get("base"): print("stack => [{}] addr = {:10} base = {:10} dasm = {:15} return = {:10}" .format(index,hex(long_to_ulong(stack_address)),hex(mod_base), dasm, x.get("name"))) dbg.close()
執行後,即可掃描到堆疊內的所有返回模組的位置。
到此這篇關於LyScript實現對記憶體堆疊掃描的方法詳解的文章就介紹到這了,更多相關LyScript記憶體堆疊掃描內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45