COM 知识点摘要

IUnknown接口是COM的核心,所有其他的COM接口都必须从IUnknown继承。
IUnknown实质上就是一个含有纯虚函数的抽象类。

class IUnknown{  
public:  
     virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv) = 0;  
     virtual ULONG __stdcall AddRef() = 0;  
     virtual ULONG __stdcall Release() = 0;  
}; 

COM客户程序要使用COM对象是通过COM库创建而来的,而实际上COM库是调用COM对象的类厂来创建的。COM类厂对象也是一个COM对象,所以它也从IUnknow继承而来,而它又支持IClassFactory接口:

class IClassFactory:public IUnknow  
{  
    public:  
        virtual HRESULT CreateInstance(IUnkonwn* pUnkOuter, REFIID iid, void** ppObject)=0;  
        virtual HRESULT LockServer(BOOL fLock)=0;  
}; 

CreateInstance是构造COM对象的函数,通过传入接口的IID,从ppObject输出COM接口指针,而pUnkOuter一般设为NULL,该参数在聚合时起作用。
LockServer是用来控制COM类厂的生命周期的函数,将fLock设为TRUE后,即使组件程序中所有COM对象已释放了,该类厂指针也会一直保存并且有效,当不再需要的时候设为FALSE即可。

若要使用类厂对象去创建COM对象,首先得创建类厂对象,可以使用库函数CoGetClassObject来创建COM类的类厂,若找到的COM对象是进程内组件,则使用DLL导出函数DllGetClassObject函数创建类厂,然后将对象指针传出。… Read More

WordPress 首页文章内容长度控制

方法1:
更改 wp-content/themes/模板/index.php 找到

the_content('阅读全文');

更改为:

if (!is_single()){
the_excerpt();
}else{
the_content('阅读全文');
}

更改 wp-content/themes/模板/functions.php 在最后加入以下代码

function new_excerpt_length($length) {
return 500;
}
add_filter('excerpt_length', 'new_excerpt_length');

function new_excerpt_more($more) {
global $post;
return '<a href="'.get_permalink($post->ID). '"> [阅读全文]</a>';
}
add_filter('excerpt_more', 'new_excerpt_more');

这样更改后的首页文章没有了任何格式, 可以配合如 Advanced Excerpt 这类摘要插件
显示完整信息… Read More

IDA7 暗黑配色

[DISASM]
000000 //
aaaaaa //Default color
f3c5ff //Regular comment
7e6082 //Repeatable comment
666666 //Automatic comment
ffffff //Instruction
b9ebeb //Dummy Data Name
b9ebeb //Regular Data Name
bbecff //Demangled Name
c0c0c0 //Punctuation
00d269 //Char constant in instruction
00ff00 //String constant in instruction
3250d2 //Numeric constant in instruction
4646ff //Void operand
7faaff //Code … Read More

IDA 插件

IFL, the Interactive Functions List  改进的函数列表插件
https://github.com/hasherezade/ida_ifl
配合IDA 暗色主题可修改颜色为

_COLOR_HILIGHT_FUNC = 0x663333 #FFDDBB # BBGGRR
_COLOR_HILIGHT_REFTO = 0x336633 #BBFFBB
_COLOR_HILIGHT_REFFROM = 0x663366 #DDBBFF

def _displayBackground(self, row, col):
func_info = self.function_info_list[row]
if col == self.COL_START or col == self.COL_END:
return QtGui.QColor("darkcyan")
if col == self.COL_NAME:
if func_info.is_import:
return QtGui.QColor("darkred")
return QtGui.QColor("sienna")

Read More

Arm汇编中!和^的作用

如果加上!,表明先根据寻址规则修改寄存器,然后根据寄存器中的值访问内存;如果不加!,表示直接根据寻址规则访问内存。

看个例子

ldmia r0, {r2-r3}  把r0指向的内存中的数据读入到r2中,然后内存地址+4,
再将+4后地址中的数据读入到r3中。指令执行完毕后r0中的值不变。
ldmia r0!, {r2-r3}  把r0指向的内存中的数据读入到r2中,然后内存地址+4,
再将+4后地址中的数据读入到r3中。指令执行完毕后r0中的值变化(为r3内容的地址)。

感叹号的作用就是r0的值在ldm过程中发生的增加或者减小最后写会到r0中。

^的作用

ldmfd sp!, {r0-r6, pc}  (操作了八个寄存器)
ldmfd sp!, {r0-r6, pc}^ (此项操作实际操作了9个寄存器,spsr->cpsr)
^:在目标寄存器中有pc时,会同时将spsr写入到cpsr,一般用在异常返回的时候。… Read More

ARM 堆栈方式

满堆栈(Full Stack,“F”)是指Sp指向堆栈最后一个压入的数据(也就是sp指向堆栈最后一个数据项位置)。

空堆栈(Empty Stack,"E")是指sp指向堆栈下一个将要放入数据的空位置时(也就是说sp指向堆栈最后一个数据项的下一个位置)。

存储器堆栈可以分为两种:

一种是向上生长,就是向着高地址方向生长,称为递增堆栈。
一种是向下生长,就是向着低地址方向生长,称为递减堆栈。

这样,就有四种组合:满递增(FA)、空递增(EA)、满递减(FD)、空递减(ED)。

入栈规律:

(1)满堆栈操作先调整SP,然后存入数据。

(2)空堆栈操作先存入数据,然后调整SP。

(3)递增堆栈调整SP时,执行SP=SP+4

(4)递减堆栈调整SP时,执行SP=SP-4

出栈规律 正好与入栈相反,也就是入栈的逆操作。

(1)空堆栈操作先调整SP,然后存入数据。

(2)满堆栈操作先存入数据,然后调整SP。

(3)递减堆栈调整SP时,执行SP=SP+4

(4)递增堆栈调整SP时,执行SP=SP-4

 

例1:

PRE
r1 = 0x00000002
r4 = 0x00000003
sp = 0x00080014

STMFD sp!, {r1, r4}

POST
r1 = 0X00000002
r4 = 0x00000003
sp = … Read More

IDA 中MFC导入符号名修复脚本

1) dumpbin /exports mfc100u.lib > mfc100u.def
2) using following regex: ^\s+(\d+)\s+([^\s]{1,})(.*) -> \2 @ \1 NONAME

从Def文件生成idc脚本, 进行重命名

https://pan.baidu.com/s/1dGkQc5V :  ee4b

压缩包中包含了 MFC70, 71, 80, 90, 100的相应脚本
如果需要其它的, 压缩包中有脚本可以生成

 

 … Read More