解决方法很多!用IDAPro或objdump反汇编语义,比如分析其中的静态全局变量、局部变量、堆变量。
静态全局变量在可执行文件加载的时候就被分配在数据段。
局部变量是进入一个函数以后在esp和ebp之间的内存,比如[ebp+20]或者[esp-10]之类的内存引用。
堆变量要检测有没有glibc的_malloc或者_calloc或者mmap或者mmap2之类的调用。如果要进一步一般化,有可能在源代码中有int0x80(linux)或者int0x21(windows)的系统调用,调用编号被放在eax中,可以查表得到相应编号的功能。比如int0x80(eax=3)是read,eax=4是write。
确定了语义之后就可以修改可执行文件了。找到你要修改相应语句的eip值,根据elf头(linux)或者pe头(windows)确定实际加载的语句的内存地址和静态文件中的偏移量的对应关系,直接在上面修改二进制指令。比如一条ret是c3,你想改成暂停就把c3改成cc,等等。
如果想进一步插入一些代码在可执行文件中,就需要二进制文件拖拽,暂时没有很好的工具,可以自己做一个。但是要注意间接函数调用的所有函数指针和jumptable,数据都要相应的移动,如果你把你要插入的代码放在最高的位置或者最低的位置就没有问题。注意别忘了修改elf或者pe的表头信息,这个有很多工具可以做。