一起玩一個(gè)CrackMe(C#),打算一起來(lái)寫(xiě)KeyGen,他用的是爆破的方法,我修復(fù)程序后發(fā)現(xiàn)里面常量各種溢出...無(wú)奈,只能用reflexil注入方法,然后寫(xiě)出KeyGen.
分享下使用reflexil常用的幾個(gè)方法..
Reflector 之reflexil使用
先寫(xiě)個(gè)簡(jiǎn)單的控制臺(tái)程序
工具,添加插件.
選中reflexil 1.6 (1.7從來(lái)沒(méi)附加成功過(guò).不知道為啥..)
一 直接修改操作數(shù)
可以直接編輯IL
Update 后
在程序集中右鍵
另存程序.
執(zhí)行剛保存的程序
還可以直接添加IL 接著讓后面繼續(xù)輸出
二 直接注入IL
右鍵,新建(new Create),填寫(xiě)對(duì)應(yīng)的操作碼,選擇類型,
值得注意的是右邊的按鈕,append(添加),接著是插入在選擇之前,然后是插入在選擇之后;別選錯(cuò)了.
注意 注入的時(shí)候操作數(shù)的類型別選錯(cuò)了.
然后繼續(xù)參照上面的,將程序另存一次.
三 替換代碼
如果不想折騰IL,直接選擇 替換所有代碼.
不過(guò)這意味著你要重寫(xiě)所有代碼(大多數(shù)時(shí),我都會(huì)用在重寫(xiě)某個(gè)方法上)…然后提交一下,他會(huì)自動(dòng)編譯, 然后繼續(xù)參照上面的,將程序另存一次.
提交完成后會(huì)自動(dòng)編譯,并且再右側(cè)區(qū)域會(huì)生成對(duì)應(yīng)的IL.
然后繼續(xù)參照上面的,將程序另存一次.
執(zhí)行下…
四 注入方法
別選錯(cuò)地方了.是你要將方法注入到某個(gè)類中,不是注入class所以,一定是在類上右鍵
暫時(shí)只能注入返回值為void的方法
對(duì)了,點(diǎn)擊OK后會(huì)有個(gè)該死的提示,這提示的大致意思是:
當(dāng)你在執(zhí)行,增加,刪除,重命名,等動(dòng)作時(shí),你不會(huì)直接看見(jiàn)相應(yīng)的操作,他們是不同步的.
你必須要重新加載程序集才可以看見(jiàn).
當(dāng)然,你還需要將程序另存一次.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
然后你需要關(guān)閉程序集,接著重新打開(kāi)剛才另存的
現(xiàn)在方法已經(jīng)注入進(jìn)去了.
然后我需要給它添加點(diǎn)內(nèi)容..
讓方法輸出個(gè)InjectedMethod字符串
在方法中添加IL
接著修改Main方法,并且調(diào)用剛才注入的方法.
另存下..
執(zhí)行結(jié)果.
Ps: 如果是替換代碼的話,先更改injectmethod時(shí)不用實(shí)現(xiàn)main方法,只需要修改injectmethod()方法,然后再去修改Main方法.調(diào)用時(shí)因?yàn)閕njectmethod方法不是static所以需要實(shí)例化Program
接下來(lái)說(shuō)說(shuō)添加有參數(shù),有返回值的方法:
先在參數(shù)(parameter)標(biāo)簽,中添加一個(gè)參數(shù).
然后在屬性標(biāo)簽中修改返回值為string.
接著使用替換代碼的功能
可以看見(jiàn)方法已經(jīng)帶有參數(shù)并且有返回值.
修改下這個(gè)方法
打印下傳進(jìn)來(lái)的名字,并且打印當(dāng)前時(shí)間
修改主函數(shù)調(diào)用
編譯,然后不要忘記另存….
Good Job .
Have Fun .
By McevilRock
9-7/2014