#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/reg.h> //#include <linux/user.h>
#include <sys/syscall.h> const int long_size = sizeof(long); void reverse(char *str)
{
int i, j;
char temp;
for(i = , j = strlen(str) - ;
i <= j; ++i, --j) {
temp = str[i];
str[i] = str[j];
str[j] = temp;
}
} void getdata(pid_t child, long addr,
char *str, int len)
{
char *laddr;
int i, j;
union u {
long val;
char chars[long_size];
}data; i = ;
j = len / long_size;
laddr = str;
while(i < j) {
data.val = ptrace(PTRACE_PEEKDATA,
child, addr + i * , //i * 4
NULL);
memcpy(laddr, data.chars, long_size);
++i;
laddr += long_size;
}
j = len % long_size;
if(j != ) {
data.val = ptrace(PTRACE_PEEKDATA,
child, addr + i * , //i * 4
NULL);
memcpy(laddr, data.chars, j);
}
str[len] = '\0';
} void putdata(pid_t child, long addr,
char *str, int len)
{
char *laddr;
int i, j;
union u {
long val;
char chars[long_size];
}data; i = ;
j = len / long_size;
laddr = str;
while(i < j) {
memcpy(data.chars, laddr, long_size);
ptrace(PTRACE_POKEDATA, child,
addr + i * , data.val); //i * 4
++i;
laddr += long_size;
}
j = len % long_size;
if(j != ) {
memcpy(data.chars, laddr, j);
ptrace(PTRACE_POKEDATA, child,
addr + i * , data.val); //i * 4
}
} int main()
{
pid_t child;
child = fork();
if(child == ) {
ptrace(PTRACE_TRACEME, , NULL, NULL);
execl("/bin/ls", "ls", NULL);
}
else {
long orig_eax;
long params[];
int status;
char *str, *laddr;
int toggle = ;
while() {
wait(&status);
if(WIFEXITED(status))
break;
orig_eax = ptrace(PTRACE_PEEKUSER,
child, * ORIG_RAX, //4 * ORIG_EAX
NULL);
if(orig_eax == SYS_write) {
if(toggle == ) {
toggle = ;
params[] = ptrace(PTRACE_PEEKUSER,
child, * RDI, //4 * EBX
NULL);
params[] = ptrace(PTRACE_PEEKUSER,
child, * RSI, //4 * ECX
NULL);
params[] = ptrace(PTRACE_PEEKUSER,
child, * RDX, //4 * EDX
NULL);
str = (char *)calloc((params[]+) //
, sizeof(char));
getdata(child, params[], str,
params[]);
reverse(str);
putdata(child, params[], str,
params[]);
}
else {
toggle = ;
}
}
ptrace(PTRACE_SYSCALL, child, NULL, NULL);
}
}
return ;
}
注释部分是对原代码的修改,测试环境ubuntu 。 代码2:
/*****************************
*ptrace testing by lasvegas
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/ptrace.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/user.h>
#include <string.h> void getdata(pid_t child, char* const addr, unsigned long getlen, char* const rbuf);
void setdata(pid_t child, void* const addr, unsigned long setlen, char* const sbuf); int main(int argc, char** argv)
{
unsigned long lrmt =0x31;
char rmt[] ="\xEB\x1D\x5B\x48\xC7\xC0\x01\x00\x00\x00\x48\xC7\xC7\x01\x00\x00\x00\x48\x89\xDE\x48\xC7\xC2\x0D\x00\x00\x00\x0F\x05\xEB\x13\xE8\xDE\xFF\xFF\xFF\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x21\x0A";
char back[lrmt];
pid_t child =;
struct user_regs_struct reg; if(argc !=)
{
printf("Usage: %s <target executable file>\n", argv[]);
exit();
}
child =fork();
if(child ==)
{
ptrace(PTRACE_TRACEME, , NULL, );
if(execlp(argv[], argv[], NULL) <)
{
printf("Damn for executable execlp(%s,...)\n", argv[]);
exit();
}
}
else
{
printf("Trace on %d...\n", child);
int status;
ptrace(PTRACE_ATTACH, child, NULL, NULL);
wait(&status);
if(WIFEXITED(status))
{
exit();
}
ptrace(PTRACE_GETREGS, child, NULL, &reg);
getdata(child, (void*)reg.rip, lrmt, back);
setdata(child, (void*)reg.rip, lrmt, rmt);
ptrace(PTRACE_SETREGS, child, NULL, &reg);
ptrace(PTRACE_CONT, child, NULL, NULL);
wait(NULL);
//restore
setdata(child, (void*)reg.rip, lrmt, back);
ptrace(PTRACE_SETREGS, child, NULL, &reg);
//
ptrace(PTRACE_DETACH, child, NULL, NULL);
}
return ;
}
/*
typedef union _mem_byte
{
long inst;
char insts[sizeof(long)];
}mem_byte;
*/ void getdata(pid_t child, char* const addr, unsigned long getlen, char* const rbuf)
{
int i =, j =;
char *laddr =NULL;
char *lbuf =NULL;
long mb; laddr =addr;
lbuf =rbuf;
j =getlen/sizeof(long);
for(i =; i <j; i++)
{
memset(&mb, , sizeof(long));
mb =ptrace(PTRACE_PEEKDATA, child, laddr, NULL);
memcpy(lbuf, &mb, sizeof(long));
lbuf +=sizeof(long);
laddr +=sizeof(long);
}
if(getlen %sizeof(long) !=)
{
memset(&mb, , sizeof(long));
mb =ptrace(PTRACE_PEEKDATA, child, laddr, NULL);
memcpy(lbuf, &mb, getlen %sizeof(long));
}
return;
} void setdata(pid_t child, void* const addr,unsigned long setlen, char* const sbuf)
{
int i =, j=;
char *laddr =NULL;
char *lbuf =NULL;
long mb; laddr =addr;
lbuf =sbuf;
j =setlen/sizeof(long);
for(i =; i <j; i++)
{
memset(&mb, , sizeof(long));
memcpy(&mb, lbuf, sizeof(long));
ptrace(PTRACE_POKETEXT, child, laddr, mb);
laddr +=sizeof(long);
lbuf +=sizeof(long);
}
if(setlen %sizeof(long) !=)
{
memset(&mb, , sizeof(long));
memcpy(&mb, lbuf, setlen%sizeof(long));
ptrace(PTRACE_POKETEXT, child, laddr, mb);
} return;
}

ptrace x64 转的更多相关文章

  1. Playing with ptrace, Part II

    Playing with ptrace, Part II Issue From Issue # December Dec , By Pradeep Padala inSysAdmin In Part ...

  2. 玩转ptrace(转)

    下面是转帖的内容,写的很详细.但是不同的linux发行版中头文件的路径和名称并不相同.如在某些发行版中<linux/user.h>就不存在,其中定义的变量出现在<asm/ptrace ...

  3. Linux Ptrace 详解

    转 https://blog.csdn.net/u012417380/article/details/60470075 Linux Ptrace 详解 2017年03月05日 18:59:58 阅读数 ...

  4. X86和X86_64和X64有什么区别?

    x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为&qu ...

  5. VisualStudio 2015 开启IIS Express可以调试X64项目

    现在项目开发时总有时需要在X64下开发,这样我们就需要IIS Express中调试.不要总是放在IIS中,在Attach这样好慢.   如果不设置直接调试X64的程序,我们有可能会受到以下类似的错误 ...

  6. Win7(x64)升级到Win10

    北京时间7月29日零点起,微软正式开始向包含中国在内的全球用户推送Windows 10正式版安装包,Win7.Win8正版用户从29日零点起就可以免费升级到Win 10. 如果你的C盘里边有“$Win ...

  7. 数据库管理工具GUI - PremiumSoft Navicat Premium Enterprise 11.2.15 x86/x64 KEY

    转载自: 数据库管理工具GUI - PremiumSoft Navicat Premium Enterprise 11.2.15 x86/x64 KEY Navicat Premium(数据库管理工具 ...

  8. 在Ubuntu X64上编译Hadoop

    在之前的文章中介绍了如何直接在Ubuntu中安装Hadoop.但是对于64位的Ubuntu来说,官方给出的Hadoop包是32位的,运行时会得到警告: WARN util.NativeCodeLoad ...

  9. win7(x64)下安装cocos2d并编译安卓项目

    好吧,不为啥,就是如题. win7 x64 脑袋内存比较小,说不定明儿就忘了,今天记录一下. 没有什么经验,所有步骤基本都是百度出来的,这里边操作边记录,为了保护原创作者,这里我都附上我查找的链接. ...

随机推荐

  1. 在Ubuntu下安装Apache

    在Ubuntu下安装软件其实非常方便,Ubuntu提供了apt-get工具,可以使用该工具直接下载安装软件. 在Linux里,系统最高权限账户为root账户,而默认登录的账户并非root账户,例如不具 ...

  2. Windows下Qt开发环境:OpenGL导入3DMax模型(.3DS)

    参考:http://blog.csdn.net/cq361106306/article/details/41876541 效果: 源代码: 解释: CLoad3DS.h为加载3DMax模型的头文件,C ...

  3. 【和我一起学python吧】python的一些推荐

    看到未名的几篇帖子 使我想起了和python的一些经历,于是写了一篇咚咚. 1 书籍: python的syntax足够简单,semantics也不复杂,不怎么会使人混乱,一般来说看自带的文档足够可以学 ...

  4. 自定义Camera综述(一般步骤、注意事项、遇到的难题<【内存溢出问题】>、像素参考)

    一般步骤: 1. 检查和访问Camera:创建代码来检查Camera和所申请访问的存在性: 2. 创建一个预览类:继承SurfaceView来创建一个Camera的预览类,并实现SurfaceHold ...

  5. 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇05:角色中弹》

    5.角色中弹 概述: 为了使游戏具有挑战性,大部分游戏设定中,游戏角色都有生命限制.即在游戏中,由于玩家的操控操控不当,导致游戏角色死亡游戏终止.打飞机游戏也不例外,当敌人击中角色的时候,角色宣判死亡 ...

  6. 内核参数优化/etc/sysctl.conf

    net.nf_conntrack_max = 65536000net.netfilter.nf_conntrack_tcp_timeout_established = 1200net.ipv4.tcp ...

  7. [cocos2d-x]File文件的IO读写处理

    转载:http://blog.csdn.net/chiuan/article/details/8618411 为了保存自定义数据文件,需要保存文件和读取文件,也就是File的IO处理: 针对cocos ...

  8. homework07

    我阅读的: http://www.cnblogs.com/zhuyp1015/category/370450.html http://blog.csdn.net/hzyong_c/article/de ...

  9. Java设计模式系列之动态代理模式(转载)

    代理设计模式 定义:为其他对象提供一种代理以控制对这个对象的访问. 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念. 代理模式示例代码 public interface Sub ...

  10. CodeForces 489D Unbearable Controversy of Being (搜索)

    Unbearable Controversy of Being 题目链接: http://acm.hust.edu.cn/vjudge/contest/121332#problem/B Descrip ...