|
|
|
|
|
[求助]如何使用VB读取串口硬盘的物理序列号?
用scsi方法来读。 大致步骤是这样几个API sprintf (driveName, "\\\\.\\Scsi%d:", controller); // Windows NT, Windows 2000, any rights should do hScsiDriveIOCTL = CreateFile (driveName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); DeviceIoControl (hScsiDriveIOCTL, IOCTL_SCSI_MINIPORT, &inBuffer, sizeof (inBuffer), &outBuffer, sizeof (outBuffer), &dummy, NULL) 关于 IOCTL_SCSI_MINIPORT及缓冲区数据的结构,自己查。 |
|
[求助]修改PE文件改EXE的最大化,最小化等界面显示
这个情况很复杂,不是简单几句话就说清楚的。如果你写过win32窗口程序,就应该知道了。 情况1.程序主界面是对话框 一般对话框程序,窗口的大小,有没有最大化最小化按钮等,是在对话框资源中,可以通过资源编辑器找到 情况2.程序主界面是自己创建的窗口 就是说程序自己注册窗口类,然后创建窗口,自己提供窗口过程。那么窗口大小、位置等信息,是调用创建窗口的API时指定的,还可以通过调用其它API来改变窗口的大小位置,如MoveWindow函数等。 情况3.程序是MFC单文档窗口,或多文档窗口。 与情况2类似,但不同的是一般用户代码调用的API是经过MFC包装的,如CWnd::Move()等,不过它内部最终还是通过调用SDK API实现的。 除了对话框可以用资源修改器修改,但修改不当可能造成程序错误,其它情况都需要patch程序的代码。 我向来强调搞逆向分析,最基本的编程基础是必要的。这个问题对于win32程序员来说,是非常简单非常基础的事情,其实。 |
|
[求助]请教:地址换算问题
你知道TurboDebugger吗??? 如果你是从DOS时代走过来的,一定不会陌生。 16位程序,当然要用专用的16位调试器来调试。 OD是专门调试32位程序的,它的反汇编引擎都只是针对32位的。 而且,TD和OD的界面、热键都很相似。所以即使没用过,也会很快上手的。 TurboDebugger是宝蓝TurboASM中所带的调试器,注意它是DOS时代的东西。 |
|
[求助]用od调试dnf
好心的忠告,没有恶意:新手先从简单的学起,内核调试需要的技术可不是会用个调试器,懂一点汇编指令就能完成的。 |
|
[求助]修改程序资源
要添加如此复杂的一个COM组件,可不是修改个资源就能完成的。 况且控件根本就不是资源。 资源只是程序中要用到的数据,像字串,位图,图标等。 你把它想得太简单了。 先不说你逆向分析的功底如何,单就是com组件的开发,就是很深的东西,你要不懂com的调用规范,不太可能完成你说的功能。 学习吧 |
|
[讨论]{已解决}C语言初始化话的问题,问号的都是不明白,麻烦大家了
0xCCCCCCCC是示所有未初始化的变量由编译器提供的用来辅助调试的默认值。 不管变量是值类型还是指针类型。 如果你真的敢引用没有赋值的指针,那么程序会异常退出(运行时刻)或异常被调试器捕获(调试时刻) 如果你非要知道0xCCCCCCCC处有什么内容,可以告诉你,一般那里什么都没有。 这个地址位于内核空间,但一般情况下内核空间是从低端和高端两边开始分配的,也就是说0x80000000往上的一段空间和0xC0000000往下的一段内核空间是被使用的。可以用冰刃查看一下内核模块,从他们的基址就知道一些端倪了。 关于NT内核空间的布局,可以看看相关资料,我说得也不一定对。 系统引导时,一些必不可少的核心模块加载到内核低端,而之后加载模块,如设备驱动等,則从高端开始分配内存。而像0xCCCCCCCC这样的地址,一般都是没有映射过的内存空间。 还有,0xCC是DEBUG模式下编译才会有的,在release模式下,编译器不会对局部变量空间进行填充,所以没有初始化的变量,一般都认为初始值是“随机值”,准确地说是未知的值,切不可以为是0xCCCCCCCC。 而且,写一般的应用程序,不用跟内核空间打交道的。 只有做内核开发,如驱动、过滤等,才需要用到内核的知识。 |
|
OD有没有调试ARM语言的插件
ARM不光有Linux支持,同样有 WindowsCE.net支持的。 而WindowsCE上的应用程序,一般是用EVC++开发的,基本Win32平台的东西稍做修改就能移植了。 ARM是硬件平台,而Linux与Windows,以及其它嵌入式操作系统是软件系统,硬件是不限定软件的。 我曾经帮人看过一个EVC++的图形库,结果没有ARM的调试器,只好用PC平台Win32的那个库定位关键点,然后直接用ARM的反汇编器进行静态分析,不过还好,只需要改一条条件分支指令,最后算是搞定了。 |
|
[求助]关于网吧的drvanti.exe
drvanti == driver anti 这个程序只是个界面,真正实现功能的是加载到内核中的驱动程序。 要搞掉一个驱动,不是不可能,但不容易。 至少ring3的调试器是没有办法了。 你必须自己加载ring0代码,才有搞掉的可能性。 如果楼主不是内核高手,我的建议就是换个网吧。 完全没有恶意,不要误会。 |
|
[求助]如何在附加数据中下断点?
脱壳了,这样啊,我误解了。 数据断点只有在数据被访问时会生效。如果你下断点的数据在程序的执行路径中要就不去访问,例如有一条if语句总是假而跳过了访问被下断点的数据,那么这个断点是不会生效的。 一般寻找关键点的方法是使用api断点,消息断点,以及“F12大法”(我起的名字),或者使用专门的分析软件如Dede,VB decompiler等找到相应的函数地址,然后去那里直接下断分析。 直接从数据入手,一般是没有办法的办法。在内存中或文件中暴力搜索数据,一般是字串,然后下内存断点,这样的方法都是没办法的办法 因为内存访问不具有确定性,你无法确定所找到的数据是在什么地方访问的,很多情况下内存断点会断在系统DLL的领空,就是因为程序有可能将变量或指针作为参数来调用系统API,这样内存断点常常会更麻烦而不是更简单。 还有一些程序,采用异步方式访问数据,比如判断注册码错误之后,将一个字串的指针当做参数,发消息给另外的线程,或直接创建新的线程,由另外的线程来显示消息,所以你断下来后,只看到显示消息的代码,而判断正确与否的代码离着十万八千里。 其实多动动脑子,多数程序都可以用API断点来寻找关键点的。 |
|
[讨论][求助]一个整数溢出的问题
lea指令是编译器用来计算某些算术表达式的,得到的结果不是用来当指针的。 一般,当乘数是2的幂时,编译器会用移位指令, 而有些数乘如乘以5,乘以3,编译器会用这样的指令,lea eax, [eax+4*eax], lea eax,[eax+2*eax]来实现,这样比乘法指令要更好一些。 而你给的这个,就是计算 eax *2 + 2 这个表达式的。 |
|
[求助]挂钩一进程的函数后 的返回问题
你用调试器跟踪一下,我觉得你的写法,最终编译器的理解和你的愿意有区别。 你需要在调试器中看看call yy 最后生成的机器码是不是 e8 yy 如果你是用 #define yy的方式定义的yy的值的话,我想最终编译的机器码将不会是 e8 yy这样的,很有可能编译器会把yy的值当作一个地址值,然后重新生成指令,比如假设 yy = 0x456789,编译器可能是生成一条CALL向地址0x456789的指令,而不是直接将yy的值写入机器码。 在VC6的调试环境中按ALT+8可以打开反汇编窗口,你可以试试。 以上是我的想法,仅供参考,有错莫怪,欢迎指正。 比较好一些的方法是用一个函数指针来调用,比较保险 |
操作理由
RANk
{{ user_info.golds == '' ? 0 : user_info.golds }}
雪币
{{ experience }}
课程经验
{{ score }}
学习收益
{{study_duration_fmt}}
学习时长
基本信息
荣誉称号:
{{ honorary_title }}
能力排名:
No.{{ rank_num }}
等 级:
LV{{ rank_lv-100 }}
活跃值:
在线值:
浏览人数:{{ visits }}
最近活跃:{{ last_active_time }}
注册时间:{{ user_info.create_date_jsonfmt }}
勋章
兑换勋章
证书
证书查询 >
能力值