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