-
-
[原创]谈谈修改binary的新思路
-
发表于:
2009-10-21 16:16
5680
-
谈谈修改binary的新思路
看到本版有很多高手或新手修改任务管理器或者bianry的方法虽然高明但是很痛苦,我这里说说我的做法。
我的做法是dll静态注入+修改binary+Detours+进程外调用,这样做的好处是尽量少些汇编而多写C++代码。
举例来说,我现在每天用secureCRT写linux程序,我想搞一个像magic c++这样的一个gdb外挂。
就是说我在crt中使用gdb的时候,多出一个窗口同步显示代码。
这样一个需求如果纯汇编来写不知道干到何年何月了。
我的做法简单说起来如下:
1,当然先通过反汇编找到能拦截屏幕输出字符串的地方。
我发现scrt有一个记录屏幕输出到文件的功能,默认是关闭的,
我修改binary很容易就把这个功能修改成了默认打开。
然后找到写文件的函数我称为int WriteXXX(WCHAR *str,b,c);
因为这个代码是在exe中的,所以没有重定位的问题,把数值记下来就可以了。
然后使用Detour 来hook这个函数,重定向到我自己的函数中。
于是现在的效果是屏幕上输出的字符都会经过我的dll中函数。
2,当然我需要在scrt的界面上增加一个工具条。这个很简单,
我找到secureCRT的DefualtWinProc然后也是用Detours hook住然后
定向到我自己的函数中,于是在接收到WM_CREATE的时候发现是主窗口就
再创建出一个工具条。
3,使用CFF Explorer编辑pe将这个dll加入到scrt的import table。
4,现在需要解决的是那个同步显示代码的窗口该怎么做?
同样地,在binary找到 zmodem 传输文件的函数hook住,于是我知道在scrt中输入
sz xxx.cpp.这个文件就被zmodem协议下载到本地 然后触发我的代码。
同步显示gdb代码的窗口由于逻辑复杂,如果写进这个dll的话就不方便调试,
因为每次调试都需要杀掉进程然后重新登陆很不方便,于是我就使用
semaphore+sharedmemory搞出了一套进程外通信的的协议,然后另写一个gdbshow.exe
来显示调试中代码。
最后综述一下整个程序的结构:
1,修改scrt拦截到屏幕输出文字,zmodem下载的文件;
2,通过跨进程通信将这些信息传递个令一个程序,这个程序中解析这些字符
和文件同步显示gdb调试的文件;
3,在scrt中静态注入一个dll来作为一个stub,是由C++写成的,
目的在于将拦截到的信息传递出去。
4,大部分复杂业务逻辑在另一个进程中处理,跨进程地得到scrt中的信息并做相应
的展示。该软件是由MFC写成的,于是开发成本很低。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)