Re: [問題] 想寫跟windows下的程式互動的C程式

看板C_and_CPP作者 (好人超)時間15年前 (2010/10/13 17:45), 編輯推噓31(31053)
留言84則, 17人參與, 最新討論串2/2 (看更多)
我先寫了一個猜數字小遊戲: 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)

10/14 01:47, , 1F
代表從stdin進來,但是沒有儲存到參數裡面
10/14 01:47, 1F

10/14 01:49, , 2F
先謝謝板主回答 XD 不過想睡覺了,明天再仔細想想
10/14 01:49, 2F

10/14 01:50, , 3F
@_@ 好奇怪的用法
10/14 01:50, 3F

10/14 01:51, , 4F
GM8好像是對數值更新前後的不同去抓記憶體中改變的部份
10/14 01:51, 4F

10/14 01:52, , 5F
在GM8之前的遊戲修改程式就是用比較的了~
10/14 01:52, 5F

10/14 01:52, , 6F
記得我還用過dos底下的,而且因為遊戲的記憶體位置不會變
10/14 01:52, 6F

10/14 01:53, , 7F
只要改一次存檔就可以永遠使用了
10/14 01:53, 7F

10/14 01:54, , 8F
這樣抓別的process範圍內的記憶體內容不會被OS檔掉嗎?
10/14 01:54, 8F

10/14 01:55, , 9F
OS提供的API就是合法的途徑囉
10/14 01:55, 9F

10/14 01:56, , 10F
拿提款單去郵局窗口提款不會被當作搶劫吧 XDD
10/14 01:56, 10F

10/14 01:58, , 11F
都有塞指令進其他process的API了,一時想不起來是哪個
10/14 01:58, 11F

10/14 02:05, , 12F
請問一下一般人有辦法知道PID和virtual address嗎?
10/14 02:05, 12F

10/14 02:08, , 13F
應該可以用執行檔的名稱來查PID
10/14 02:08, 13F

10/14 02:09, , 14F
是靠別的軟體查嗎?如果是的話 別的軟體是怎麼找的~有API可拿?
10/14 02:09, 14F

10/14 02:10, , 15F
至於virtual address...只能從stack跟data section慢慢
10/14 02:10, 15F

10/14 02:10, , 16F
找了
10/14 02:10, 16F

10/14 02:15, , 17F
請問l大 stack的起始位址在哪我該如何得知呀~
10/14 02:15, 17F

10/14 02:15, , 18F
j大是印出來 但如果不印出來 又要像是GM8那樣暴力掃值
10/14 02:15, 18F

10/14 02:15, , 19F
應該是從某個base address開始跑 但怎決定這個值呢?
10/14 02:15, 19F

10/14 02:16, , 20F
這個不錯 XD
10/14 02:16, 20F

10/14 02:17, , 21F
還有該掃到多少終止該怎麼定義@@
10/14 02:17, 21F

10/14 02:17, , 22F
stack應該是沒辦法 .data可以~
10/14 02:17, 22F

10/14 02:19, , 23F
沒甚麼概念= = 有參考的網頁嗎~~
10/14 02:19, 23F

10/14 02:20, , 24F
不過原po要得那些數據應該都會存成gobal或在heap裡~ XD
10/14 02:20, 24F

10/14 02:23, , 25F
heap的話應該也無解 要猜的東西太多 global變數的話應該可
10/14 02:23, 25F

10/14 02:32, , 26F
當然可以取得stack的起始位址,研究一下TEB吧
10/14 02:32, 26F

10/14 02:34, , 27F
看是ELF的heap還是PE的heap,前者的結構比較簡單
10/14 02:34, 27F

10/14 02:40, , 28F
用GetModuleHandle跟GetProcessId應該就能取得PID了
10/14 02:40, 28F

10/14 02:40, , 29F
懶得測試
10/14 02:40, 29F

10/14 02:42, , 30F
XDDDDD 好棒喔
10/14 02:42, 30F

10/14 02:42, , 31F
l大GetModuleHandle 要傳module name 我有辦法 列舉 module
10/14 02:42, 31F

10/14 02:42, , 32F
name 嗎?
10/14 02:42, 32F

10/14 02:43, , 33F
弄得我也好想做壞事了= =
10/14 02:43, 33F

10/14 02:46, , 34F
名稱就是***.exe啊,總該知道要讀哪個程式吧
10/14 02:46, 34F

10/14 02:48, , 35F
psapi.h -> EnumProcesses, EnumProcessModules
10/14 02:48, 35F

10/14 02:49, , 36F
10/14 02:49, 36F

10/14 03:10, , 37F
API用的好的話Nprotect下也是可以修改
10/14 03:10, 37F

10/14 03:10, , 38F

10/14 03:12, , 39F
樓上圖中的游戲,不知是否有防外掛(ex:神盾)
10/14 03:12, 39F

10/14 03:13, , 40F
stack跟heap難處在於會一直變動 所以除非你程式要一直暴力
10/14 03:13, 40F

10/14 03:14, , 41F
搜heap跟stack找你要得資料 但是你也要有個很明確的參考點
10/14 03:14, 41F

10/14 03:15, , 42F
在神盾下修改的
10/14 03:15, 42F

10/14 03:16, , 43F
像id字串就可以假設已知先找出id字串位置 其他數字用猜的
10/14 03:16, 43F

10/14 03:17, , 44F
請問s大也是使用上述之方法嗎?之前我改的被擋下了 = =
10/14 03:17, 44F

10/14 03:25, , 45F
我用DLL注射到遊戲的
10/14 03:25, 45F

10/14 03:39, , 46F
搜尋核心 http://nopaste.csie.org/72667 寫的很差
10/14 03:39, 46F

10/14 04:06, , 47F
沒仔細研究樓上寫的程式,不過finalAddress不是應該設
10/14 04:06, 47F

10/14 04:07, , 48F
成0x80000000?因為user space有2GB
10/14 04:07, 48F

10/14 04:12, , 49F
萬一碰到ImageBase設很大的程式會出錯吧?
10/14 04:12, 49F

10/14 09:35, , 50F
太酷了 XD
10/14 09:35, 50F

10/14 09:35, , 51F
user space到0x80000000沒錯啦,但>0x20000000都是DLL
10/14 09:35, 51F

10/14 09:39, , 52F
有些exe不是,例如cmd.exe
10/14 09:39, 52F

10/14 09:58, , 53F
currentData應該要轉型成unsigned long再+1比較好 XD
10/14 09:58, 53F

10/14 10:01, , 54F
樓上是怕有負值嗎?事實上不可能會超過0x80000000
10/14 10:01, 54F

10/14 10:02, , 55F
我的意思是PE header起始位置如果大於0x40000000,這樣
10/14 10:02, 55F

10/14 10:02, , 56F
不就超過finalAddress範圍了?
10/14 10:02, 56F

10/14 10:04, , 57F
至於32 bit下的user space能不能超過0x80000000
10/14 10:04, 57F

10/14 10:04, , 58F
印象中可以調成3G?
10/14 10:04, 58F

10/14 10:20, , 59F
Linux的話user space process virtual memory address都在
10/14 10:20, 59F

10/14 10:21, , 60F
0xC0000000以下的3GB, Windows不清楚 XD
10/14 10:21, 60F

10/14 11:34, , 61F
Windows 32bit的話,應該是有2GB跟3GB兩種
10/14 11:34, 61F

10/14 11:35, , 62F
看boot.ini有沒有啟用/3GB或/USERVA
10/14 11:35, 62F

10/14 12:30, , 63F
[Link E] undefined reference to 'EnumProcessModules@16'
10/14 12:30, 63F

10/14 12:31, , 64F
t大 我用Dev-cpp編譯你貼的程式不行耶 請問要怎改orz
10/14 12:31, 64F

10/14 12:33, , 65F
沒導入lib吧
10/14 12:33, 65F

10/14 12:48, , 66F
沒有dev可測,直覺和樓上同,沒導入dev.
10/14 12:48, 66F

10/14 12:48, , 67F
加入 #pragma_comment(lib,"psapi.lib") 試試
10/14 12:48, 67F

10/14 15:17, , 68F
Cheat Engine
10/14 15:17, 68F

10/14 19:37, , 69F
invalid preprocessing directive #pragma_comment
10/14 19:37, 69F

10/14 19:37, , 70F
另外我在dev-cpp的資料夾下只找到 libpsapi.a
10/14 19:37, 70F

10/14 19:39, , 71F
請高手指教一下該怎麼做@@
10/14 19:39, 71F

10/14 21:59, , 72F
推~ 這hacking 滿有趣的~
10/14 21:59, 72F

10/14 22:06, , 73F
我可以建議haosan不要用Dev-C++嗎...XDDD
10/14 22:06, 73F

10/14 22:08, , 74F
好吧!! 感謝大家XDD
10/14 22:08, 74F

10/14 22:09, , 75F
dev c++有些lib的名稱跟人家不一樣
10/14 22:09, 75F

10/14 23:25, , 76F
10/14 23:25, 76F

10/14 23:26, , 77F
不是完全懂,不過使用感覺上用 getchar 清 buf 我比較喜歡
10/14 23:26, 77F

10/14 23:28, , 78F
scanf("%c");跟scanf("%*c"); 有沒有差?
10/14 23:28, 78F

10/14 23:29, , 79F
一樣從buffer抓出一個char,但是差在不寫入變數
10/14 23:29, 79F

10/15 07:21, , 80F
推樓上精采程式碼講解
10/15 07:21, 80F

10/15 07:28, , 81F
下一篇是不是問thread id的?有人有印象嗎?
10/15 07:28, 81F

10/15 07:47, , 82F
我有印象,又是個刪文小超人
10/15 07:47, 82F

10/15 07:55, , 83F
問說怎樣列出每個Thread的ID,然後講到記憶體位址跟FS:[0]
10/15 07:55, 83F

10/15 07:55, , 84F
還有找到主執行緒,就會有指標指向下一個執行緒資訊
10/15 07:55, 84F
文章代碼(AID): #1CjV0jXV (C_and_CPP)
文章代碼(AID): #1CjV0jXV (C_and_CPP)