wince6.0 下如何编写能使直接访问硬件的软件?

时间:2022-03-04 17:36:39
wince6.0 下如何编写能使直接访问硬件的软件?
以前在wince5.0 下使用MmMapIoSpace就可以很容易做到了。

但是wince6.0 下的应用程序和驱动已经不在同一个空间了。

如何做到?

有时候写一个应用程序去直接操纵硬件对调试驱动非常有帮助,

在wince6.0 下有些人也写了这类型软件,比如sunrain_hjb的wince6.0寄存器读写软件,但是没有源码,不知道如何做到的。
我想调试一些复杂的驱动的时候,写一个比较完整的,或者专门针对这个驱动的。

有人说使用可以用setkmode去让ap临时进入kernel模式,然后在对内存进行操作,对这个不是很理解。
请达人出来指点一下。

90 个解决方案

#1


IOCTRL---MmMapIoSpace

#2


哇, 300 分

快回

写只 driver, 在 XXX_IoControl 加入一些 Code, 用 ActivateDeviecEx 将其载入 Kernel space.

Application 可以透过 DeviceIoControl 与该 driver 沟通, 由该 driver 去呼叫 MmMapIoSpace 并读值後传回即可.

Paul, Chao @ Techware

#3


引用 2 楼 paul_chao 的回复:
哇, 300 分 

快回 

写只 driver, 在 XXX_IoControl 加入一些 Code, 用 ActivateDeviecEx 将其载入 Kernel space. 

Application 可以透过 DeviceIoControl 与该 driver 沟通, 由该 driver 去呼叫 MmMapIoSpace 并读值後传回即可. 

Paul, Chao @ Techware 


哈哈,Paul, Chao 老兄,看来这300分你拿不到了。

因为我要求应用程序直接访问硬件,不能使用驱动的。

如果使用驱动,俺们早就做了。

#4


快;来啊。千万不要让我无满意结贴啊。

#5


我觉得你们都搞错了。
别人做出来了!只是没有源码!
看这个链接,你看看神人的牛技术吧。
http://www.cnblogs.com/we-hjb/archive/2009/03/08/1406257.html各位请看这个牛人写的。我正用着,不知道他怎么搞出来的。 

#6


unsigned int *gpio_base;

PHYSICAL_ADDRESS PortAddress = {0x56000060, 0};
gpio_base =(unsigned int *)MmMapIoSpace( PortAddress, 0x04,FALSE ); // 获得内存
*gpio_base = 0x0585ff87; // 直接访问硬件
MmUnmapIoSpace(gpio_base,0x04);//释放内存

#7


引用 6 楼 xajhuang 的回复:
unsigned int *gpio_base; 

PHYSICAL_ADDRESS PortAddress = {0x56000060, 0}; 
gpio_base =(unsigned int *)MmMapIoSpace( PortAddress, 0x04,FALSE ); // 获得内存 
*gpio_base = 0x0585ff87; // 直接访问硬件 
MmUnmapIoSpace(gpio_base,0x04);//释放内存 


这个在wince5.0下可行,到了wince6.0 就不行了。哈哈

#8


引用 6 楼 xajhuang 的回复:
unsigned int *gpio_base; 

PHYSICAL_ADDRESS PortAddress = {0x56000060, 0}; 
gpio_base =(unsigned int *)MmMapIoSpace( PortAddress, 0x04,FALSE ); // 获得内存 
*gpio_base = 0x0585ff87; // 直接访问硬件 
MmUnmapIoSpace(gpio_base,0x04);//释放内存 


会提示分配内存失败在wince6.0 下,wince5.0 就正常的。

#9


看来得动点手脚了。

#10


要看你是写应用、写用户态驱动还是内核态驱动。应用和用户态驱动一样,都无法如ce5的方式访问。
下面是我写过的一段内容,参考一下吧:

有些函数在用户态是必须注意使用的,如VirtualCopy和类似的MmMapIoSpace。用户态程序不允许使用VirtualCopy,但是用户态能通过转接服务来实现这功能。转接服务能代替用户态驱动来调用VirtualCopy,但是前提是转接服务要知道这些地址是可以访问的。在驱动的注册表入口,键值IOBase和IOLen来指出地址的位置和大小。当驱动使用VirtualCopy来,转接服务会检查这些键值,确保驱动能正常访问这些物理地址。下面是串口驱动的例子:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial]
    "IoBase"=dword:02F8
    "IoLen"=dword:8 
如果只有一块地址需要访问,使用dword类型。如果是多块地址,那么使用multi_sz类型。
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial]
    "IoBase"=multi_sz:"2f8","3f6"
    "IoLen"=multi_sz:"8","2"
由于这些地址只能被有特权的应用程序访问,那么需要确保这些地址不能被非特权程序访问。

用户态驱动不能调用以下函数:
1、 VM虚拟内存函数:VirtualCopy[Ex], LockPages[Ex], CreateStaticMapping
2、 中断函数:InterruptInitialize, InterruptDone, LoadIntChainHandler
3、 不能直接使用IISR,需要通过转接服务来做GIISR。
4、 OAL层的IOCTL不能直接使用。

禁止从用户态驱动回调任何进程。你不能在总线驱动中回调一个内核态的client驱动。如果一个总线驱动放到用户态运行,只能把总线上的client驱动也放到用户态中。那么这个总线上所有的client驱动,都必须和总线驱动放到同一个udevice进程中。

有些OEM厂商可能会把一些OAL IOCTL和函数,通过编写特有的转接服务,让内核态驱动提供给用户态使用。值得注意的是,通过内核态驱动来公开这些功能,实际上是公开了微软特意封装的内容,最好不要这样使用。

#11


引用 5 楼 gooogleman 的回复:
我觉得你们都搞错了。 
别人做出来了!只是没有源码! 
看这个链接,你看看神人的牛技术吧。 
http://www.cnblogs.com/we-hjb/archive/2009/03/08/1406257.html各位请看这个牛人写的。我正用着,不知道他怎么搞出来的。 


晕,sunrain_hjb是如何做到的呢?我使用IDA反汇编也没有看到有什么特别的。

楼上几位都没有认真看这个sunrain_hjb做的工具,只是照着教条或者固有经验说。但是却确实sunrain_hjb牛人就做出来这个东西放在网上了,并且我在wince6.0上用的很正常

#12


setkmodeThis function switches between kernel and user modes.

This function is no longer supported as of CE 6.0.

#13


都不是楼上说的。

sunrain_hjb牛人使用了非同凡响的方法。刚才在朋友的论坛里面讨论,破解一番,发现了

看过注册表了,的确是加载了一个驱动,CE6就这么容易的破了。汗!
Active下面多了一个驱动:
Name: "MEM1"
Key:"Drivers\MEMDrv"

在MEMDrv下面:
Dll:"MEMRaw.dll"
Prefix:"MEM"
Index:"00000001" ...
Walle 发表于 2009-6-17 17:34 
这样看来应该使用应用再重新加载了一个驱动到内核,然后应用和这个驱动通信即可!
汗,sunrain_hjb真太厉害了,佩服!

我等还在怀疑的时候,你老人家已经在玩的很爽了。

#14


引用 3 楼 gooogleman 的回复:
引用 2 楼 paul_chao 的回复:
哇, 300 分

快回

写只 driver, 在 XXX_IoControl 加入一些 Code, 用 ActivateDeviecEx 将其载入 Kernel space.

Application 可以透过 DeviceIoControl 与该 driver 沟通, 由该 driver 去呼叫 MmMapIoSpace 并读值後传回即可.

Paul, Chao @ Techware


哈哈,Paul, Chao 老兄,看来这300分你拿不到了。

因为我要求应用程序直接访问硬件,不能使用驱动的。

如果使用驱动,俺们早就做了。


这不早说了吗? 我也是想了好久, 一直找不出更好的方法. 还是各位先进另有捷径, 大家一起来讨论看看

只是他一个 MemMgr.exe, 不知是如何把 MEMRaw.dll 给搞进系统的, 下载来玩玩看

Paul, Chao @ Techware

#15


还真的是执行後, \Windows 多了一个 MEMRaw.dll, 要怎麽把 .dll 档包进 .exe 档呢?? 直接将 raw data (like as bmp2c) 存入 .exe 的 static variable 中, 再用 WriteFile 写入 \Windows 中吗?? 相当有趣的方法.

之前这个工具我的作法是写成 .cpl 的格式, 另外再写一个 .dll 的档案, 下次有空再改版时也用这方法来包进去成一个档案.

Paul, Chao @ Techware

#16


呵呵,来晚了,确实如上面分析的,
是应用加载了一个驱动,通过驱动访问物理内存的。:P
做在一起,主要是考虑使用方便,不过,只支持ARM平台了,
在CE6.0的模拟器中测试没有问题。

#17


引用 2 楼 paul_chao 的回复:
哇, 300 分 

快回 

写只 driver, 在 XXX_IoControl 加入一些 Code, 用 ActivateDeviecEx 将其载入 Kernel space. 

Application 可以透过 DeviceIoControl 与该 driver 沟通, 由该 driver 去呼叫 MmMapIoSpace 并读值後传回即可. 

Paul, Chao @ Techware 


事实就是这样的,楼主可以给paul_chao分了。^_^

#18


原来还留了一手!

#19


引用 2 楼 paul_chao 的回复:
哇, 300 分 

快回 

写只 driver, 在 XXX_IoControl 加入一些 Code, 用 ActivateDeviecEx 将其载入 Kernel space. 

Application 可以透过 DeviceIoControl 与该 driver 沟通, 由该 driver 去呼叫 MmMapIoSpace 并读值後传回即可. 

Paul, Chao @ Techware 


给分,给分。!哈哈。

#20


mark~
学习下

#21


引用 15 楼 paul_chao 的回复:
还真的是执行後, \Windows 多了一个 MEMRaw.dll, 要怎麽把 .dll 档包进 .exe 档呢?? 直接将 raw data (like as bmp2c) 存入 .exe 的 static variable 中, 再用 WriteFile 写入 \Windows 中吗?? 相当有趣的方法. 

之前这个工具我的作法是写成 .cpl 的格式, 另外再写一个 .dll 的档案, 下次有空再改版时也用这方法来包进去成一个档案. 

Paul, Chao @ Techware 

估计还真是用writefile的方法啊hehe,有空按照达人的思路试试

#22


引用 15 楼 paul_chao 的回复:
还真的是执行後, \Windows 多了一个 MEMRaw.dll, 要怎麽把 .dll 档包进 .exe 档呢?? 直接将 raw data (like as bmp2c) 存入 .exe 的 static variable 中, 再用 WriteFile 写入 \Windows 中吗?? 相当有趣的方法. 

之前这个工具我的作法是写成 .cpl 的格式, 另外再写一个 .dll 的档案, 下次有空再改版时也用这方法来包进去成一个档案. 

Paul, Chao @ Techware 

估计还真是用writefile的方法啊hehe,有空按照达人的思路试试

#23


sunrain_hjb 老兄, 不知道您老也在这, 那真是鲁班门前弄大斧, 关公面前耍大刀, 失敬, 失敬

gooogleman, 这分数应给原作者吧, 以表彰其贡献, 我们在後面, 只是锦上添花而已.

Paul, Chao @ Techware

#24


友情up

#25


mark

#26


应用程序通过createfile打开驱动,然后通过deviceiocontrol发指令给驱动,让驱动完成任务后将所需的参数再回传给应用。这种方式,CE5和CE6应该都是通用的吧!!这也是应用直接操作驱动从而操作硬件啊!

#27


该回复于2009-06-22 11:36:38被版主删除

#28


友情up

#29


引用 23 楼 paul_chao 的回复:
sunrain_hjb 老兄, 不知道您老也在这, 那真是鲁班门前弄大斧, 关公面前耍大刀, 失敬, 失敬 

gooogleman, 这分数应给原作者吧, 以表彰其贡献, 我们在後面, 只是锦上添花而已. 

Paul, Chao @ Techware 


都有分,都有。

感觉你们实在是太厉害了。我等后辈学习ing

#30


果然都是牛人啊,我最怕弄wince操作硬件的东西,相关的资料太少了,学习ing,以后还请各位前辈多多指教啊

#31


都是牛人,什么时候能达到你们的水平啊

#32


掏出IDA,逆了不就完了嘛,非那事干嘛!

#33


UPX 3.03压缩的,解压之后用IDA打开,辅助Resource Hacker。一目了然。
googleman,我恐怕你要失望了。这个软件仍然是用驱动的,这个软件把驱动作为资源打包到PE里面去了。
首先,注意以下特征:

.data:00028490 aMemdrv         unicode 0, <MEMDRV>,0   ; DATA XREF: .text:off_11A2Co
.data:0002849E                 ALIGN 0x10
.data:000284A0 aOpenDrvfileErr DCW 0xD                 ; DATA XREF: .text:off_11A30o
.data:000284A0                 DCW 0xA
.data:000284A0                 unicode 0, <Open drvfile Error %d>,0
.data:000284D0 aWindowsMemraw_ unicode 0, <\windows\memraw.dll>,0
.data:000284D0                                         ; DATA XREF: .text:off_11A34o
.data:000284F8 aMem1           unicode 0, <MEM1:>,0    ; DATA XREF: .text:off_11E28o
.data:00028504 aOrder          unicode 0, <Order>,0    ; DATA XREF: .text:off_11E2Co
.data:00028510 aDll            unicode 0, <Dll>,0      ; DATA XREF: .text:off_11E30o
.data:00028518 aMemraw_dll     unicode 0, <MEMRaw.dll>,0 ; DATA XREF: .text:off_11E34o
.data:0002852E                 ALIGN 0x10
.data:00028530 aPrefix         unicode 0, <Prefix>,0   ; DATA XREF: .text:off_11E38o
.data:0002853E                 ALIGN 0x10
.data:00028540 aMem            unicode 0, <MEM>,0      ; DATA XREF: .text:off_11E3Co
.data:00028548 aIndex          unicode 0, <Index>,0    ; DATA XREF: .text:off_11E40o
.data:00028554 aDriversMemdrv  unicode 0,  <Drivers\MEMDrv>,0 ; DATA XREF: .text:off_11E48o
.data:00028572                 ALIGN 8

其次,用Resource Hacker打开,证实了我的猜测。有个命名为memdrv的资源,首字节是'MZ',这不用多说了吧。

#34


你看不到驱动,不代表它不存在。这种把驱动打包到PE里面在桌面上是老掉牙的技术了,很早以前Sysinternals的工具就一直这么干的。FindResource,extract到disk上,然后createfile,看起来就显得很干净,就一个EXE文件发布就可以了。

#35


wince6.0 下如何编写能使直接访问硬件的软件?请问CE6 下怎么实现OpenThread 这个函数??
CE5 中有牛人把thread伪装成Process 然后用OpenProcess来实现。。。

#36


一不做二不休,再看看提取出来的memdrv.dll都导出了什么:
MEM_Close
MEM_Deinit
MEM_IOControl
MEM_Init
MEM_Open
MEM_PowerDown
MEM_PowerUp
MEM_Read
MEM_Seek
MEM_Write

接着再看看它导入了什么:
MmMapIoSpace
MmUnmapIoSpace
LocalFree

#37


我说怎么可能应用层直接访问物理地址呢。还是有驱动的。

#38


高手真TM多,观摩学习一下。

#39


引用 36 楼 codewarrior 的回复:
一不做二不休,再看看提取出来的memdrv.dll都导出了什么: 
MEM_Close 
MEM_Deinit 
MEM_IOControl 
MEM_Init 
MEM_Open 
MEM_PowerDown 
MEM_PowerUp 
MEM_Read 
MEM_Seek 
MEM_Write 

接着再看看它导入了什么: 
MmMapIoSpace 
MmUnmapIoSpace 
LocalFree


codewarrior 前辈,赞一个。

我使用IDA怎么分离不出来呢。估计我没有解压。

学习了。

#40


友情up

#41


引用 23 楼 paul_chao 的回复:
sunrain_hjb 老兄, 不知道您老也在这, 那真是鲁班门前弄大斧, 关公面前耍大刀, 失敬, 失敬 

gooogleman, 这分数应给原作者吧, 以表彰其贡献, 我们在後面, 只是锦上添花而已. 

Paul, Chao @ Techware 


Paul老兄,有些夸张了哦,^_^
楼主的问题是你解决的,分数应该给你,我只是把问题引出来了。

刚刚看了一下,基本上所有的问题都被解决了,楼主可以揭帖啦。

#42


好,结贴。

#43


引用 39 楼 gooogleman 的回复:
引用 36 楼 codewarrior 的回复:
一不做二不休,再看看提取出来的memdrv.dll都导出了什么: 
MEM_Close 
MEM_Deinit 
MEM_IOControl 
MEM_Init 
MEM_Open 
MEM_PowerDown 
MEM_PowerUp 
MEM_Read 
MEM_Seek 
MEM_Write 

接着再看看它导入了什么: 
MmMapIoSpace 
MmUnmapIoSpace 
LocalFree 



codewarrior 前辈,赞一个。 

我使用IDA怎么分离不出来呢。估计我没有解压。 

学习了。

IDA直接装入会告诉你很多区段无法反汇编,这时候就要考虑是否加壳了,用pe检测工具检查看看有没有加壳,找到upx的特征字符,直接用upx -d解了就成了。

#44


高手真是牛

#45


  lalal

#46


Mark!

#47


我什么也不懂啊 什么kenel模式?
真的要学习的好多啊。

#48


不会啊哈,,顶下

#49


好强大啊,学习学习!

#50


好好好

#1


IOCTRL---MmMapIoSpace

#2


哇, 300 分

快回

写只 driver, 在 XXX_IoControl 加入一些 Code, 用 ActivateDeviecEx 将其载入 Kernel space.

Application 可以透过 DeviceIoControl 与该 driver 沟通, 由该 driver 去呼叫 MmMapIoSpace 并读值後传回即可.

Paul, Chao @ Techware

#3


引用 2 楼 paul_chao 的回复:
哇, 300 分 

快回 

写只 driver, 在 XXX_IoControl 加入一些 Code, 用 ActivateDeviecEx 将其载入 Kernel space. 

Application 可以透过 DeviceIoControl 与该 driver 沟通, 由该 driver 去呼叫 MmMapIoSpace 并读值後传回即可. 

Paul, Chao @ Techware 


哈哈,Paul, Chao 老兄,看来这300分你拿不到了。

因为我要求应用程序直接访问硬件,不能使用驱动的。

如果使用驱动,俺们早就做了。

#4


快;来啊。千万不要让我无满意结贴啊。

#5


我觉得你们都搞错了。
别人做出来了!只是没有源码!
看这个链接,你看看神人的牛技术吧。
http://www.cnblogs.com/we-hjb/archive/2009/03/08/1406257.html各位请看这个牛人写的。我正用着,不知道他怎么搞出来的。 

#6


unsigned int *gpio_base;

PHYSICAL_ADDRESS PortAddress = {0x56000060, 0};
gpio_base =(unsigned int *)MmMapIoSpace( PortAddress, 0x04,FALSE ); // 获得内存
*gpio_base = 0x0585ff87; // 直接访问硬件
MmUnmapIoSpace(gpio_base,0x04);//释放内存

#7


引用 6 楼 xajhuang 的回复:
unsigned int *gpio_base; 

PHYSICAL_ADDRESS PortAddress = {0x56000060, 0}; 
gpio_base =(unsigned int *)MmMapIoSpace( PortAddress, 0x04,FALSE ); // 获得内存 
*gpio_base = 0x0585ff87; // 直接访问硬件 
MmUnmapIoSpace(gpio_base,0x04);//释放内存 


这个在wince5.0下可行,到了wince6.0 就不行了。哈哈

#8


引用 6 楼 xajhuang 的回复:
unsigned int *gpio_base; 

PHYSICAL_ADDRESS PortAddress = {0x56000060, 0}; 
gpio_base =(unsigned int *)MmMapIoSpace( PortAddress, 0x04,FALSE ); // 获得内存 
*gpio_base = 0x0585ff87; // 直接访问硬件 
MmUnmapIoSpace(gpio_base,0x04);//释放内存 


会提示分配内存失败在wince6.0 下,wince5.0 就正常的。

#9


看来得动点手脚了。

#10


要看你是写应用、写用户态驱动还是内核态驱动。应用和用户态驱动一样,都无法如ce5的方式访问。
下面是我写过的一段内容,参考一下吧:

有些函数在用户态是必须注意使用的,如VirtualCopy和类似的MmMapIoSpace。用户态程序不允许使用VirtualCopy,但是用户态能通过转接服务来实现这功能。转接服务能代替用户态驱动来调用VirtualCopy,但是前提是转接服务要知道这些地址是可以访问的。在驱动的注册表入口,键值IOBase和IOLen来指出地址的位置和大小。当驱动使用VirtualCopy来,转接服务会检查这些键值,确保驱动能正常访问这些物理地址。下面是串口驱动的例子:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial]
    "IoBase"=dword:02F8
    "IoLen"=dword:8 
如果只有一块地址需要访问,使用dword类型。如果是多块地址,那么使用multi_sz类型。
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial]
    "IoBase"=multi_sz:"2f8","3f6"
    "IoLen"=multi_sz:"8","2"
由于这些地址只能被有特权的应用程序访问,那么需要确保这些地址不能被非特权程序访问。

用户态驱动不能调用以下函数:
1、 VM虚拟内存函数:VirtualCopy[Ex], LockPages[Ex], CreateStaticMapping
2、 中断函数:InterruptInitialize, InterruptDone, LoadIntChainHandler
3、 不能直接使用IISR,需要通过转接服务来做GIISR。
4、 OAL层的IOCTL不能直接使用。

禁止从用户态驱动回调任何进程。你不能在总线驱动中回调一个内核态的client驱动。如果一个总线驱动放到用户态运行,只能把总线上的client驱动也放到用户态中。那么这个总线上所有的client驱动,都必须和总线驱动放到同一个udevice进程中。

有些OEM厂商可能会把一些OAL IOCTL和函数,通过编写特有的转接服务,让内核态驱动提供给用户态使用。值得注意的是,通过内核态驱动来公开这些功能,实际上是公开了微软特意封装的内容,最好不要这样使用。

#11


引用 5 楼 gooogleman 的回复:
我觉得你们都搞错了。 
别人做出来了!只是没有源码! 
看这个链接,你看看神人的牛技术吧。 
http://www.cnblogs.com/we-hjb/archive/2009/03/08/1406257.html各位请看这个牛人写的。我正用着,不知道他怎么搞出来的。 


晕,sunrain_hjb是如何做到的呢?我使用IDA反汇编也没有看到有什么特别的。

楼上几位都没有认真看这个sunrain_hjb做的工具,只是照着教条或者固有经验说。但是却确实sunrain_hjb牛人就做出来这个东西放在网上了,并且我在wince6.0上用的很正常

#12


setkmodeThis function switches between kernel and user modes.

This function is no longer supported as of CE 6.0.

#13


都不是楼上说的。

sunrain_hjb牛人使用了非同凡响的方法。刚才在朋友的论坛里面讨论,破解一番,发现了

看过注册表了,的确是加载了一个驱动,CE6就这么容易的破了。汗!
Active下面多了一个驱动:
Name: "MEM1"
Key:"Drivers\MEMDrv"

在MEMDrv下面:
Dll:"MEMRaw.dll"
Prefix:"MEM"
Index:"00000001" ...
Walle 发表于 2009-6-17 17:34 
这样看来应该使用应用再重新加载了一个驱动到内核,然后应用和这个驱动通信即可!
汗,sunrain_hjb真太厉害了,佩服!

我等还在怀疑的时候,你老人家已经在玩的很爽了。

#14


引用 3 楼 gooogleman 的回复:
引用 2 楼 paul_chao 的回复:
哇, 300 分

快回

写只 driver, 在 XXX_IoControl 加入一些 Code, 用 ActivateDeviecEx 将其载入 Kernel space.

Application 可以透过 DeviceIoControl 与该 driver 沟通, 由该 driver 去呼叫 MmMapIoSpace 并读值後传回即可.

Paul, Chao @ Techware


哈哈,Paul, Chao 老兄,看来这300分你拿不到了。

因为我要求应用程序直接访问硬件,不能使用驱动的。

如果使用驱动,俺们早就做了。


这不早说了吗? 我也是想了好久, 一直找不出更好的方法. 还是各位先进另有捷径, 大家一起来讨论看看

只是他一个 MemMgr.exe, 不知是如何把 MEMRaw.dll 给搞进系统的, 下载来玩玩看

Paul, Chao @ Techware

#15


还真的是执行後, \Windows 多了一个 MEMRaw.dll, 要怎麽把 .dll 档包进 .exe 档呢?? 直接将 raw data (like as bmp2c) 存入 .exe 的 static variable 中, 再用 WriteFile 写入 \Windows 中吗?? 相当有趣的方法.

之前这个工具我的作法是写成 .cpl 的格式, 另外再写一个 .dll 的档案, 下次有空再改版时也用这方法来包进去成一个档案.

Paul, Chao @ Techware

#16


呵呵,来晚了,确实如上面分析的,
是应用加载了一个驱动,通过驱动访问物理内存的。:P
做在一起,主要是考虑使用方便,不过,只支持ARM平台了,
在CE6.0的模拟器中测试没有问题。

#17


引用 2 楼 paul_chao 的回复:
哇, 300 分 

快回 

写只 driver, 在 XXX_IoControl 加入一些 Code, 用 ActivateDeviecEx 将其载入 Kernel space. 

Application 可以透过 DeviceIoControl 与该 driver 沟通, 由该 driver 去呼叫 MmMapIoSpace 并读值後传回即可. 

Paul, Chao @ Techware 


事实就是这样的,楼主可以给paul_chao分了。^_^

#18


原来还留了一手!

#19


引用 2 楼 paul_chao 的回复:
哇, 300 分 

快回 

写只 driver, 在 XXX_IoControl 加入一些 Code, 用 ActivateDeviecEx 将其载入 Kernel space. 

Application 可以透过 DeviceIoControl 与该 driver 沟通, 由该 driver 去呼叫 MmMapIoSpace 并读值後传回即可. 

Paul, Chao @ Techware 


给分,给分。!哈哈。

#20


mark~
学习下

#21


引用 15 楼 paul_chao 的回复:
还真的是执行後, \Windows 多了一个 MEMRaw.dll, 要怎麽把 .dll 档包进 .exe 档呢?? 直接将 raw data (like as bmp2c) 存入 .exe 的 static variable 中, 再用 WriteFile 写入 \Windows 中吗?? 相当有趣的方法. 

之前这个工具我的作法是写成 .cpl 的格式, 另外再写一个 .dll 的档案, 下次有空再改版时也用这方法来包进去成一个档案. 

Paul, Chao @ Techware 

估计还真是用writefile的方法啊hehe,有空按照达人的思路试试

#22


引用 15 楼 paul_chao 的回复:
还真的是执行後, \Windows 多了一个 MEMRaw.dll, 要怎麽把 .dll 档包进 .exe 档呢?? 直接将 raw data (like as bmp2c) 存入 .exe 的 static variable 中, 再用 WriteFile 写入 \Windows 中吗?? 相当有趣的方法. 

之前这个工具我的作法是写成 .cpl 的格式, 另外再写一个 .dll 的档案, 下次有空再改版时也用这方法来包进去成一个档案. 

Paul, Chao @ Techware 

估计还真是用writefile的方法啊hehe,有空按照达人的思路试试

#23


sunrain_hjb 老兄, 不知道您老也在这, 那真是鲁班门前弄大斧, 关公面前耍大刀, 失敬, 失敬

gooogleman, 这分数应给原作者吧, 以表彰其贡献, 我们在後面, 只是锦上添花而已.

Paul, Chao @ Techware

#24


友情up

#25


mark

#26


应用程序通过createfile打开驱动,然后通过deviceiocontrol发指令给驱动,让驱动完成任务后将所需的参数再回传给应用。这种方式,CE5和CE6应该都是通用的吧!!这也是应用直接操作驱动从而操作硬件啊!

#27


该回复于2009-06-22 11:36:38被版主删除

#28


友情up

#29


引用 23 楼 paul_chao 的回复:
sunrain_hjb 老兄, 不知道您老也在这, 那真是鲁班门前弄大斧, 关公面前耍大刀, 失敬, 失敬 

gooogleman, 这分数应给原作者吧, 以表彰其贡献, 我们在後面, 只是锦上添花而已. 

Paul, Chao @ Techware 


都有分,都有。

感觉你们实在是太厉害了。我等后辈学习ing

#30


果然都是牛人啊,我最怕弄wince操作硬件的东西,相关的资料太少了,学习ing,以后还请各位前辈多多指教啊

#31


都是牛人,什么时候能达到你们的水平啊

#32


掏出IDA,逆了不就完了嘛,非那事干嘛!

#33


UPX 3.03压缩的,解压之后用IDA打开,辅助Resource Hacker。一目了然。
googleman,我恐怕你要失望了。这个软件仍然是用驱动的,这个软件把驱动作为资源打包到PE里面去了。
首先,注意以下特征:

.data:00028490 aMemdrv         unicode 0, <MEMDRV>,0   ; DATA XREF: .text:off_11A2Co
.data:0002849E                 ALIGN 0x10
.data:000284A0 aOpenDrvfileErr DCW 0xD                 ; DATA XREF: .text:off_11A30o
.data:000284A0                 DCW 0xA
.data:000284A0                 unicode 0, <Open drvfile Error %d>,0
.data:000284D0 aWindowsMemraw_ unicode 0, <\windows\memraw.dll>,0
.data:000284D0                                         ; DATA XREF: .text:off_11A34o
.data:000284F8 aMem1           unicode 0, <MEM1:>,0    ; DATA XREF: .text:off_11E28o
.data:00028504 aOrder          unicode 0, <Order>,0    ; DATA XREF: .text:off_11E2Co
.data:00028510 aDll            unicode 0, <Dll>,0      ; DATA XREF: .text:off_11E30o
.data:00028518 aMemraw_dll     unicode 0, <MEMRaw.dll>,0 ; DATA XREF: .text:off_11E34o
.data:0002852E                 ALIGN 0x10
.data:00028530 aPrefix         unicode 0, <Prefix>,0   ; DATA XREF: .text:off_11E38o
.data:0002853E                 ALIGN 0x10
.data:00028540 aMem            unicode 0, <MEM>,0      ; DATA XREF: .text:off_11E3Co
.data:00028548 aIndex          unicode 0, <Index>,0    ; DATA XREF: .text:off_11E40o
.data:00028554 aDriversMemdrv  unicode 0,  <Drivers\MEMDrv>,0 ; DATA XREF: .text:off_11E48o
.data:00028572                 ALIGN 8

其次,用Resource Hacker打开,证实了我的猜测。有个命名为memdrv的资源,首字节是'MZ',这不用多说了吧。

#34


你看不到驱动,不代表它不存在。这种把驱动打包到PE里面在桌面上是老掉牙的技术了,很早以前Sysinternals的工具就一直这么干的。FindResource,extract到disk上,然后createfile,看起来就显得很干净,就一个EXE文件发布就可以了。

#35


wince6.0 下如何编写能使直接访问硬件的软件?请问CE6 下怎么实现OpenThread 这个函数??
CE5 中有牛人把thread伪装成Process 然后用OpenProcess来实现。。。

#36


一不做二不休,再看看提取出来的memdrv.dll都导出了什么:
MEM_Close
MEM_Deinit
MEM_IOControl
MEM_Init
MEM_Open
MEM_PowerDown
MEM_PowerUp
MEM_Read
MEM_Seek
MEM_Write

接着再看看它导入了什么:
MmMapIoSpace
MmUnmapIoSpace
LocalFree

#37


我说怎么可能应用层直接访问物理地址呢。还是有驱动的。

#38


高手真TM多,观摩学习一下。

#39


引用 36 楼 codewarrior 的回复:
一不做二不休,再看看提取出来的memdrv.dll都导出了什么: 
MEM_Close 
MEM_Deinit 
MEM_IOControl 
MEM_Init 
MEM_Open 
MEM_PowerDown 
MEM_PowerUp 
MEM_Read 
MEM_Seek 
MEM_Write 

接着再看看它导入了什么: 
MmMapIoSpace 
MmUnmapIoSpace 
LocalFree


codewarrior 前辈,赞一个。

我使用IDA怎么分离不出来呢。估计我没有解压。

学习了。

#40


友情up

#41


引用 23 楼 paul_chao 的回复:
sunrain_hjb 老兄, 不知道您老也在这, 那真是鲁班门前弄大斧, 关公面前耍大刀, 失敬, 失敬 

gooogleman, 这分数应给原作者吧, 以表彰其贡献, 我们在後面, 只是锦上添花而已. 

Paul, Chao @ Techware 


Paul老兄,有些夸张了哦,^_^
楼主的问题是你解决的,分数应该给你,我只是把问题引出来了。

刚刚看了一下,基本上所有的问题都被解决了,楼主可以揭帖啦。

#42


好,结贴。

#43


引用 39 楼 gooogleman 的回复:
引用 36 楼 codewarrior 的回复:
一不做二不休,再看看提取出来的memdrv.dll都导出了什么: 
MEM_Close 
MEM_Deinit 
MEM_IOControl 
MEM_Init 
MEM_Open 
MEM_PowerDown 
MEM_PowerUp 
MEM_Read 
MEM_Seek 
MEM_Write 

接着再看看它导入了什么: 
MmMapIoSpace 
MmUnmapIoSpace 
LocalFree 



codewarrior 前辈,赞一个。 

我使用IDA怎么分离不出来呢。估计我没有解压。 

学习了。

IDA直接装入会告诉你很多区段无法反汇编,这时候就要考虑是否加壳了,用pe检测工具检查看看有没有加壳,找到upx的特征字符,直接用upx -d解了就成了。

#44


高手真是牛

#45


  lalal

#46


Mark!

#47


我什么也不懂啊 什么kenel模式?
真的要学习的好多啊。

#48


不会啊哈,,顶下

#49


好强大啊,学习学习!

#50


好好好