作者 james732 (好人超) 站內 C_and_CPP
標題 Re: [問題] 想寫跟windows下的程式互動的C程式
時間 Thu Oct 14 01:45:14 2010
───────────────────────────────────────
我先寫了一個猜數字小遊戲:
http://nopaste.csie.org/a57f1
如你所見,這隻小遊戲真的很簡單
要破解這隻小遊戲
最好就是能得到 num 變數的值了
為了簡化問題,我把 &num 直接印出來
接下來,就是破解程式了
http://nopaste.csie.org/3353d
這是用 MSDN 拼湊出來的 XDD
執行的畫面大概是這樣的:
http://james803.pixnet.net/album/photo/158382491
(若看不清楚,可按圖片下方的「看原始圖」)
可以看到確實可以很神準的把數字猜出來...XDD
這樣的小程式,應該可以算是個開始了
一定可以看得出來,我把許多地方都簡化很多
如果要破解的對象是「不知道記憶體佈局」的程式,就不會這麼輕鬆了
有興趣的可以繼續研究下去囉,也希望有其他強者可以繼續補充 XDDDD
ps. 我的編譯環境:Visual Studio 2010
--
對了,我想要請教一下
google 找到 scanf("%*c"); 這個東西可以吃掉 stdin 多餘的 \n
不過我不懂 "%*c" 的意思是...?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.117.171.46
※ 編輯: james732 來自: 140.117.171.46 (10/14 01:46)
推 nowar100:代表從stdin進來,但是沒有儲存到參數裡面 10/14 01:47
→ james732:先謝謝板主回答 XD 不過想睡覺了,明天再仔細想想 10/14 01:49
推 loveme00835:@_@ 好奇怪的用法 10/14 01:50
推 cooper6334:GM8好像是對數值更新前後的不同去抓記憶體中改變的部份 10/14 01:51
→ james732:在GM8之前的遊戲修改程式就是用比較的了~ 10/14 01:52
→ james732:記得我還用過dos底下的,而且因為遊戲的記憶體位置不會變 10/14 01:52
→ james732:只要改一次存檔就可以永遠使用了 10/14 01:53
推 cooper6334:這樣抓別的process範圍內的記憶體內容不會被OS檔掉嗎? 10/14 01:54
→ james732:OS提供的API就是合法的途徑囉 10/14 01:55
→ james732:拿提款單去郵局窗口提款不會被當作搶劫吧 XDD 10/14 01:56
推 loveflames:都有塞指令進其他process的API了,一時想不起來是哪個 10/14 01:58
推 QQ29:請問一下一般人有辦法知道PID和virtual address嗎? 10/14 02:05
推 loveflames:應該可以用執行檔的名稱來查PID 10/14 02:08
推 QQ29:是靠別的軟體查嗎?如果是的話 別的軟體是怎麼找的~有API可拿? 10/14 02:09
→ loveflames:至於virtual address...只能從stack跟data section慢慢 10/14 02:10
→ loveflames:找了 10/14 02:10
推 QQ29:請問l大 stack的起始位址在哪我該如何得知呀~ 10/14 02:15
→ QQ29:j大是印出來 但如果不印出來 又要像是GM8那樣暴力掃值 10/14 02:15
→ QQ29:應該是從某個base address開始跑 但怎決定這個值呢? 10/14 02:15
推 manlike:這個不錯 XD 10/14 02:16
→ QQ29:還有該掃到多少終止該怎麼定義@@ 10/14 02:17
→ manlike:stack應該是沒辦法 .data可以~ 10/14 02:17
推 QQ29:沒甚麼概念= = 有參考的網頁嗎~~ 10/14 02:19
→ manlike:不過原po要得那些數據應該都會存成gobal或在heap裡~ XD 10/14 02:20
→ manlike:heap的話應該也無解 要猜的東西太多 global變數的話應該可 10/14 02:23
→ loveflames:當然可以取得stack的起始位址,研究一下TEB吧 10/14 02:32
→ loveflames:看是ELF的heap還是PE的heap,前者的結構比較簡單 10/14 02:34
推 loveflames:用GetModuleHandle跟GetProcessId應該就能取得PID了 10/14 02:40
→ loveflames:懶得測試 10/14 02:40
推 herman602:XDDDDD 好棒喔 10/14 02:42
推 QQ29:l大GetModuleHandle 要傳module name 我有辦法 列舉 module 10/14 02:42
→ QQ29:name 嗎? 10/14 02:42
→ herman602:弄得我也好想做壞事了= = 10/14 02:43
推 loveflames:名稱就是***.exe啊,總該知道要讀哪個程式吧 10/14 02:46
→ tropical72:psapi.h -> EnumProcesses, EnumProcessModules 10/14 02:48
→ tropical72:http://ppt.cc/vXMQ 10/14 02:49
→ stupid0319:API用的好的話Nprotect下也是可以修改 10/14 03:10
→ stupid0319:http://www.badongo.com/pic/10683557 10/14 03:10
→ tropical72:樓上圖中的游戲,不知是否有防外掛(ex:神盾) 10/14 03:12
→ manlike:stack跟heap難處在於會一直變動 所以除非你程式要一直暴力 10/14 03:13
→ manlike:搜heap跟stack找你要得資料 但是你也要有個很明確的參考點 10/14 03:14
→ stupid0319:在神盾下修改的 10/14 03:15
→ manlike:像id字串就可以假設已知先找出id字串位置 其他數字用猜的 10/14 03:16
→ tropical72:請問s大也是使用上述之方法嗎?之前我改的被擋下了 = = 10/14 03:17
→ stupid0319:我用DLL注射到遊戲的 10/14 03:25
→ stupid0319:搜尋核心 http://nopaste.csie.org/72667 寫的很差 10/14 03:39
→ loveflames:沒仔細研究樓上寫的程式,不過finalAddress不是應該設 10/14 04:06
→ loveflames:成0x80000000?因為user space有2GB 10/14 04:07
推 loveflames:萬一碰到ImageBase設很大的程式會出錯吧? 10/14 04:12
推 linjack:太酷了 XD 10/14 09:35
→ stupid0319:user space到0x80000000沒錯啦,但>0x20000000都是DLL 10/14 09:35
推 loveflames:有些exe不是,例如cmd.exe 10/14 09:39
→ manlike:currentData應該要轉型成unsigned long再+1比較好 XD 10/14 09:58
→ stupid0319:樓上是怕有負值嗎?事實上不可能會超過0x80000000 10/14 10:01
→ loveflames:我的意思是PE header起始位置如果大於0x40000000,這樣 10/14 10:02
→ loveflames:不就超過finalAddress範圍了? 10/14 10:02
→ loveflames:至於32 bit下的user space能不能超過0x80000000 10/14 10:04
→ loveflames:印象中可以調成3G? 10/14 10:04
→ manlike:Linux的話user space process virtual memory address都在 10/14 10:20
→ manlike:0xC0000000以下的3GB, Windows不清楚 XD 10/14 10:21
推 lwecloud:Windows 32bit的話,應該是有2GB跟3GB兩種 10/14 11:34
→ lwecloud:看boot.ini有沒有啟用/3GB或/USERVA 10/14 11:35
推 haosan:[Link E] undefined reference to 'EnumProcessModules@16' 10/14 12:30
→ haosan:t大 我用Dev-cpp編譯你貼的程式不行耶 請問要怎改orz 10/14 12:31
→ stupid0319:沒導入lib吧 10/14 12:33
→ tropical72:沒有dev可測,直覺和樓上同,沒導入dev. 10/14 12:48
→ tropical72:加入 #pragma_comment(lib,"psapi.lib") 試試 10/14 12:48
推 final01:Cheat Engine 10/14 15:17
推 haosan:invalid preprocessing directive #pragma_comment 10/14 19:37
→ haosan:另外我在dev-cpp的資料夾下只找到 libpsapi.a 10/14 19:37
→ haosan:請高手指教一下該怎麼做@@ 10/14 19:39
推 softwind:推~ 這hacking 滿有趣的~ 10/14 21:59
→ james732:我可以建議haosan不要用Dev-C++嗎...XDDD 10/14 22:06
推 haosan:好吧!! 感謝大家XDD 10/14 22:08
→ loveflames:dev c++有些lib的名稱跟人家不一樣 10/14 22:09
推 purpose:http://codepad.org/qjzRPhZv scanf(*) 10/14 23:25
→ purpose:不是完全懂,不過使用感覺上用 getchar 清 buf 我比較喜歡 10/14 23:26
推 loveflames:scanf("%c");跟scanf("%*c"); 有沒有差? 10/14 23:28
推 purpose:一樣從buffer抓出一個char,但是差在不寫入變數 10/14 23:29
推 xatier:推樓上精采程式碼講解 10/15 07:21
推 loveflames:下一篇是不是問thread id的?有人有印象嗎? 10/15 07:28
推 purpose:我有印象,又是個刪文小超人 10/15 07:47
推 purpose:問說怎樣列出每個Thread的ID,然後講到記憶體位址跟FS:[0] 10/15 07:55
→ purpose:還有找到主執行緒,就會有指標指向下一個執行緒資訊 10/15 07:55
沒有留言:
張貼留言