ptrace x64 转
#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, ®);
getdata(child, (void*)reg.rip, lrmt, back);
setdata(child, (void*)reg.rip, lrmt, rmt);
ptrace(PTRACE_SETREGS, child, NULL, ®);
ptrace(PTRACE_CONT, child, NULL, NULL);
wait(NULL);
//restore
setdata(child, (void*)reg.rip, lrmt, back);
ptrace(PTRACE_SETREGS, child, NULL, ®);
//
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 转的更多相关文章
- Playing with ptrace, Part II
Playing with ptrace, Part II Issue From Issue # December Dec , By Pradeep Padala inSysAdmin In Part ...
- 玩转ptrace(转)
下面是转帖的内容,写的很详细.但是不同的linux发行版中头文件的路径和名称并不相同.如在某些发行版中<linux/user.h>就不存在,其中定义的变量出现在<asm/ptrace ...
- Linux Ptrace 详解
转 https://blog.csdn.net/u012417380/article/details/60470075 Linux Ptrace 详解 2017年03月05日 18:59:58 阅读数 ...
- X86和X86_64和X64有什么区别?
x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为&qu ...
- VisualStudio 2015 开启IIS Express可以调试X64项目
现在项目开发时总有时需要在X64下开发,这样我们就需要IIS Express中调试.不要总是放在IIS中,在Attach这样好慢. 如果不设置直接调试X64的程序,我们有可能会受到以下类似的错误 ...
- Win7(x64)升级到Win10
北京时间7月29日零点起,微软正式开始向包含中国在内的全球用户推送Windows 10正式版安装包,Win7.Win8正版用户从29日零点起就可以免费升级到Win 10. 如果你的C盘里边有“$Win ...
- 数据库管理工具GUI - PremiumSoft Navicat Premium Enterprise 11.2.15 x86/x64 KEY
转载自: 数据库管理工具GUI - PremiumSoft Navicat Premium Enterprise 11.2.15 x86/x64 KEY Navicat Premium(数据库管理工具 ...
- 在Ubuntu X64上编译Hadoop
在之前的文章中介绍了如何直接在Ubuntu中安装Hadoop.但是对于64位的Ubuntu来说,官方给出的Hadoop包是32位的,运行时会得到警告: WARN util.NativeCodeLoad ...
- win7(x64)下安装cocos2d并编译安卓项目
好吧,不为啥,就是如题. win7 x64 脑袋内存比较小,说不定明儿就忘了,今天记录一下. 没有什么经验,所有步骤基本都是百度出来的,这里边操作边记录,为了保护原创作者,这里我都附上我查找的链接. ...
随机推荐
- STM32F407 外扩SRAM
字节控制功能.支持高/低字节控制. 看看实现 IS62WV51216 的访问,需要对 FSMC进行哪些配置. 这里就做一个概括性的讲解.步骤如下: 1)使能 FSMC 时钟,并配置 FSMC 相关的 ...
- CMDB反思1
由于,基本已经完成一期的功能开发,所以要继续CMDB的开发工作了. 最近看了不少CMDB相关的文章,也思考了不少,后面将所思所想(比较浅)记录一下. 发现很多内容都记录在Wiz上,抽空整理到博客中. ...
- Text Kit进阶
在上一篇文章Text Kit入门中我们主要了解了什么是Text Kit及它的一些架构和基本特性,这篇文章中会涉及关于Text Kit的更多具体应用. Text Kit是建立在Core Text框架上的 ...
- 【原】Storm分布式RPC
5. Storm高级篇 序列化 分布式RPC High level overview LinearDRPCTopologyBuilder Local mode DRPC Remote mode DRP ...
- Hadoop-Map/Reduce实现实现倒排索引
先来简单介绍一下什么是文档倒排索引 倒排索引是文档检索系统中最常见的数据结构,被广泛应用在全文搜索引擎上.主要用来存储某个单词(或词组)在一个文档或者一组文档中的存储位置的映射,即提供了一种根据内容来 ...
- 通用表表达式(Common Table Expression)
问题:编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句. 方案1:编写在From子句内使用派生表(内联视图)的T-SQL查询语句. 方案2:使用视图 方案3:使 ...
- fedora20安装spin以及用户界面ispin
(博客园-番茄酱原创) (最近感觉用make会出现库错误,所以改进了教程,把之前的make步骤省掉了,直接下载可执行文件进行配置最简单啦...) 1.首先,下载对应版本的spin,我64位的fedor ...
- VS2012编译可在WinXP兼容程序
VS2012需要安装Update 1补丁 在Project的属性 选择 配置属性 - 常规 - 平台工具集 - Visual Studio 2012 - Windows XP (v110_xp) 在P ...
- Android实例-读取设备联系人(XE8+小米2)
相关资料: http://www.colabug.com/thread-1071065-1-1.html 结果: 1.将权限打开Read contacts设置为True,不然报图一的错误. 2.搜索空 ...
- osx升级到10.10后,用pod install报错最终解决办法
转载自:http://blog.csdn.net/liuyujinglove/article/details/40582197 http://blog.csdn.net/dqjyong/article ...