2016-08-27 10 views
0

しばらく前に開発したアプリケーションのクエリを編集する必要があります。しかし、私はソースコードを持っていません、コンパイルされたDLLだけです。以下は、Telerik JustDecompileによって逆コンパイルされたソースです。Reflexilを使用してILのCommandTextに文字列を割り当てます。

Reflexilで
conCl.Conn(); 
conCl.Con.Open(); 
SqlCommand com = conCl.Com; 
string[] strArrays = new string[] { "SELECT * FROM TBL_USER WHERE u_name = '", user.Replace("'", "''"), "' AND u_pass = '", password.Replace("'", "''"), "' and u_IsActive = 1 " }; 
com.CommandText = string.Concat(strArrays); 
SqlDataReader sqlDataReader = conCl.Com.ExecuteReader(); 

たILている:今、私が欲しいものである

off op  operand 
set code  

18 ldfld System.Data.SqlClient.SqlConnection ANZFrameWorkDAL.ConCls::Con 
23 callvirt System.Void System.Data.SqlClient.SqlConnection::Open() 
28 nop 
29 ldloc.0 
30 ldfld System.Data.SqlClient.SqlCommand ANZFrameWorkDAL.ConCls::Com 
35 ldc.i4.5  
36 newarr System.String 
41 stloc.s -> (4) (System.String[]) 
43 ldloc.s -> (4) (System.String[]) 
45 ldc.i4.0  
46 ldstr SELECT * FROM TBL_USER WHERE u_name = ' 
51 stelem.ref 
52 nop 
53 ldloc.s -> (4) (System.String[]) 
55 ldc.i4.1  
56 ldarg.1 
57 ldstr ' 
62 ldstr '' 
67 callvirt System.String System.String::Replace(System.String,System.String) 
72 stelem.ref 
73 nop 
74 ldloc.s -> (4) (System.String[]) 
76 ldc.i4.2  
77 ldstr ' AND u_pass = ' 
82 stelem.ref 
83 nop 
84 ldloc.s -> (4) (System.String[]) 
86 ldc.i4.3  
87 ldarg.2 
88 ldstr ' 
93 ldstr '' 
98 callvirt System.String System.String::Replace(System.String,System.String) 
103 stelem.ref 
104 nop 
105 ldloc.s -> (4) (System.String[]) 
107 ldc.i4.4  
108 ldstr ' and u_IsActive = 1 
113 stelem.ref 
114 nop 
115 ldloc.s -> (4) (System.String[]) 
117 call System.String System.String::Concat(System.String[]) 
122 callvirt System.Void System.Data.SqlClient.SqlCommand::set_CommandText(System.String) 
127 nop 
128 ldloc.0 
129 ldfld System.Data.SqlClient.SqlCommand ANZFrameWorkDAL.ConCls::Com 
134 callvirt System.Data.SqlClient.SqlDataReader System.Data.SqlClient.SqlCommand::ExecuteReader() 

com.CommandText =「SELECT *フォームtbl_user u_name = '管理者' "

opcode = ldstr operand = select * form tbl_user where u_name = 'admin' 

ようにオフセットした後

私は、文字列をロードしようとしましたが、出力は

strArrays.CommandText = string.Concat((string[])"select * form tbl_user where u_name = 'admin'"); 

になったので、私は自分の変更を削除したとして117をオフセットした後、同じ文字列を追加します。

opcode = ldstr operand = select * form tbl_user where u_name = 'admin' 

出力が変更され、やりたいことに多少近づいていますが、まだ正しくはありません。出力はなった:

string.Concat(strArrays).CommandText = "select * form tbl_user where u_name = 'admin'"; 

私は何をしたいことは次のとおりです。

com.CommandText =私はまた

"tbl_userから* u_name = '管理' を選択し"オフセット122の後にcallvirtオペコードを追加しようとしましたが、ロードされた.NETフレームワークが4.6.1の場合、System.Data.SqlClient.SqlCommandでset_CommandTextメソッドを見つけることができませんでした

どうすればいいですか?どうか助けていただければ幸いです。ありがとう

+0

試行錯誤はMSILを書く恐ろしい方法であり、失敗することはほぼ確実です。最終的なMSILの外観を考えましたか?私は 'ldstr'命令だけを意味するわけではありません。 – hvd

+0

あなたは何を提案しますか? ILを変える以外の方法はありますか? –

+0

既存の文字列に文字列を追加するか、文字列だけを使用しますか? – thehennyy

答えて

1

ほとんどのメソッドは文字列の連結であるため、削除することができます。オフセット35から117までのすべての命令を、文字列を含む単一のldstrと置き換えることができます。

関連する問題