首页
论坛
课程
招聘
[原创]谈谈修改binary的新思路
2009-10-21 16:16 4418

[原创]谈谈修改binary的新思路

2009-10-21 16:16
4418
谈谈修改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写成的,于是开发成本很低。

[2022冬季班]《安卓高级研修班(网课)》月薪三万班招生中~

收藏
点赞0
打赏
分享
最新回复 (1)
雪    币: 325
活跃值: 活跃值 (20)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
morning 活跃值 1 2009-10-23 11:40
2
0
如果代码多,当然用dll,如果代码很少,用汇编patch一下也省事
游客
登录 | 注册 方可回帖
返回