Вот возникла у меня такая задача: Имеем друпал сайт, CKEDITOR и нужно сделать так, чтобы картинки которые добавляются в контент страниц, по клику открывались через Thickbox. Трахался я минут 30 с гуглем и прочими секретными инструментами. Уже собирался модули патчить, хотя это как бы и не лучший выход по многим причинам. И вот!!! Наконец-то я нашел. Нужно просто взять image_resize_filter , установить его, посмотреть на странице описания модуля как его настраивать, сделать все по инструкции, которая там есть и все замечательно получится без какой-либо правки модулей и т.д. Очень удобно, замечательно и красиво.
Еще одно примечание, если вы хотите, чтобы при клике на увеличенную картинку автоматом производился переход к следующей, то нужно указать атрибут [roadtrip].
Будет время напишу подробней. Кому нужно велком в каменты.
Личный блог посвященный компьютерам, программированию, разработке сайтов, дизайну и информационной безопасности.
понедельник, 24 января 2011 г.
суббота, 11 декабря 2010 г.
MemoryTools - Утилита для работы с памятью других приложений.
Здравствуйте!
Представляю Вашему вниманию свою новую утилиту для работы с памятью. Название ее MemoryTools. Скачать полный исходный код и бинарники вы можете тут.
Итак, теперь немного о самой утилите и ее функциональных возможностях. Возьмем для примера достаточно известную игрушку под названием World Of Warcraft, и немного помучаем ее.
Как только вы запустите утилиту, вы увидите следующее:
Теперь вам нужно выбрать из выпадающего списка процесс к которому мы собираемся подключаться и нажмем кнопку Attach.(в данном случае это будет wow).
Теперь выберем оффсет и вставим туда такое значение 0x008b3e36(значение CurrentRealm, которое может менятся при выходе новых патчей игры), нажмем кнопку show и мы увидим название текущего реалма.
Снизу этого окна мы видим базовый адрес приложения. Если поставим галочку AutoRefresh, то нужное нам значение будет обновляться с заданным в миллисекундах интервалом. Значение в поле оффсет получается вычитанием адреса в приложении от его базового адреса.
Теперь перейдем на вкладку OffsetFinder.
Нажмем на иконку открыть файл и отркоем, идущий с приложением oManager.xml
Далее нажимаем на зеленую стрелочку, и вуаля, программа нам выдает смещения функций или переменных в выбранном приложении. Мы увидим нечто вроде
LuaDoString: 0x0039d8c0
LastGlueState: 0x0097bd4c
IsLoadingOrConnecting: 0x0097bd6c
LuaGetTop: 0x00035300
ClickToMove: 0x008cbb70
Это как раз и есть те оффсеты, которые мы вставляем в первую вкладку.
Так-же, на главной вкладке мы можем нажать на кнопочку DisAsm и получить кусок дизасемблированного листинга, начиная с указанного адреса или оффсета.
Еще одно примечание, программу нужно запускать с правами администратора.
Удачи.
Представляю Вашему вниманию свою новую утилиту для работы с памятью. Название ее MemoryTools. Скачать полный исходный код и бинарники вы можете тут.
Итак, теперь немного о самой утилите и ее функциональных возможностях. Возьмем для примера достаточно известную игрушку под названием World Of Warcraft, и немного помучаем ее.
Как только вы запустите утилиту, вы увидите следующее:
Теперь вам нужно выбрать из выпадающего списка процесс к которому мы собираемся подключаться и нажмем кнопку Attach.(в данном случае это будет wow).
Теперь выберем оффсет и вставим туда такое значение 0x008b3e36(значение CurrentRealm, которое может менятся при выходе новых патчей игры), нажмем кнопку show и мы увидим название текущего реалма.
Снизу этого окна мы видим базовый адрес приложения. Если поставим галочку AutoRefresh, то нужное нам значение будет обновляться с заданным в миллисекундах интервалом. Значение в поле оффсет получается вычитанием адреса в приложении от его базового адреса.
Теперь перейдем на вкладку OffsetFinder.
Нажмем на иконку открыть файл и отркоем, идущий с приложением oManager.xml
Далее нажимаем на зеленую стрелочку, и вуаля, программа нам выдает смещения функций или переменных в выбранном приложении. Мы увидим нечто вроде
LuaDoString: 0x0039d8c0
LastGlueState: 0x0097bd4c
IsLoadingOrConnecting: 0x0097bd6c
LuaGetTop: 0x00035300
ClickToMove: 0x008cbb70
Это как раз и есть те оффсеты, которые мы вставляем в первую вкладку.
Так-же, на главной вкладке мы можем нажать на кнопочку DisAsm и получить кусок дизасемблированного листинга, начиная с указанного адреса или оффсета.
Еще одно примечание, программу нужно запускать с правами администратора.
Удачи.
четверг, 9 декабря 2010 г.
понедельник, 22 ноября 2010 г.
Программист - прагматик
Вот недавно попалась в руки офигенная книга. Называется она "Программист-прагматик". Рассказывается о том, как быть настоящим программером. О методологии, подходах, проектированнию, хитростях. В общем о многих вещах, о которых нигде в других местах сборно не рассказывается. В общем must be readed.
понедельник, 8 ноября 2010 г.
C# Работа с прокси.
IEProxy.ProxyEnabled = cbUseProxy.Checked;
IEProxy.ProxyServer = tbProxyName.Text + ":" + tbPort.Text;
using System;
using Microsoft.Win32;
namespace ProxyII
{
/// <summary>
/// Summary description for IEProxy.
/// </summary>
public class IEProxy
{
#region Variables
private static readonly RegistryKey currentUser = Registry.CurrentUser;
private static RegistryKey _InternetSettings;
#endregion
#region Public static methods
/// <summary>
/// Open the key where Internet Explorer store's its proxy setting
/// </summary>
private static void OpenInternetSettings()
{
_InternetSettings = currentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", true);
}
/// <summary>
/// Proxy Server name. It can be IP, IP:PORT or a HTTP URL with PORT
/// </summary>
public static string ProxyServer
{
get
{
OpenInternetSettings();
string value = (string)_InternetSettings.GetValue( "ProxyServer", string.Empty );
_InternetSettings.Close();
return value;
}
set
{
OpenInternetSettings();
_InternetSettings.SetValue( "ProxyServer", value );
_InternetSettings.Close();
}
}
/// <summary>
/// True means proxy setting is applied, otherwise proxy is ignored
/// </summary>
public static bool ProxyEnabled
{
get
{
OpenInternetSettings();
int value = (int)_InternetSettings.GetValue( "ProxyEnable", 0 );
_InternetSettings.Close();
return (value > 0);
}
set
{
OpenInternetSettings();
int setValue = ( value ? 1 : 0 );
_InternetSettings.SetValue( "ProxyEnable", setValue );
_InternetSettings.Close();
}
}
public static bool BypassProxyForLocal
{
get
{
OpenInternetSettings();
string value = (string) _InternetSettings.GetValue( "ProxyOverride", string.Empty );
_InternetSettings.Close();
// If bypass proxy set, then it should contain <local>
if( value.IndexOf("<local>") >= 0 )
return true;
else
return false;
}
set
{
OpenInternetSettings();
string existingValue = (string) _InternetSettings.GetValue( "ProxyOverride", string.Empty );
if( existingValue.IndexOf("<local>") >= 0 )
{
if( !value )
existingValue = existingValue.Replace( ";" + Environment.NewLine + "<local>", "" );
}
else
{
// does not contain the local keyword. Add it.
if( value )
existingValue += ";" + Environment.NewLine + "<local>";
}
_InternetSettings.SetValue( "ProxyOverride", existingValue );
_InternetSettings.Close();
}
}
#endregion
}
}
IEProxy.ProxyServer = tbProxyName.Text + ":" + tbPort.Text;
using System;
using Microsoft.Win32;
namespace ProxyII
{
/// <summary>
/// Summary description for IEProxy.
/// </summary>
public class IEProxy
{
#region Variables
private static readonly RegistryKey currentUser = Registry.CurrentUser;
private static RegistryKey _InternetSettings;
#endregion
#region Public static methods
/// <summary>
/// Open the key where Internet Explorer store's its proxy setting
/// </summary>
private static void OpenInternetSettings()
{
_InternetSettings = currentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", true);
}
/// <summary>
/// Proxy Server name. It can be IP, IP:PORT or a HTTP URL with PORT
/// </summary>
public static string ProxyServer
{
get
{
OpenInternetSettings();
string value = (string)_InternetSettings.GetValue( "ProxyServer", string.Empty );
_InternetSettings.Close();
return value;
}
set
{
OpenInternetSettings();
_InternetSettings.SetValue( "ProxyServer", value );
_InternetSettings.Close();
}
}
/// <summary>
/// True means proxy setting is applied, otherwise proxy is ignored
/// </summary>
public static bool ProxyEnabled
{
get
{
OpenInternetSettings();
int value = (int)_InternetSettings.GetValue( "ProxyEnable", 0 );
_InternetSettings.Close();
return (value > 0);
}
set
{
OpenInternetSettings();
int setValue = ( value ? 1 : 0 );
_InternetSettings.SetValue( "ProxyEnable", setValue );
_InternetSettings.Close();
}
}
public static bool BypassProxyForLocal
{
get
{
OpenInternetSettings();
string value = (string) _InternetSettings.GetValue( "ProxyOverride", string.Empty );
_InternetSettings.Close();
// If bypass proxy set, then it should contain <local>
if( value.IndexOf("<local>") >= 0 )
return true;
else
return false;
}
set
{
OpenInternetSettings();
string existingValue = (string) _InternetSettings.GetValue( "ProxyOverride", string.Empty );
if( existingValue.IndexOf("<local>") >= 0 )
{
if( !value )
existingValue = existingValue.Replace( ";" + Environment.NewLine + "<local>", "" );
}
else
{
// does not contain the local keyword. Add it.
if( value )
existingValue += ";" + Environment.NewLine + "<local>";
}
_InternetSettings.SetValue( "ProxyOverride", existingValue );
_InternetSettings.Close();
}
}
#endregion
}
}
четверг, 28 октября 2010 г.
Как искать паттерны в IdaPython
Для того, чтобы найти какую-то функцию, или часть кода по маске нужно сделать всего-навсего очень простую команду:
print '0x%.08X' % FindBinary(INF_BASEADDR, SEARCH_DOWN, '83 3D ? ? ? 00 00 75')
print '0x%.08X' % FindBinary(INF_BASEADDR, SEARCH_DOWN, '83 3D ? ? ? 00 00 75')
вторник, 26 октября 2010 г.
C# Работа со временем.
Вот есть в шарпе класс DateTime, который позволяет работать с датой временем и т.д. А вот если нам нужно только время, без даты? Чтобы дата не учитывалась. Например, мы пишем программу, которая будет выполнять определенные задачи по расписанию. Допустим в определенное время запускать и в определенное время останавливать какие-то процессы. Для этого нам потребуется класс, который может достаточно просто представлять время, но без даты. Вот этот класс(или вернее структура):
namespace Helpers
{
public struct Time //: IComparable
{
private int minuteOfDay;
public static Time Midnight = "0:00";
private static int MIN_OF_DAY = 60 * 24;
public Time(int minuteOfDay)
{
if (minuteOfDay >= (60 * 24) || minuteOfDay < 0)
throw new ArgumentException("Skal ligge i intervallet 0 - 1439", "minuteOfDay");
this.minuteOfDay = minuteOfDay;
}
public Time(int hour, int minutes)
{
if (hour < 0 || hour > 23)
throw new ArgumentException("Must be in the range 0-23", "hour");
if (minutes < 0 || minutes > 59)
throw new ArgumentException("Must be in the range 0-59", "minutes");
minuteOfDay = (hour * 60) + minutes;
}
#region Operators
public static implicit operator Time(string s)
{
var parts = s.Split(':');
if (parts.Length != 2)
throw new ArgumentException("Time must be specified on the form tt:mm");
return new Time(int.Parse(parts[0]), int.Parse(parts[1]));
}
public static bool operator >(Time t1, Time t2)
{
return t1.MinuteOfDay > t2.MinuteOfDay;
}
public static bool operator <(Time t1, Time t2)
{
return t1.MinuteOfDay < t2.MinuteOfDay;
}
public static bool operator >=(Time t1, Time t2)
{
return t1.MinuteOfDay >= t2.MinuteOfDay;
}
public static bool operator <=(Time t1, Time t2)
{
return t1.MinuteOfDay <= t2.MinuteOfDay;
}
public static bool operator ==(Time t1, Time t2)
{
return t1.GetHashCode() == t2.GetHashCode();
}
public static bool operator !=(Time t1, Time t2)
{
return t1.GetHashCode() != t2.GetHashCode();
}
/// Time
/// Minutes that remain to
/// Time conferred minutes
public static Time operator +(Time t, int min)
{
if (t.minuteOfDay + min < (24 * 60))
{
t.minuteOfDay += min;
return t;
}
else
{
t.minuteOfDay = (t.minuteOfDay + min) % MIN_OF_DAY;
return t;
}
}
public static Time operator -(Time t, int min)
{
if (t.minuteOfDay - min > -1)
{
t.minuteOfDay -= min;
return t;
}
else
{
t.minuteOfDay = MIN_OF_DAY + (t.minuteOfDay - min);
return t;
}
}
public static TimeSpan operator -(Time t1, Time t2)
{
return TimeSpan.FromMinutes(Time.Span(t2, t1));
}
#endregion
public int Hour
{
get
{
return (int)(minuteOfDay / 60);
}
}
public int Minutes
{
get
{
return minuteOfDay % 60;
}
}
public int MinuteOfDay
{
get { return minuteOfDay; }
}
public Time AddHours(int hours)
{
return this + (hours * 60);
}
public int CompareTo(Time other)
{
return this.minuteOfDay.CompareTo(other.minuteOfDay);
}
#region Overrides
public override int GetHashCode()
{
return minuteOfDay.GetHashCode();
}
public override string ToString()
{
return string.Format("{0}:{1:00}", Hour, Minutes);
}
#endregion
///
/// Safe enumerering - whatever interval applied max days
///
/// Start time
/// Spring in minutes
///
public static IEnumerable<Time> Range(Time start, int step)
{
return Range(start, start, step);
}
///
/// Safe enumerering - whatever interval applied max days
///
public static IEnumerable<Time> Range(Time start, Time stop, int step)
{
int offset = start.MinuteOfDay;
for (var i = 0; i < Time.Span(start, stop); i += step)
{
yield return Time.Midnight + (i + offset);
}
}
///
/// Calculates the number of minutes between t1 and t2
///
public static int Span(Time t1, Time t2)
{
if (t1 < t2) // same day
return t2.MinuteOfDay - t1.MinuteOfDay;
else // over midnight
return MIN_OF_DAY - t1.MinuteOfDay + t2.MinuteOfDay;
}
}
}
Применять его можно примерно так:
Time tStop = "12:03";
Time tStart = "13:20";
DateTime dtNow = DateTime.Now;
Time tNow = new Time(dtNow.Hour, dtNow.Minute);
int t = Time.Span(tStart, tStop);
int t1 = Time.Span(tStart, tNow);
if (t1>1440) t1 = t1-1440;
int t2 = Time.Span(tNow, tStop);
int tsum = t1 + t2;
if (tsum == t) // Если выполнилось это условие, то запускаем нужное задание (то есть время сейчас между 12:03 и 13:20)
if (tsum != t) // Если выполнилось это условие, то останавливаем нужное задание (то есть время сейчас не между 12:03 и 13:20 )
То есть, все достаточно просто. Но одну ошибочку в инструкции по применению данного класса я все же оставил. Для вас. Хотя, возможно она никогда себя так и не проявит в вашем приложении. Тем же кто ее увидит или найдет, просьба выложить в комментарии ваш рецепт ее решения. Хотя это даже не ошибка. Просто одна ситуация которую можно случайно не учесть.
namespace Helpers
{
public struct Time //: IComparable
{
private int minuteOfDay;
public static Time Midnight = "0:00";
private static int MIN_OF_DAY = 60 * 24;
public Time(int minuteOfDay)
{
if (minuteOfDay >= (60 * 24) || minuteOfDay < 0)
throw new ArgumentException("Skal ligge i intervallet 0 - 1439", "minuteOfDay");
this.minuteOfDay = minuteOfDay;
}
public Time(int hour, int minutes)
{
if (hour < 0 || hour > 23)
throw new ArgumentException("Must be in the range 0-23", "hour");
if (minutes < 0 || minutes > 59)
throw new ArgumentException("Must be in the range 0-59", "minutes");
minuteOfDay = (hour * 60) + minutes;
}
#region Operators
public static implicit operator Time(string s)
{
var parts = s.Split(':');
if (parts.Length != 2)
throw new ArgumentException("Time must be specified on the form tt:mm");
return new Time(int.Parse(parts[0]), int.Parse(parts[1]));
}
public static bool operator >(Time t1, Time t2)
{
return t1.MinuteOfDay > t2.MinuteOfDay;
}
public static bool operator <(Time t1, Time t2)
{
return t1.MinuteOfDay < t2.MinuteOfDay;
}
public static bool operator >=(Time t1, Time t2)
{
return t1.MinuteOfDay >= t2.MinuteOfDay;
}
public static bool operator <=(Time t1, Time t2)
{
return t1.MinuteOfDay <= t2.MinuteOfDay;
}
public static bool operator ==(Time t1, Time t2)
{
return t1.GetHashCode() == t2.GetHashCode();
}
public static bool operator !=(Time t1, Time t2)
{
return t1.GetHashCode() != t2.GetHashCode();
}
/// Time
/// Minutes that remain to
/// Time conferred minutes
public static Time operator +(Time t, int min)
{
if (t.minuteOfDay + min < (24 * 60))
{
t.minuteOfDay += min;
return t;
}
else
{
t.minuteOfDay = (t.minuteOfDay + min) % MIN_OF_DAY;
return t;
}
}
public static Time operator -(Time t, int min)
{
if (t.minuteOfDay - min > -1)
{
t.minuteOfDay -= min;
return t;
}
else
{
t.minuteOfDay = MIN_OF_DAY + (t.minuteOfDay - min);
return t;
}
}
public static TimeSpan operator -(Time t1, Time t2)
{
return TimeSpan.FromMinutes(Time.Span(t2, t1));
}
#endregion
public int Hour
{
get
{
return (int)(minuteOfDay / 60);
}
}
public int Minutes
{
get
{
return minuteOfDay % 60;
}
}
public int MinuteOfDay
{
get { return minuteOfDay; }
}
public Time AddHours(int hours)
{
return this + (hours * 60);
}
public int CompareTo(Time other)
{
return this.minuteOfDay.CompareTo(other.minuteOfDay);
}
#region Overrides
public override int GetHashCode()
{
return minuteOfDay.GetHashCode();
}
public override string ToString()
{
return string.Format("{0}:{1:00}", Hour, Minutes);
}
#endregion
///
/// Safe enumerering - whatever interval applied max days
///
/// Start time
/// Spring in minutes
///
public static IEnumerable<Time> Range(Time start, int step)
{
return Range(start, start, step);
}
///
/// Safe enumerering - whatever interval applied max days
///
public static IEnumerable<Time> Range(Time start, Time stop, int step)
{
int offset = start.MinuteOfDay;
for (var i = 0; i < Time.Span(start, stop); i += step)
{
yield return Time.Midnight + (i + offset);
}
}
///
/// Calculates the number of minutes between t1 and t2
///
public static int Span(Time t1, Time t2)
{
if (t1 < t2) // same day
return t2.MinuteOfDay - t1.MinuteOfDay;
else // over midnight
return MIN_OF_DAY - t1.MinuteOfDay + t2.MinuteOfDay;
}
}
}
Применять его можно примерно так:
Time tStop = "12:03";
Time tStart = "13:20";
DateTime dtNow = DateTime.Now;
Time tNow = new Time(dtNow.Hour, dtNow.Minute);
int t = Time.Span(tStart, tStop);
int t1 = Time.Span(tStart, tNow);
if (t1>1440) t1 = t1-1440;
int t2 = Time.Span(tNow, tStop);
int tsum = t1 + t2;
if (tsum == t) // Если выполнилось это условие, то запускаем нужное задание (то есть время сейчас между 12:03 и 13:20)
if (tsum != t) // Если выполнилось это условие, то останавливаем нужное задание (то есть время сейчас не между 12:03 и 13:20 )
То есть, все достаточно просто. Но одну ошибочку в инструкции по применению данного класса я все же оставил. Для вас. Хотя, возможно она никогда себя так и не проявит в вашем приложении. Тем же кто ее увидит или найдет, просьба выложить в комментарии ваш рецепт ее решения. Хотя это даже не ошибка. Просто одна ситуация которую можно случайно не учесть.
Подписаться на:
Сообщения (Atom)