Назначьте строку для CommandText в IL с помощью Reflexil

Мне нужно отредактировать запрос для приложения, разработанного некоторое время назад. Но у меня нет исходного кода, только скомпилированные DLL. Ниже приводится источник, декомпилированный Telerik JustDecompile.

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 в Reflexil является:

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 = "Выбрать * форму tbl_user, где u_name = 'admin'"

Я пытался загрузить строку после смещения 115 как

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 = "select * from tbl_user, где u_name = 'admin'"

Я также попытался добавить код операции callvirt после смещения 122, но мне не удалось найти метод set_CommandText в System.Data.SqlClient.SqlCommand, когда загруженная платформа.NET была 4.6.1.

Как я могу это сделать? Пожалуйста, любая помощь будет оценена. СПАСИБО

1 ответ

Решение

Большая часть метода - это просто конкатенация строк, поэтому вы можете удалить ее. Вы можете заменить все инструкции со смещения от 35 до 117 включительно, на один ldstr которая содержит вашу строку.

Другие вопросы по тегам