珞珈山水BBS电脑网络程序人生 → 单文区文章阅读

单文区文章阅读 [返回]
发信人: Knuthocean (knuthocean@SKLSE), 信区: Programm
标  题: [合集] 编程问题求助
发信站: 珞珈山水BBS站 (Tue Sep 12 08:25:00 2006), 站内

☆─────────────────────────────────────☆
  
 awan (蓝蓝子衿) 于  (Wed Aug 30 13:45:52 2006)  提到:

  作了一个小软件,基本功能描述如下:打开这个小软件,在一个界面上出现一个图标,

你可以调节图标位置,使得图标移动到界面范围以内任何一点,然后确定下来,再关闭软

件。
  再打开软件的时候,这个图标出现在上一次调整好的位置。
  这个图标的位置可以用(x,y)来描述
  怎么定义这个x,y呢?让它在第n次运行结束的值,成为第n+1次运行时候初始化的值。


  说白了,就是如何保存每次(x,y)的设置。

  通常,我们在DSP,单片机里面编程的时候,用 static 来定义,只要不掉电,你定义的

值都会被在每次运算之后保留结果。
  但是,现在是在PC上面编程,怎么定义这个变量,以便保存设置呢?

  求高人指点一二。

  以上所说是C语言


☆─────────────────────────────────────☆
  
 ILoveSor (杀死巴尔的仆从!) 于  (Wed Aug 30 13:54:38 2006)  提到:

pc上面做一个文件保存位置不就好了
下次开始的时候读取这个文件
【 在 awan (蓝蓝子衿) 的大作中提到: 】
:   作了一个小软件,基本功能描述如下:打开这个小软件,在一个界面上出现一个图标,
: 你可以调节图标位置,使得图标移动到界面范围以内任何一点,然后确定下来,再关闭软
: 件。
: ...................



☆─────────────────────────────────────☆
  
 freefly (枫舞九天) 于  (Wed Aug 30 17:10:06 2006)  提到:

写到注册表中
【 在 awan (蓝蓝子衿) 的大作中提到: 】
:   作了一个小软件,基本功能描述如下:打开这个小软件,在一个界面上出现一个图..
: 你可以调节图标位置,使得图标移动到界面范围以内任何一点,然后确定下来,再关..
: 件。
: ...................





☆─────────────────────────────────────☆
  
 ILoveSor (杀死巴尔的仆从!) 于  (Wed Aug 30 17:11:12 2006)  提到:

至于么
【 在 freefly (枫舞九天) 的大作中提到: 】
: 写到注册表中




☆─────────────────────────────────────☆
  
 awan (蓝蓝子衿) 于  (Wed Aug 30 18:31:47 2006)  提到:


【 在 ILoveSor (杀死巴尔的仆从!) 的大作中提到: 】
: 至于么


就是C语言里面fopen()函数?
有没有更好的办法
因为程序做好后封装为一个exe文件,最好不要在硬盘再开辟空间


☆─────────────────────────────────────☆
  
 ILoveSor (杀死巴尔的仆从!) 于  (Wed Aug 30 19:09:23 2006)  提到:

那就写注册表吧

【 在 awan (蓝蓝子衿) 的大作中提到: 】
: 就是C语言里面fopen()函数?
: 有没有更好的办法
: 因为程序做好后封装为一个exe文件,最好不要在硬盘再开辟空间
: ...................



☆─────────────────────────────────────☆
  
 ILoveSor (杀死巴尔的仆从!) 于  (Thu Aug 31 12:03:42 2006)  提到:

ko
你的方法太麻烦了

【 在 Knuthocean (knuthocean@SKLSE) 的大作中提到: 】
: 好像不对,LZ可以想一下用操作系统的装载、执行程序的方法来动态变化数据。




☆─────────────────────────────────────☆
  
 ILoveSor (杀死巴尔的仆从!) 于  (Thu Aug 31 12:08:44 2006)  提到:

如果是windows系统就用注册表好了
现在不会还有人用dos吧
【 在 Knuthocean (knuthocean@SKLSE) 的大作中提到: 】
: 想到了的话也不麻烦的。。不过偶没想到。。。你们想一下哈!




☆─────────────────────────────────────☆
  
 Knuthocean (knuthocean@SKLSE) 于  (Thu Aug 31 12:23:17 2006)  提到:

想法有二:
1.在程序指令单元开始设立保存单元,C语言中嵌入汇编代码,根据X和Y值改变保存单元的值。运行与X和Y值相关的代码时先到保存单元取数据。
2.实现Java的序列化机制,不过还是隐式地用到了文件。

To ILoveSor:是很麻烦呀。。
【 在 awan (蓝蓝子衿) 的大作中提到: 】
:   作了一个小软件,基本功能描述如下:打开这个小软件,在一个界面上出现一个图标,
: 你可以调节图标位置,使得图标移动到界面范围以内任何一点,然后确定下来,再关闭软
: 件。
: ...................



☆─────────────────────────────────────☆
  
 mj (Sempr|偶尔|长四姐姐不要把iBook@BY养死了) 于  (Thu Aug 31 12:24:16 2006)  提到:

to ko

Orz大牛扣肉

【 在 Knuthocean (knuthocean@SKLSE) 的大作中提到: 】
: 想法有二:
: 1.在程序指令单元开始设立保存单元,C语言中嵌入汇编代码,根据X和Y值改变保存单元的值。运行与X和Y值相关的代码时先到保存单元取数据。
: 2.实现Java的序列化机制,不过还是隐式地用到了文件。
: ...................



☆─────────────────────────────────────☆
  
 ILoveSor (杀死巴尔的仆从!) 于  (Thu Aug 31 12:24:24 2006)  提到:

简单问题复杂化啊
不愧是cs的
呵呵
【 在 Knuthocean (knuthocean@SKLSE) 的大作中提到: 】
: 想法有二:
: 1.在程序指令单元开始设立保存单元,C语言中嵌入汇编代码,根据X和Y值改变保存单元的值。运行与X和Y值相关的代码时先到保存单元取数据。
: 2.实现Java的序列化机制,不过还是隐式地用到了文件。
: ...................



☆─────────────────────────────────────☆
  
 Knuthocean (knuthocean@SKLSE) 于  (Thu Aug 31 12:25:52 2006)  提到:

想法而已,真正还是用你的方法。
【 在 ILoveSor (杀死巴尔的仆从!) 的大作中提到: 】
: 简单问题复杂化啊
: 不愧是cs的
: 呵呵
: ...................



☆─────────────────────────────────────☆
  
 SubDragon (发现很多人挂在山水上泡mm) 于  (Thu Aug 31 18:49:02 2006)  提到:

用汇编干啥

【 在 Knuthocean (knuthocean@SKLSE) 的大作中提到: 】
: 想法有二:
: 1.在程序指令单元开始设立保存单元,C语言中嵌入汇编代码,根据X和Y值改变保存单元的值。运行与X和Y值相关的代码时先到保存单元取数据。
: 2.实现Java的序列化机制,不过还是隐式地用到了文件。
: ...................



☆─────────────────────────────────────☆
  
 wen (new) 于  (Thu Aug 31 20:27:59 2006)  提到:

专家来了 orz
【 在 SubDragon (发现很多人挂在山水上泡mm) 的大作中提到: 】
: 用汇编干啥





☆─────────────────────────────────────☆
  
 flymouse (flymouse||hello zxy~~) 于  (Thu Aug 31 22:31:44 2006)  提到:

传说中的TC算法排名TOP 10的?
【 在 wen (new) 的大作中提到: 】
: 专家来了 orz




☆─────────────────────────────────────☆
  
 Stravadivaly (老子就是机器人) 于  (Fri Sep  1 13:10:40 2006)  提到:


呵呵,好象Jeffry Richard 在<Windows 核心编程>中就是用注册表,写了个保存桌面图标位
置的程序.注册表,还是比较有用的.:)
【 在 ILoveSor (杀死巴尔的仆从!) 的大作中提到: 】
: 至于么





☆─────────────────────────────────────☆
  
 buttcher (阿呆) 于  (Fri Sep  1 21:37:55 2006)  提到:

这个保存单元如何实现呢?自己来写物理内存?那样windows好像不会答应

【 在 Knuthocean (knuthocean@SKLSE) 的大作中提到: 】
: 想法有二:
: 1.在程序指令单元开始设立保存单元,C语言中嵌入汇编代码,根据X和Y值改变保存单元的值。运行与X和Y值相关的代码时先到保存单元取数据。
: 2.实现Java的序列化机制,不过还是隐式地用到了文件。
: ...................



☆─────────────────────────────────────☆
  
 chusi (每天都有新的追求) 于  (Fri Sep  1 23:33:13 2006)  提到:

写在ram里有啥用?
【 在 buttcher (阿呆) 的大作中提到: 】
: 这个保存单元如何实现呢?自己来写物理内存?那样windows好像不会答应




☆─────────────────────────────────────☆
  
 Knuthocean (knuthocean@SKLSE) 于  (Sat Sep  2 08:18:51 2006)  提到:

__asm{
  jmp next;
  X
  Y
  next:getX
       getY
}
other operations...
我的意思是这样的,具体可不可以没试过。我暂时不会windows system programming
【 在 buttcher (阿呆) 的大作中提到: 】
: 这个保存单元如何实现呢?自己来写物理内存?那样windows好像不会答应




☆─────────────────────────────────────☆
  
 flymouse (flymouse||hello zxy~~) 于  (Sat Sep  2 12:48:11 2006)  提到:

niu
【 在 Knuthocean (knuthocean@SKLSE) 的大作中提到: 】
: __asm{
:   jmp next;
:   X
: ...................



☆─────────────────────────────────────☆
  
 buttcher (阿呆) 于  (Sat Sep  2 23:19:29 2006)  提到:

进程再退出时,进程空间的内存都被销毁了。
进程使用的是虚拟内存,如果你想要进程下次运行的时候这些信息还在
除非是写到非虚拟空间中去,那就是写物理内存了,这个一般是不允许的

【 在 Knuthocean (knuthocean@SKLSE) 的大作中提到: 】
: __asm{
:   jmp next;
:   X
: ...................



☆─────────────────────────────────────☆
  
 buttcher (阿呆) 于  (Sat Sep  2 23:20:05 2006)  提到:

他的目的就是像dsp里面一样,只要不掉电都可以使用,那么写到ram里面还是有用的

【 在 chusi (每天都有新的追求) 的大作中提到: 】
: 写在ram里有啥用?




☆─────────────────────────────────────☆
  
 Knuthocean (knuthocean@SKLSE) 于  (Sun Sep  3 08:37:18 2006)  提到:

有道理,不过有没有进程退出的时候用内存中保存的程序指令改变外存中保存的程序指令的
方法?
【 在 buttcher (阿呆) 的大作中提到: 】
: 进程再退出时,进程空间的内存都被销毁了。
: 进程使用的是虚拟内存,如果你想要进程下次运行的时候这些信息还在
: 除非是写到非虚拟空间中去,那就是写物理内存了,这个一般是不允许的
: ...................



☆─────────────────────────────────────☆
  
 dragonflywww (龙飞) 于  (Sun Sep  3 11:48:01 2006)  提到:

可以fork一个daemon进程保存信息
【 在 buttcher (阿呆) 的大作中提到: 】
: 进程再退出时,进程空间的内存都被销毁了。
: 进程使用的是虚拟内存,如果你想要进程下次运行的时候这些信息还在
: 除非是写到非虚拟空间中去,那就是写物理内存了,这个一般是不允许的
: ...................



☆─────────────────────────────────────☆
  
 Knuthocean (knuthocean@SKLSE) 于  (Sun Sep  3 12:17:50 2006)  提到:

觉得这个又和windows下的注册表保存信息本质相同啦。。
【 在 dragonflywww (龙飞) 的大作中提到: 】
: 可以fork一个daemon进程保存信息




☆─────────────────────────────────────☆
  
 flymouse (flymouse||hello zxy~~) 于  (Sun Sep  3 12:18:37 2006)  提到:

Orz一下,不懂
【 在 Knuthocean (knuthocean@SKLSE) 的大作中提到: 】
: 觉得这个又和windows下的注册表保存信息本质相同啦。。




☆─────────────────────────────────────☆
  
 dragonflywww (龙飞) 于  (Sun Sep  3 21:30:54 2006)  提到:

这个只能保存在内存中
不懂windows编程,注册表应该跟文件差不多吧? 
【 在 Knuthocean (knuthocean@SKLSE) 的大作中提到: 】
: 觉得这个又和windows下的注册表保存信息本质相同啦。。




☆─────────────────────────────────────☆
  
 chusi (每天都有新的追求) 于  (Sun Sep  3 21:59:09 2006)  提到:

也许可以
如果对exe或elf文件格式熟的话修改其中的数据段
不过我觉得这个问题实在没必要搞得这么复杂,写文件就ok了
【 在 Knuthocean (knuthocean@SKLSE) 的大作中提到: 】
: 有道理,不过有没有进程退出的时候用内存中保存的程序指令改变外存中保存的程序指令的
: 方法?




☆─────────────────────────────────────☆
  
 SubDragon (发现很多人挂在山水上泡mm) 于  (Sun Sep  3 23:38:23 2006)  提到:

增加系统调用
写到内核空间的固定地址
【 在 buttcher (阿呆) 的大作中提到: 】
: 进程再退出时,进程空间的内存都被销毁了。
: 进程使用的是虚拟内存,如果你想要进程下次运行的时候这些信息还在
: 除非是写到非虚拟空间中去,那就是写物理内存了,这个一般是不允许的
: ...................



☆─────────────────────────────────────☆
  
 SubDragon (发现很多人挂在山水上泡mm) 于  (Sun Sep  3 23:40:37 2006)  提到:

在单片机里用static和你windows下软件用static不都是一个效果...
【 在 awan (蓝蓝子衿) 的大作中提到: 】
:   作了一个小软件,基本功能描述如下:打开这个小软件,在一个界面上出现一个图标,
: 你可以调节图标位置,使得图标移动到界面范围以内任何一点,然后确定下来,再关闭软
: 件。
: ...................



☆─────────────────────────────────────☆
  
 buttcher (阿呆) 于  (Mon Sep  4 00:35:55 2006)  提到:

windows里面没有fork,也没有一个类似fork的系统调用,达不到fork得效果
cygwin模拟fork模拟的很麻烦

【 在 dragonflywww (龙飞) 的大作中提到: 】
: 可以fork一个daemon进程保存信息




☆─────────────────────────────────────☆
  
 buttcher (阿呆) 于  (Mon Sep  4 00:37:31 2006)  提到:

有些dsp的操作系统和windows差别很大的,比如vxworks里面没有进程的概念
起的是任务,各个任务间是可以互相访问内存空间的,就是整个系统就是一个
进程,所以static一直存在

【 在 SubDragon (发现很多人挂在山水上泡mm) 的大作中提到: 】
: 在单片机里用static和你windows下软件用static不都是一个效果...




☆─────────────────────────────────────☆
  
 buttcher (阿呆) 于  (Mon Sep  4 00:44:03 2006)  提到:

这个比较强,简单点可以插一个dll到explore进程,把信息保存到这个dll里面


【 在 chusi (每天都有新的追求) 的大作中提到: 】
: 也许可以
: 如果对exe或elf文件格式熟的话修改其中的数据段
: 不过我觉得这个问题实在没必要搞得这么复杂,写文件就ok了
: ...................



☆─────────────────────────────────────☆
  
 znf (Axman) 于  (Mon Sep  4 08:45:55 2006)  提到:

这个dll就是保存资源的dll吧?
PE格式(Portable Executable Format)文件中有一个节(Section),用于描述资源(Resource
)信息的,不知道能否利用这个节实现相关的解决办法?
盼牛牛指点:-)
【 在 buttcher (阿呆) 的大作中提到: 】
: 这个比较强,简单点可以插一个dll到explore进程,把信息保存到这个dll里面




☆─────────────────────────────────────☆
  
 SubDragon (发现很多人挂在山水上泡mm) 于  (Mon Sep  4 12:34:32 2006)  提到:

要找到数据段倒是不难
不过不知道怎么写自己...
有人有例子?
【 在 chusi (每天都有新的追求) 的大作中提到: 】
: 也许可以
: 如果对exe或elf文件格式熟的话修改其中的数据段
: 不过我觉得这个问题实在没必要搞得这么复杂,写文件就ok了
: ...................



☆─────────────────────────────────────☆
  
 SubDragon (发现很多人挂在山水上泡mm) 于  (Mon Sep  4 12:36:41 2006)  提到:

哦,了解了,屠夫师兄...
【 在 buttcher (阿呆) 的大作中提到: 】
: 有些dsp的操作系统和windows差别很大的,比如vxworks里面没有进程的概念
: 起的是任务,各个任务间是可以互相访问内存空间的,就是整个系统就是一个
: 进程,所以static一直存在
: ...................



☆─────────────────────────────────────☆
  
 purplefay (☆§神灵巫仙§☆) 于  (Mon Sep  4 12:56:02 2006)  提到:

看见buttcher出马了
强烈拜一个
【 在 buttcher (阿呆) 的大作中提到: 】
: 这个比较强,简单点可以插一个dll到explore进程,把信息保存到这个dll里面




☆─────────────────────────────────────☆
  
 fgynew (fgynew) 于  (Mon Sep  4 15:32:42 2006)  提到:


【 在 awan (蓝蓝子衿) 的大作中提到: 】
:   作了一个小软件,基本功能描述如下:打开这个小软件,在一个界面上出现一个图..
: 你可以调节图标位置,使得图标移动到界面范围以内任何一点,然后确定下来,再关..
: 件。
: ...................

是用c++的标准类写个文件。关闭时写,打开时读。这么简单的问题。还用问?



☆─────────────────────────────────────☆
  
 Stravadivaly (老子就是机器人) 于  (Mon Sep  4 20:18:47 2006)  提到:


先不说在用户状态下直接内核模式读写会拒绝访问,

增加系统调用的话这个手术太大了,要备份KeServiceDescriptorTable

以及KeServiceDescriptorTableShadow两个服务描述表。

而且这个是需要用驱动实现的。
【 在 SubDragon (发现很多人挂在山水上泡mm) 的大作中提到: 】
: 增加系统调用
: 写到内核空间的固定地址





☆─────────────────────────────────────☆
  
 Stravadivaly (老子就是机器人) 于  (Mon Sep  4 20:30:45 2006)  提到:


【 在 buttcher (阿呆) 的大作中提到: 】
: 这个保存单元如何实现呢?自己来写物理内存?那样windows好像不会答应

在Windows XP/2K 下似乎可以用 OpenSection 的办法直接写到物理地址

当然,要把虚拟地址通过页表和页目录转换一下。

但问题是,这个地址还是要保存到一个地方,不然程序下次怎么知道这个地址?

修改PE结构似乎可行,好多病毒不都是修改PE文件的么?可以考虑增加一个节,

在这个节中存放坐标信息。


☆─────────────────────────────────────☆
  
 chusi (每天都有新的追求) 于  (Mon Sep  4 21:19:55 2006)  提到:

google到一个,不知道可不可以用
转载自
https://www.xfocus.net/bbs/index.php?act=SE&f=2&t=35339&p=125907

2000下可执行文件修改自身

                pjf(jfpan20000@sina.com)

    总有人问起这个老问题,其实在2年前在bbs上贴过的有关windows
内核句柄的帖子就详细写了改写正运行程序的方法,原理一样。为了减
少邮箱信件,所以再整理一下放到一个google一下就可发现的地方:)
    另创一个程序改自己当然不是这里说的。NT系统中程序修改自身,
只需做下面几步:
    1、先只读打开程序(自然也可以是其他程序)自身,获取一句柄。
    2、从EPROCESS开始,访问句柄表的数据结构,找出该句柄掩码。
    3、修改掩码,此刻已可通过该句柄对正在运行的可执行文件进行
修改了。
    4、做需要的文件操作。

    关于句柄表的简单描述,请搜寻以前的贴过的有关的帖子,不再赘诉。
下面是一简单的示例程序:

#include<windows.h>
#include<stdio.h>
#include"rwpm.h"

void ModifyProt2000(HANDLE h)
{
    USHORT pointer1, pointer2, pointer3;
    ULONG addr;
    ULONG index = (ULONG)h;
    addr = GetData((PVOID)0xffdff124);
    addr = GetData((PVOID)(addr+0x22c));
    addr = GetData((PVOID)(addr+0x128));
    pointer3 = (USHORT)(index&0x000003FF);
    pointer2 = (USHORT)((index&0x0003FC00)>>10);
    pointer1 = (USHORT)((index&0x03FC0000)>>18);
    addr = GetData((PVOID)(addr+8));
    addr = GetData((PVOID)(addr+pointer1*4));
    addr = GetData((PVOID)(addr+pointer2*4));
        //以上是步骤2,下面是步骤3
    SetData((PVOID)(addr+(pointer3/2+1)*4), 0xffffffff);
}

int main()
{
    HANDLE h;
    char buf[MAX_PATH];
    DWORD ret;
    GetModuleFileName( NULL, buf, MAX_PATH );
    h = CreateFile( buf, 0, FILE_SHARE_READ, 0, OPEN_EXISTING, \
                                 FILE_ATTRIBUTE_NORMAL, 0 );
    if ( h == INVALID_HANDLE_VALUE ) 
        return 0;

    if ( !InitLib() )
    {
        printf( "init failed\n" );
        return 0;
    }

    ModifyProt2000( h );

    WriteFile( h, "AAAAAA", 6, &ret, 0 );
    CloseHandle( h );
    ExitLib();
    return 0;
}

在windows2000下执行后可以看到文件开始变为“AAAAAA”。
其中用到的InitLib/GetData等函数在那个进程隐藏代码中已给出,不重复贴了。

    至于在XP等系统上的代码,这里就不给出了,要修改的部分是句柄掩码的
定位(句柄表结构有变化)、InitLib中页目录的定位。有了思路自己hack是比
较简单的。

    好短,确实简单了点。 
【 在 SubDragon (发现很多人挂在山水上泡mm) 的大作中提到: 】
: 要找到数据段倒是不难
: 不过不知道怎么写自己...
: 有人有例子?
: ...................



[返回单文区目录]

武汉大学BBS 珞珈山水站 All rights reserved.
wForum , 页面执行时间:43.489毫秒