|
初学C++,用vs2008写的,请高人指点!
头文件包含下面加上using namespace std; 表示使用std这个名称空间 下面函数好像的没有错吧 main前面的void表示没有返回值,就不需要return 了 如果main前用int的话,表示返回整型数,像二楼说的那样,要加return 0; |
|
|
|
问个比较白的问题,如何在一个已知的内存地址处下载断点?
直接在要下断点的地方F2 |
|
IMAGE_IMPORT_BY_NAME结构小疑问
后面Unmap中U的ASCLL码怎么可能是02呢? 这个问号在这就占两个字节,从55 6E开始才是函数名称 你多选中了一个字节 你数下,后面对应的注释字符这行只有15个,其中?占两个字节,就是hint |
|
|
|
|
|
如何根据函数地址获取函数名?
反编译后的程序,比如在IDA中,一般函数名称都用sub_004012A4之类的名称来表示,后面的004012A4就是函数在内存中的虚拟地址。 无法知道之前比如用C语言写的程序时的函数名称 函数名称只是提供一种地址映射机制,从而找到一段代码的地址来执行它,和具体起什么名字没有关系 当然也可以通过分析函数的作用,自己把sub_00401234换成有实际意义的名称,便于分析。 如果是系统ring0级的函数,相应的DLL动态链接库中有函数名称和地址的映射关系。 只是个人理解。 |
|
PE文件结构
大哥!看清楚了,DLL信息不在块表和块中间,是在rdata块中,图上标的很明显啊 |
|
|
|
|
|
|
|
import REC修复转存文件显示“没有足够空间”
我用OD dump出来的就是notepad.upx.exe 教程上说找到OEP后,先用OD dump,然后再打开import REC修复输入表 我是先把notepad.upx.exe打开,然后打开OD,选择File->attach,在进程表中选中notepad.upx.exe这个进程,然后再打开import REC选择notepad.upx.exe就出现上面的情况 但是import REC直接选择notepad.upx.exe没有经过OD啊,我试了下不用OD,直接打开notepad.upx.exe,用import REC选择notepad.upx.exe,一样的效果 |
|
|
|
一个不知道怎么前进的新手,特来请教。
http://bbs.pediy.com/showthread.php?t=31840 看雪老大的这个帖子里面写的很详细啊 我也是菜鸟,汇编绝对没必要每本书都看,看一本足够了,书里的例子动手实践一下,基本半月一个月就搞定了 接着看Windows API,然后直接看《加密与解密》这本书基本就没问题了 我是汇编看完就直接看《加密与解密》了,也基本上马马虎虎能看懂 现在才回头看Windows API的 绝对没必要在一个环节上钻死胡同,先整体大致有个了解,很快的 然后遇到细节不会的东西,再回去翻书,查资料 加油啊! |
|
软件有反调试
试了下,用IDA打开很正常啊 |
|
关于BPX MessageBox的问题
从Windows 1.0到Windows 3.1的16位Windows中,MessageBox函数位于动态链接库USER.EXE。在Windows 3.1软件开发套件的WINDOWS.H中,MessageBox函数定义如下: int WINAPI MessageBox (HWND, LPCSTR, LPCSTR, UINT) ; 注意,函数的第二个、第三个参数是指向常数字符串的指针。当编译连结一个Win16程序时,Windows并不处理MessageBox呼叫。程序.EXE文件中的表格,允许Windows将该程序的呼叫与USER中的MessageBox函数动态链接起来。 32位的Windows(即所有版本的Windows NT,以及Windows 95和Windows 98)除了含有与16位兼容的USER.EXE以外,还含有一个称为USER32.DLL的动态链接库,该动态链接库含有32位使用者接口函数的进入点,包括32位的MessageBox。 这就是Windows支持Unicode的关键:在USER32.DLL中,没有32位MessageBox函数的进入点。实际上,有两个进入点,一个名为MessageBoxA(ASCII版),另一个名为MessageBoxW(宽字符版)。用字符串作参数的每个Win32函数都在操作系统中有两个进入点!幸运的是,您通常不必关心这个问题,程序中只需使用MessageBox。与TCHAR表头文件一样,每个Windows表头文件都有我们需要的技巧。 下面是MessageBoxA在WINUSER.H中定义的方法。这与MessageBox早期的定义很相似: WINUSERAPI int WINAPI MessageBoxA (HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) ; 下面是MessageBoxW: WINUSERAPI int WINAPI MessageBoxW (HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType) ; 注意,MessageBoxW函数的第二个和第三个参数是指向宽字符的指针。 如果需要同时使用并分别匹配ASCII和宽字符函数呼叫,那么您可在Windows程序中明确地使用MessageBoxA和MessageBoxW函数。但大多数程序写作者将继续使用MessageBox。根据是否定义了UNICODE,MessageBox将与MessageBoxA或MessageBoxW一样。在WINUSER.H中完成这一技巧时,程序相当琐碎: #ifdef UNICODE #define MessageBox MessageBoxW #else #define MessageBox MessageBoxA #endif 这样,如果定义了UNICODE标识符,那么程序中所有的MessageBox函数呼叫实际上就是MessageBoxW函数;否则,就是MessageBoxA函数。 执行该程序时,Windows将程序中不同的函数呼叫与不同的Windows动态链接库的进入点连结。虽然只有少数例外,但是,在Windows 98中不能执行Unicode版的Windows函数。虽然这些函数有进入点,但通常返回错误代码。应用程序注意这些返回的错误并采取一些合理的动作。 -------------------- 今天看Windows程序设计,理解了上面这些。 可还是不理解BPX MessageBox 内存中是已经编译链接过的程序吧,那么就是说,程序中的MessageBox已经被替换成了MessageBoxA或者MessageBoxW了,所以只能用BPX MessageBoxA或者BPX MessageBoxW,而不能用BPX MessageBox,是这个意思么? 求高手指点,谢谢! |
|
[讨论]地址转换和PE结构
哦,好像明白泥巴的意思了,我举的是两个例子,下面的那个例子RVA不是针对上面说的,可能造成误解了,我改下 |
|
[讨论]地址转换和PE结构
我不太明白你的意思,是说“虚拟地址 = 403010H”这句话有问题么? RVA(相对虚拟地址)= 虚拟地址 - 基地址 在这里就是 RVA(3010H) = 虚拟地址(403010H) - 基地址(400000H) 我是这样理解的,不知道有问题么?我刚开始学,见笑了。。。 |
操作理由
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 }}
勋章
兑换勋章
证书
证书查询 >
能力值