1.分析部分:
TrojanCut在记录日志文件时会调用CreateFile这个api,用OD对此api下断然后往上回溯就可以回溯出记录日志和弹警报窗口的函数,只需要修改此函数的头部让他直接返回,不执行下面的代码就可是实现不记录日志和不弹窗的功能了。如图1所示(要修改的内存地址是0x433090)
2.代码部分:
(1)要修改其他进程的内存必须的条件要有被修改进程的句柄。进程句柄用OpenProcess获取,而要使用OpenProcess获取某个进程的句柄需要以此进程的PID为参数,PID通过枚举系统进程然后通过枚举进程名获得,代码如图2所示
TrojanCut对每个进程的ZwQuerySystemInformation做了hook如图3所示,我们知道通过图2中的代码枚举系统进程最终是会调用到ZwQuerySystemInformation的,而我们的中的ZwQuerySystemInformation同样也被TrojanCut给hook掉了,只用上面的代码是枚举不到TrojanCut.exe这个进程的,所以再调用图二中的函数之前要先恢复ZwQuerySystemInformation头部的hook然后再调用具体代码如图4所示
我一开始是用的这种方法,但是由于是硬编码的通用性不好,因为ZwQuerySystemInformation在不同的操作系统下ID号是不一样的而我们恢复的这几个字节恰恰是切入到内核的ID号,所以通用性较差。故又想了一个办法就是分析他的钩子过程函数他肯定是要从反回的进程链表中摘除他自身的进程经过分析找到了一个关键的跳转只要把这个跳转nop掉,在我们的程序中就可以枚举到TrojanCut的进程了。如图5五所示。我们要定位到图中红框圈起来的部分用搜索特征码就可以了。代码如图6所示
1.有了进程句柄了,就可以对目标进程访问了,直接对图1中红色的字体部分得地址上也就是0x433090写入retn0xc按理说是可以的,但是TrojanCut一旦升级0x433090就会发生变化,这个时候再对0x433090写入retn0xc就会失效甚至TrojanCut.exe会崩溃。所以为了提高通用性,用了搜索特征码的技术动态定位图中红色部分的地址,这样就能实现对所有TrojanCut版本的通用。通过搜索图1中被绿色框圈起来的那段代码定位到函数的头部。
2.搜索特征码就要读取目标进程的内存然后比较读取内存的函数是ReadProcessMemory。具体代码如图7所示
有了进程句柄有了要写入的地址了就可以写入了,写内存用WriteProcessMemory,Retn0xc的机器码是0xc2,0x0c,0x00;具体代码如图8所示