以前在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
快回
写只 driver, 在 XXX_IoControl 加入一些 Code, 用 ActivateDeviecEx 将其载入 Kernel space.
Application 可以透过 DeviceIoControl 与该 driver 沟通, 由该 driver 去呼叫 MmMapIoSpace 并读值後传回即可.
Paul, Chao @ Techware
#3
哈哈,Paul, Chao 老兄,看来这300分你拿不到了。
因为我要求应用程序直接访问硬件,不能使用驱动的。
如果使用驱动,俺们早就做了。
#4
快;来啊。千万不要让我无满意结贴啊。
#5
我觉得你们都搞错了。
别人做出来了!只是没有源码!
看这个链接,你看看神人的牛技术吧。
http://www.cnblogs.com/we-hjb/archive/2009/03/08/1406257.html各位请看这个牛人写的。我正用着,不知道他怎么搞出来的。
别人做出来了!只是没有源码!
看这个链接,你看看神人的牛技术吧。
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);//释放内存
PHYSICAL_ADDRESS PortAddress = {0x56000060, 0};
gpio_base =(unsigned int *)MmMapIoSpace( PortAddress, 0x04,FALSE ); // 获得内存
*gpio_base = 0x0585ff87; // 直接访问硬件
MmUnmapIoSpace(gpio_base,0x04);//释放内存
#7
这个在wince5.0下可行,到了wince6.0 就不行了。哈哈
#8
会提示分配内存失败在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和函数,通过编写特有的转接服务,让内核态驱动提供给用户态使用。值得注意的是,通过内核态驱动来公开这些功能,实际上是公开了微软特意封装的内容,最好不要这样使用。
下面是我写过的一段内容,参考一下吧:
有些函数在用户态是必须注意使用的,如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
晕,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.
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真太厉害了,佩服!
我等还在怀疑的时候,你老人家已经在玩的很爽了。
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
这不早说了吗? 我也是想了好久, 一直找不出更好的方法. 还是各位先进另有捷径, 大家一起来讨论看看
只是他一个 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
之前这个工具我的作法是写成 .cpl 的格式, 另外再写一个 .dll 的档案, 下次有空再改版时也用这方法来包进去成一个档案.
Paul, Chao @ Techware
#16
呵呵,来晚了,确实如上面分析的,
是应用加载了一个驱动,通过驱动访问物理内存的。:P
做在一起,主要是考虑使用方便,不过,只支持ARM平台了,
在CE6.0的模拟器中测试没有问题。
是应用加载了一个驱动,通过驱动访问物理内存的。:P
做在一起,主要是考虑使用方便,不过,只支持ARM平台了,
在CE6.0的模拟器中测试没有问题。
#17
事实就是这样的,楼主可以给paul_chao分了。^_^
#18
原来还留了一手!
#19
给分,给分。!哈哈。
#20
mark~
学习下
学习下
#21
估计还真是用writefile的方法啊hehe,有空按照达人的思路试试
#22
估计还真是用writefile的方法啊hehe,有空按照达人的思路试试
#23
sunrain_hjb 老兄, 不知道您老也在这, 那真是鲁班门前弄大斧, 关公面前耍大刀, 失敬, 失敬
gooogleman, 这分数应给原作者吧, 以表彰其贡献, 我们在後面, 只是锦上添花而已.
Paul, Chao @ Techware
gooogleman, 这分数应给原作者吧, 以表彰其贡献, 我们在後面, 只是锦上添花而已.
Paul, Chao @ Techware
#24
友情up
#25
mark
#26
应用程序通过createfile打开驱动,然后通过deviceiocontrol发指令给驱动,让驱动完成任务后将所需的参数再回传给应用。这种方式,CE5和CE6应该都是通用的吧!!这也是应用直接操作驱动从而操作硬件啊!
#27
#28
友情up
#29
都有分,都有。
感觉你们实在是太厉害了。我等后辈学习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',这不用多说了吧。
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
请问CE6 下怎么实现OpenThread 这个函数??
CE5 中有牛人把thread伪装成Process 然后用OpenProcess来实现。。。
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
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
codewarrior 前辈,赞一个。
我使用IDA怎么分离不出来呢。估计我没有解压。
学习了。
#40
友情up
#41
Paul老兄,有些夸张了哦,^_^
楼主的问题是你解决的,分数应该给你,我只是把问题引出来了。
刚刚看了一下,基本上所有的问题都被解决了,楼主可以揭帖啦。
#42
好,结贴。
#43
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
快回
写只 driver, 在 XXX_IoControl 加入一些 Code, 用 ActivateDeviecEx 将其载入 Kernel space.
Application 可以透过 DeviceIoControl 与该 driver 沟通, 由该 driver 去呼叫 MmMapIoSpace 并读值後传回即可.
Paul, Chao @ Techware
#3
哈哈,Paul, Chao 老兄,看来这300分你拿不到了。
因为我要求应用程序直接访问硬件,不能使用驱动的。
如果使用驱动,俺们早就做了。
#4
快;来啊。千万不要让我无满意结贴啊。
#5
我觉得你们都搞错了。
别人做出来了!只是没有源码!
看这个链接,你看看神人的牛技术吧。
http://www.cnblogs.com/we-hjb/archive/2009/03/08/1406257.html各位请看这个牛人写的。我正用着,不知道他怎么搞出来的。
别人做出来了!只是没有源码!
看这个链接,你看看神人的牛技术吧。
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);//释放内存
PHYSICAL_ADDRESS PortAddress = {0x56000060, 0};
gpio_base =(unsigned int *)MmMapIoSpace( PortAddress, 0x04,FALSE ); // 获得内存
*gpio_base = 0x0585ff87; // 直接访问硬件
MmUnmapIoSpace(gpio_base,0x04);//释放内存
#7
这个在wince5.0下可行,到了wince6.0 就不行了。哈哈
#8
会提示分配内存失败在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和函数,通过编写特有的转接服务,让内核态驱动提供给用户态使用。值得注意的是,通过内核态驱动来公开这些功能,实际上是公开了微软特意封装的内容,最好不要这样使用。
下面是我写过的一段内容,参考一下吧:
有些函数在用户态是必须注意使用的,如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
晕,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.
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真太厉害了,佩服!
我等还在怀疑的时候,你老人家已经在玩的很爽了。
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
这不早说了吗? 我也是想了好久, 一直找不出更好的方法. 还是各位先进另有捷径, 大家一起来讨论看看
只是他一个 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
之前这个工具我的作法是写成 .cpl 的格式, 另外再写一个 .dll 的档案, 下次有空再改版时也用这方法来包进去成一个档案.
Paul, Chao @ Techware
#16
呵呵,来晚了,确实如上面分析的,
是应用加载了一个驱动,通过驱动访问物理内存的。:P
做在一起,主要是考虑使用方便,不过,只支持ARM平台了,
在CE6.0的模拟器中测试没有问题。
是应用加载了一个驱动,通过驱动访问物理内存的。:P
做在一起,主要是考虑使用方便,不过,只支持ARM平台了,
在CE6.0的模拟器中测试没有问题。
#17
事实就是这样的,楼主可以给paul_chao分了。^_^
#18
原来还留了一手!
#19
给分,给分。!哈哈。
#20
mark~
学习下
学习下
#21
估计还真是用writefile的方法啊hehe,有空按照达人的思路试试
#22
估计还真是用writefile的方法啊hehe,有空按照达人的思路试试
#23
sunrain_hjb 老兄, 不知道您老也在这, 那真是鲁班门前弄大斧, 关公面前耍大刀, 失敬, 失敬
gooogleman, 这分数应给原作者吧, 以表彰其贡献, 我们在後面, 只是锦上添花而已.
Paul, Chao @ Techware
gooogleman, 这分数应给原作者吧, 以表彰其贡献, 我们在後面, 只是锦上添花而已.
Paul, Chao @ Techware
#24
友情up
#25
mark
#26
应用程序通过createfile打开驱动,然后通过deviceiocontrol发指令给驱动,让驱动完成任务后将所需的参数再回传给应用。这种方式,CE5和CE6应该都是通用的吧!!这也是应用直接操作驱动从而操作硬件啊!
#27
#28
友情up
#29
都有分,都有。
感觉你们实在是太厉害了。我等后辈学习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',这不用多说了吧。
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
请问CE6 下怎么实现OpenThread 这个函数??
CE5 中有牛人把thread伪装成Process 然后用OpenProcess来实现。。。
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
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
codewarrior 前辈,赞一个。
我使用IDA怎么分离不出来呢。估计我没有解压。
学习了。
#40
友情up
#41
Paul老兄,有些夸张了哦,^_^
楼主的问题是你解决的,分数应该给你,我只是把问题引出来了。
刚刚看了一下,基本上所有的问题都被解决了,楼主可以揭帖啦。
#42
好,结贴。
#43
IDA直接装入会告诉你很多区段无法反汇编,这时候就要考虑是否加壳了,用pe检测工具检查看看有没有加壳,找到upx的特征字符,直接用upx -d解了就成了。
#44
高手真是牛
#45
lalal
#46
Mark!
#47
我什么也不懂啊 什么kenel模式?
真的要学习的好多啊。
真的要学习的好多啊。
#48
不会啊哈,,顶下
#49
好强大啊,学习学习!
#50
好好好