2010年10月28日 星期四

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

 作者  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

沒有留言:

張貼留言