鸡肋
1. 整型转字符串,定长格式化16进制:
如:0X10 --> 0X00000010
1 sprintf(szData, "0x%08x", dwData);//注意中间的0,长度不足,用0填充
2. 字符串转整型
如:"1001" --> 9
1 int nDec =strtoul(szBin, NULL, 10);//10为进制,将字符串的内容转换为10进制整型。
3. STL常用容器简介
vector<T>:可自动增加容量的数组,使用连续的内存空间。支持[ ]操作符和vector.at( ),只能在vector的最后进行push、pop。
list<T>:双向链表,不使用连续的内存空间。不支持[ ]操作符和vector.at( ),可以很方便的在内部插入和删除,可以在两端进行push、pop。
deque<T>:双向队列,使用连续的内存空间,在功能上合并了vector和list。支持[ ]操作符和vector.at( ),可以很方便的在内部插入和删除,可以在两端进行push、pop。
map<K, T>:关联容器,map的数据结构采用红黑树实现,插入键的元素不允许重复,比较函数只对元素的键进行比较。
4. 调整寄存器,使其指向的内存为可写内存
如:调整 ESI 指向的内存为可写内存,可以利用类似的指令如:
1 push esp 2 pop esi 3 retn
但这些指令不是很好找,这里介绍一种变通的方法:
(1)找到 pop eax retn 指令,并让程序转入改位置执行。
(2)找到一条 pop esi retn 的指令,并保证在执行(1)中 pop eax 时它的地址位于栈顶,这样就可以把该地址放在eax中。
(3)找到 push esp jmp eax 指令,并转入执行。
栈布局:
EBP + 4 | [ POP EAX RETN ] //函数返回地址位置,执行 RETN 指令 |
EBP + 8 | [ POP ESI RETN ] |
EBP + C | [ PUSH ESP JMP EAX ] |
5. C语言,输出BSTR
1 BSTR strTmp = SysAllocString(L"Hello World!"); 2 wprintf(L"GetString : %s\r\n", strTmp); //注意字符串前面的L 3 SysFreeString(strTmp);